Skip to content

Move articles from an older system with a CSV export

Bring articles exported from another system into WordPress: choose the columns, keep slugs, dates and statuses, add categories and tags, and fix the time-zone shift.

  • WordPress
  • Difficulty: Intermediate
  • About 25 minutes
  • Updated October 13, 2026
On this page

What you will achieve. An export from an older system, with its own column names, dates without a time zone and status keys, becomes five WordPress posts that keep their web addresses, dates, statuses, categories and tags. On the way you meet the trap of every migration, dates that move by a few hours, and you fix it.

You need. A WordPress site that is connected, and the file 11-migration-export.csv. To see the time shift, your site's time zone must not be UTC: in our test it was set to Malta (Settings → General → Timezone). Difficulty: intermediate. Time: about 25 minutes.

The example data#

The file is what an older system might export: eight columns with that system's own names, and five articles.

Column Holds Example
id The old system's article number 101
post_name The name used in the web address welcome-aboard
post_title The title Welcome aboard
post_content The text, as HTML <p>Welcome to our little magazine…</p>
post_date When it was published, without a time zone 2019-05-02 08:15:00
post_status The old system's status key publish or draft
category_name One category name News
tag_list Tags separated by commas welcome,editorial

Four articles are publish and one, A draft we never finished, is draft. The categories are News, Stories and Boat care. The dates run from May 2019 to August 2020, in summer and in winter time.

Step 1: create the configuration#

  1. On the Dashboard, select New configuration, name it Migration and choose the file as the sample (create a configuration).
  2. Choose your WordPress site and Posts.
  3. Record ID column: the editor suggests id. Keep it. The old numbers identify the articles from now on, and that is what lets step 5 update the posts instead of creating them twice (choose the record ID).
  4. The column names are the old system's, not Content Uploader's, so choose the columns yourself: set Title to the Source column post_title, Slug to post_name, Content to post_content, Publish date to post_date and Status to post_status.
The Title, Slug, Status and Publish date fields, each set to a source column of the export
Each field takes its column: Title from post_title (1), Publish date from post_date (2), Status from post_status (3). Slug takes post_name.
  1. In Tags and categories, set Categories to Replace with configured terms and choose category_name as the category column. Set Tags the same way with the column tag_list.
  2. Save the configuration.

The status keys need no translating: publish and draft are what WordPress calls its statuses, and the cell is read as that status (status, dates and authors).

Step 2: drop the file and read the review#

Drop the file on the new card. The review says 5 new, 0 errors. Above the list, New on the site after publishing names the categories and tags your site does not have yet; the others already exist and will be reused (new categories and tags).

Open Welcome aboard. The item shows the Slug welcome-aboard, the Status Published and the Publish date 2019-05-02 08:15:00, which is the date as read from your file, before your site applies its time zone.

The first item of the review: slug, status, publish date, category and tags
The date is shown as it was read from the file (1). The site has not been asked yet.

Step 3: publish#

Tick I reviewed the changes above (the first file of a configuration always asks) and select Publish 5 changes. Publishing runs in the background (publish your changes).

Step 4: check WordPress, and see the shift#

On the site, Posts → All Posts has the five posts: four published and one draft, each with the address from post_name (the slug of Winter in the boatyard is winter-in-the-yard, as in the file, not made from the title), with the category from category_name and its tags.

Now look at the dates. A date without a time zone is read as UTC and WordPress shows it in the site's own zone. With the site on Malta time, which is two hours ahead of UTC in summer and one hour in winter, our five posts show:

Article In the file On the site
Welcome aboard 2019-05-02 08:15 2019-05-02 10:15
Our first passage to Gozo 2019-06-14 17:40 2019-06-14 19:40
Winter in the boatyard 2019-12-03 10:05 2019-12-03 11:05
A draft we never finished 2020-01-09 12:00 2020-01-09 13:00
Lessons from a bad forecast 2020-08-21 06:30 2020-08-21 08:30
The WordPress posts list: Welcome aboard, published 2019/05/02 at 10:15 am
The file said 08:15. The site shows 10:15 (1), because the date was read as UTC.

If the times in your export are the times on your site, this is wrong by the offset. If they are UTC, it is right.

Step 5: correct the dates#

Add the site's offset to each date in the file, so that the cell says which time it means: 2019-05-02 08:15:00+02:00. The offset belongs to the date, not to the site: Malta is +02:00 in summer and +01:00 in winter, so our file uses +02:00 for May, June and August and +01:00 for December and January. In a spreadsheet, add the text to the date column and save as CSV again; the other columns stay as they are (dates are wrong).

Drop the corrected file on the same card. The review now says 5 updated, 0 new: the numbers in id match the posts you published, and only the dates differ. Publish them. The posts list shows Welcome aboard at 8:15 am, the time in the file.

The WordPress posts list: Welcome aboard, published 2019/05/02 at 8:15 am
After the second upload the site shows 08:15 (1): the time in the file.

Nothing was created twice, because the record ID id matched each article (how rows are matched).

If it does not match#

What you see Why What to do
The dates are a few hours off The cells have no time zone and the site is not on UTC Add the offset, as in step 5, or enter the times as UTC
Every post has today's date Publish date is not mapped Choose the column in the editor (status, dates and authors)
The posts exist twice The file was uploaded with another record ID column, or the first upload used another configuration Two copies of the same article
A status is refused The cell holds a word WordPress does not know Row errors

Was this article helpful?