Free tool · WordPress import
WordPress CSV import checker
Check a spreadsheet before you turn it into WordPress posts with SteadyPost. See which rows would be skipped, which dates would be misread and which columns would be ignored, before anything touches your site.
What SteadyPost would see
Choose or drop a CSV file to check it.
This checker reads CSV files only.
SteadyPost imports .xlsx files too, from their first sheet. Check an Excel file with the plugin's own preview and dry run, or save it as CSV UTF-8 and check that here.
SteadyPost only imports .csv and .xlsx files.
In Excel or Google Sheets, save or download the sheet as CSV UTF-8 and try again.
This file is larger than 20 MB.
SteadyPost refuses uploads over 20 MB, and your server's own upload limit may be lower. Split the file into smaller ones.
The file has no rows.
SteadyPost refuses a file with nothing in it. Check that you saved the right sheet.
Your browser couldn't read this file.
Try saving it again, or choose a different file.
No problems found. SteadyPost should import every row.
to fix and to check.
Nothing will be skipped, but worth checking.
- Rows
- Columns
- Recognised
- Separator
- CommaSemicolon
- Encoding
- UTF-8, with BOMUTF-8Windows-1252
Columns SteadyPost will use
None.
Ignored unless you map them on the Import screen:
What to look at
Skipped or goes wrongWorth checking
This uses SteadyPost's automatic column mapping. If your site already has a mapping that includes this file's title column, the plugin keeps yours instead. Finish with the plugin's dry run, which also checks authors, images and categories against your site.
The first rows, as SteadyPost reads them
Row numbers match the plugin's preview. Long cells are cut short here.
The rules come from SteadyPost 1.3.0's own code: its CSV reader, automatic column mapping and importer. Dates were tested against PHP 8.4, which reads them for the plugin, and PHP's date formats documentation. Checked on 23 October 2026. Your site's settings, such as a saved column mapping, default status or row filter, can change the outcome, so the plugin's dry run has the last word.
- Title
- Content
- Google Doc
- Slug
- Status
- SEO title
- SEO description
- SEO keywords
- Unique row ID
- Post ID (updates that post)
- Excerpt
- Featured image
- Categories
- Tags
- Post type
- Publish date
- Author
- Custom field
- Taxonomy terms
- No column is recognised as the post title, so nothing can be imported until you map one. Call the column Title, or choose it under SteadyPost → Settings.
- Lines end with a carriage return only, as old Mac versions of Excel save CSV. PHP splits lines on line feeds, so SteadyPost would read the whole file as one row. Save it again as CSV UTF-8.
- The header row has tabs but no commas or semicolons, so this looks like a tab-separated file. SteadyPost only detects commas and semicolons, so each line would become a single cell.
- A quoted cell that starts on row is never closed, so everything after it is read into that one cell. Look for a stray double quote (") on that row.
- The file isn't UTF-8, so SteadyPost reads it as Windows-1252, the encoding Excel uses for plain CSV on Windows. Western European accents survive. Chinese, Tamil and other scripts saved this way don't: save as CSV UTF-8 instead.
- Two columns are both called
once case, spaces and punctuation are ignored. SteadyPost renames the second one, so only the first is used. - Column has no header. SteadyPost calls it
and ignores it unless you map it. - The column
isn't mapped automatically. Rename it, or map it on the Import screen, or its values are ignored. - The column
names a protected custom field, one starting with an underscore. SteadyPost drops underscores from the start of column names, so it writes to the custom fieldinstead. - Row has no title, so SteadyPost skips it.
- Row : the status
isn't recognised, so your default status is used, which is draft unless you changed it in Settings. - Row is scheduled but has no publish date it can read, so it is saved as a draft.
- Row is scheduled for
, which has passed. WordPress publishes a post scheduled in the past straight away. - Row : the date
can't be read, so the post is dated at the moment of the import. Use YYYY-MM-DD HH:MM, such as 2026-11-01 09:00. - Row :
is read month first, as. If you meant the day first, write it as YYYY-MM-DD. - Row :
is read as year-month-day, giving. Write the year in full. - Row :
isn't a real date, so it rolls over to. - Row : this checker doesn't recognise the date
. PHP reads many formats, not always the way you'd expect. Use YYYY-MM-DD HH:MM to be sure, or check the dry run. - Row : the featured image
doesn't start with http:// or https://, so SteadyPost looks for a file of that name in your images zip or media library instead of downloading it. - Row :
isn't a Google Docs link. The dry run reports an error, and the import creates the post without its content. - Row : the Post ID
isn't a number, so a new post is created instead of updating one. - Row :
inuses semicolons. Terms are split on commas and vertical bars only, so this becomes one term. - Row has more cells than the header row. The extra cells, from column on, are ignored.
- Row has a double quote inside a cell that isn't wrapped in quotes. SteadyPost keeps the text, but check the cell reads as you meant.
- Row has the same row IDslugtitle as row , so both are the same post: row creates it and this row updates it, and this row's values win. If "update existing" is off in Settings, this row is skipped instead. The dry run doesn't compare rows with each other, so it shows both as new.
- And more like these.
| Welcome to our new blog | This post was made from a spreadsheet. A blank line in this cell starts a new paragraph, and simple HTML such as bold text or links is kept. | A short introduction to the blog. | welcome-to-our-new-blog | draft | News | welcome, announcement | Welcome to our new blog | What to expect from our new blog, and how often we will post. | new blog, announcement | ||||
| Five tips for planning content | Start with a calendar. Plan a month ahead, pick topics and assign writers. | five-tips-for-planning-content | scheduled | Guides | planning, tips |
What SteadyPost checks, column by column
| Column | Also recognised as | What SteadyPost does with it |
|---|---|---|
| Title | post_title, headline | The only required column. A row without a title is skipped. |
| Status | post_status, wp_status, publish_status | Accepts draft, publish, published, live, pending, review, private, scheduled and future, in any case. Anything else, or a blank, gets the default status from Settings. |
| Publish Date | post_date, published_date, date_published | Read in your site's timezone. A scheduled row needs one, or it becomes a draft. A column called just "Date" isn't picked up. |
| Categories, Tags | category, tag | Split on commas or vertical bars. Terms that don't exist yet are created. |
| Featured Image | feature_image, cover_image, thumbnail, image | A web address starting http:// or https:// is downloaded into the media library. Anything else is treated as a file name in your images zip or media library. |
| Slug | url_slug, post_name, permalink | Sets the post's address, and identifies the row when you import the file again. |
| Post ID | wp_post_id, wordpress_id | Updates that existing post. Written by SteadyPost's export, for bulk editing. |
| Content, Excerpt | body, post_content, summary | Plain text, Markdown or HTML, detected per row. |
| Author | post_author | A username, email address or user ID. No match means the default author. |
| Meta Title, Meta Description, Keywords | seo_title, seo_description, focus_keyword | Written to Yoast SEO, Rank Math or SEOPress, whichever is active. |
| meta:key, tax:taxonomy | Custom fields and custom taxonomies, separated like tags. Underscores at the start of a key are dropped, so protected fields can't be written. |
SteadyPost is lenient about a lot, so this checker doesn't complain about these:
- Column order, and the case, spaces and punctuation in header names.
- Blank rows, blank lines above the header, and spaces around values.
- Semicolon-separated files, as Excel saves them in countries that use a decimal comma.
- Files saved in Windows-1252 rather than UTF-8, with or without a byte order mark.
- Rows with fewer cells than the header: the missing ones count as blank.
- Dates typed into Excel that arrive as day numbers.