How to Prepare a Large Existing Blog Section for Bulk Importing
Follow this guide to correctly format your blog CSV file and ensure a smooth, error-free import. Each row in the file represents a single blog post, and the breakdown below outlines the key columns you’ll need to complete. It also specifies what data each column contains, ensuring it maps correctly to the corresponding fields on the new website. If you need further assistance, we’re here to help!
1. Export categories first, and import them into the destination site before posts. Hierarchy has to exist before posts can be assigned into it correctly.
2. Export posts second, referencing category paths that already exist on the destination.
3. Validate image URLs are publicly accessible before running the import — broken URLs fail silently in most bulk importers and just skip the image.
| Column | Improved Description |
|---|---|
post_id | The post’s original numeric ID from the source site (e.g. 101). Not displayed anywhere on the destination site — use it only as the match key so re-running the import updates existing posts instead of creating duplicates. |
post_title | The post’s headline as it will display on the front end and in the browser tab (unless overridden by an SEO title). Plain text — HTML tags here will render literally, not as formatting. |
post_name | The URL slug, lowercase with hyphens, no spaces or special characters (e.g. my-post-title). If left blank, WordPress will auto-generate one from post_title — which can break existing inbound links if the source site’s slug doesn’t match. |
post_date | The date/time the post should appear as originally published, in YYYY-MM-DD HH:MM:SS 24-hour format (e.g. 2026-01-15 09:00:00). Controls chronological sort order and any “Published on” display. |
post_modified | The date/time of the most recent edit, same YYYY-MM-DD HH:MM:SS format. If omitted, most importers default this to the import date — which can make old content look freshly updated. Set explicitly if preserving true edit history matters. |
post_status | One of: publish (live), draft (not visible), pending (awaiting review), or private (visible only to logged-in users with permission). Case-sensitive — must be lowercase. |
post_type | post for standard blog posts, or the exact slug of a custom post type (e.g. case_study). The custom post type must already be registered on the destination site or the import will fail or fall back to a default type. |
post_author | The author’s email address or username on the destination site — not the source site. The account must exist beforehand; unmatched authors typically fall back to the default/admin user silently. |
post_content | The full post body as raw HTML (e.g. <p>, <h2>, <img> tags included). If your source content is plain text or Markdown, convert it to HTML before import or formatting will be lost. |
post_excerpt | Optional short summary (1–2 sentences) shown in blog listings, search results, and some social share previews. If blank, WordPress auto-generates one by truncating post_content. |
categories | The category (or categories) the post is assigned to. Use > to indicate a parent/child relationship within one category (e.g. Gear > Boots), and , to assign the post to multiple separate categories (e.g. Gear > Boots, Dirt Bike). Categories should be created first — see category_name/parent_category below. |
tags | Comma-separated list of tag names (e.g. riding gear, boots, off-road, dirt bike). Unlike categories, tags have no hierarchy. Tags that don’t already exist are typically auto-created on import. |
featured_image_url | A direct, publicly accessible URL to the image file (not a page containing the image). The importer downloads and re-uploads this file to the destination media library — dead links or URLs behind a login will fail silently and skip the image. |
featured_image_alt | Alt text describing the featured image, read by screen readers and used by search engines. Skipping this hurts both accessibility and image-search SEO — don’t leave blank if the source had alt text. |
gallery_image_urls | Pipe-separated (|) list of direct image URLs for a gallery or multi-image field (e.g. url1.jpg|url2.jpg). Order matters — it determines display order and must stay aligned with gallery_image_alt and gallery_image_captions below. Important: make sure to use the Pipe (|) to separate each image file. |
gallery_image_alt | Pipe-separated alt text, one entry per image, in the exact same order as gallery_image_urls. A mismatched count between the two columns will misalign alt text to the wrong images. Important: make sure to use the Pipe (|) to separate each alt tag. |
gallery_image_captions | Pipe-separated captions, one per image, same order as gallery_image_urls. Leave an entry blank between pipes (e.g. caption1||caption3) rather than omitting it, to keep positions aligned. Important: make sure to use the Pipe (|) to separate each caption. |
meta_seo_title | The SEO/browser-tab title override, if different from post_title. |
meta_seo_description | The meta description shown in search engine results (roughly 150–160 characters is the practical display limit). Same plugin-dependency caveat as meta_seo_title. |
comment_status | open to allow new comments, closed to disable them. Doesn’t hide or delete existing comments — only controls whether new ones can be submitted. |
custom_field_1 / custom_field_2 | Placeholder columns for any additional custom fields or Advanced Custom Fields) values. Rename the column header to the exact field key/meta key used on the destination site — an incorrect key silently creates a new, unused field instead of populating the intended one. Add as many columns ads needed. |
category_name | The category’s display name exactly as it should appear on the site (e.g. Gear). Case and spelling should match how it’s referenced in the posts file’s categories column. |
category_slug | The URL slug for the category’s archive page, lowercase with hyphens (e.g. gear). If omitted, WordPress generates one from category_name, which may not match the source site’s existing URLs. |
parent_category | The exact name of the parent category, if this is a subcategory (e.g. Recipes). Leave blank for top-level categories. Parent categories must be imported first, or the hierarchy link will fail to attach. |
category_description | Optional descriptive text displayed on the category’s archive page, often used for on-page SEO context. Plain text or simple HTML depending on the theme. |