WordPress Importer: The Built-In Migration Tool Nobody Talks About

The WordPress Importer is one of those rare plugins that ships with every WordPress installation yet remains chronically underused. Most site owners scramble for third-party migration services when the native tool sits right there — waiting in the Tools menu. It handles the dirty work of moving content between WordPress installations without requiring database access, server credentials, or technical gymnastics. If your host limits database imports through phpMyAdmin, this is your escape hatch.

The plugin parses WXR files — WordPress eXtended RSS — an XML format that wraps all your content into a single portable archive. Think of it as a universal container: posts, pages, custom post types, comments, categories, tags, custom fields, and even author information get serialized into one file. You export it from Site A, import it into Site B. No SQL dumps, no phpMyAdmin timeouts, no charset conversion nightmares. The WXR format has been stable for over a decade, so forward and backward compatibility is rarely an issue.

WordPress Importer plugin interface
WordPress Importer — the default content migration tool in the WordPress admin panel
WordPress Importer has been part of WordPress core tooling since version 2.1. It was originally maintained by the core team separately, then brought into the official plugin repository. Today, it is actively maintained and compatible with WordPress 6.x.

What Data Gets Imported

The WXR format is surprisingly comprehensive. When you run an export from the Tools menu, here is exactly what gets packaged into the XML file:

  • Posts and pages — all post types including standard posts, pages, and any custom post types registered by your theme or plugins
  • Comments — approved, pending, and spam comments with their metadata intact
  • Categories and tags — the full taxonomy hierarchy, including parent-child relationships and term descriptions
  • Custom fields — all post meta data, from SEO fields to custom layout settings
  • Authors — author names, emails, and post attributions (though you will need to reassign them during import)
  • Navigation menu items — menu structure and hierarchy
  • Media attachments — file references with the option to download and import the actual files

What it does not import: theme settings, plugin configurations, widget placements, user accounts with passwords, and site-level options stored in the wp_options table. This is important — the importer moves content, not configuration. You will need to manually replicate theme and plugin settings on the destination site.

How to Install and Use

Installation takes thirty seconds. Go to Tools → Import in the WordPress admin panel. Find the WordPress entry in the importer list and click Install Now. WordPress fetches the plugin from the repository, activates it, and drops you onto the import screen. No FTP, no file upload, no command line needed.

The import workflow has three stages:

  1. Choose file — upload your WXR file. WordPress accepts files up to the PHP upload_max_filesize limit. If your export exceeds this, you will need to split the file (more on that below).
  2. Assign authors — map each author from the export to an existing user on the destination site, or create new users on the fly. You can also assign all imported content to a single existing user — handy when consolidating sites.
  3. Import attachments — check the box that says Download and import file attachments. The importer fetches each image from the source server and saves it to your media library. Without this box checked, your imported posts will reference images on the old domain — and those links will break the moment the old site goes offline.
Always check the attachment import box during migration. If you skip it, your posts will hotlink images from the old server. Six months later when that hosting expires, your entire media library disappears.

Understanding the WXR File Format

The WXR file is plain XML with a specific WordPress namespace. It starts with standard RSS channel metadata, then wraps each content item in an <item> element with extended WordPress-specific fields. Here is what a single post entry looks like conceptually:

XML Element Purpose
<title> Post or page title
<content:encoded> Full post content with HTML
<wp:post_type> Content type — post, page, or custom
<wp:status> Publish status — publish, draft, pending
<wp:postmeta> Custom field key-value pairs
<category domain="category"> Assigned categories
<category domain="post_tag"> Assigned tags
<dc:creator> Author username
<wp:comment> Nested comment data with author, email, date

The WXR format is well-documented and open. Third-party tools can generate valid WXR files — so if you are migrating from a non-WordPress platform, a developer can write a converter that outputs WXR and feeds it straight to the WordPress Importer. This has been the standard approach for migrating from Blogger, Tumblr, and Joomla for many years.

Comparison with Other Migration Tools

The WordPress Importer is not the only game in town. Here is how it stacks up against the three most common alternatives:

Feature WordPress Importer All-in-One WP Migration Duplicator Manual SQL
Cost Free Free (premium for large sites) Free + Pro from $69 Free
Technical skill required Low Very low Medium High
Imports plugins No Yes Yes Yes
Imports theme settings No Yes Yes Yes (via options table)
File size limit PHP upload limit 512MB (free), unlimited (premium) Server-dependent None (direct DB access)
Serialized data handling Built-in Built-in Built-in Manual — requires search-replace tool
Selective import Partial (author mapping) Partial (file exclusion) Full site only Full control
URL rewriting Not needed (content only) Automatic Automatic Manual SQL queries or WP-CLI

The choice depends on what you are migrating. If you need to move only content — say, from a staging site where you draft posts to a production site — the Importer is the cleanest solution. It leaves both sites independently configured and only transfers the content. All-in-One WP Migration excels at full-site cloning: themes, plugins, settings, everything. Duplicator is the go-to for developers who need to package and deploy entire site snapshots. Manual SQL is the nuclear option — use it when every other tool fails, but be prepared to handle serialized data and URL replacements yourself.

For content-only migration between WordPress sites, the built-in Importer is almost always the right first choice. It is free, requires zero configuration, and avoids the risk of overwriting destination site settings.

Dealing with Large Site Imports

The biggest complaint about the WordPress Importer is file size limits. The default PHP configuration caps uploads at 2MB to 64MB depending on hosting. A site with a thousand posts and comments can easily produce a WXR file exceeding 100MB. Here is how to work around it:

  • Split the WXR file — use the wp-split command-line tool or a dedicated plugin like Advanced Export to break the export into chunks by post type or date range. Import each chunk separately.
  • Increase PHP limits temporarily — add php_value upload_max_filesize 256M and php_value post_max_size 256M to your .htaccess file. Remove these lines after the import.
  • Use WP-CLI — the command-line importer bypasses HTTP upload limits entirely. Run wp import yourfile.xml --authors=create and it processes the file directly on the server.
  • Export by date range — when exporting, use the date filter to create multiple smaller exports. Export 2023-2024 as one file, 2025-2026 as another.
WP-CLI is the cleanest path for large imports. It processes the WXR file on the server without any upload step. If you have SSH access, this eliminates the file size problem entirely.

Another performance consideration: the importer can be slow with thousands of attachments. Each image download consumes HTTP requests and server time. For sites with extensive media libraries, consider uploading the /uploads/ directory via FTP before importing the WXR file. The importer will skip files that already exist, dramatically speeding up the process.

Common Issues and How to Fix Them

Timeout during import

The most frequent complaint. Shared hosting environments kill long-running PHP processes. Solution: split the WXR file into smaller chunks of 100-200 posts each. Or use WP-CLI, which handles timeouts more gracefully.

Failed media imports

If the source server is slow, offline, or blocking requests from your server, attachment downloads fail silently. The importer logs these but does not alert you. After import, scan your media library for missing images. A plugin like Broken Link Checker can identify posts still referencing external images.

Author reassignment confusion

The author mapping screen lists usernames, not display names. If you have authors with similar usernames across sites, double-check each mapping. Assigning posts to the wrong author is a pain to fix afterward — you will need to bulk-edit each post or write a database query.

Duplicate content

Re-importing the same WXR file creates duplicates. The importer does not deduplicate by default. If you interrupted a previous import and need to restart, delete the partially imported posts first. Use the bulk actions in the Posts list to clean up.

Character encoding issues

Rare but frustrating. If your site uses a non-UTF-8 database encoding, WXR files may produce garbled characters. Always ensure both source and destination databases use UTF-8 (utf8mb4). Most modern hosts default to this, but legacy installations sometimes do not.

Post-Migration Checklist

After the importer finishes, do not just close the tab and call it done. Run through this checklist to verify everything landed correctly:

  1. Spot-check permalinks — visit a handful of imported posts and pages. Do the URLs match the expected structure?
  2. Verify categories and tags — open the Categories screen. Are parent-child relationships intact? Do post counts look accurate?
  3. Check custom fields — if you use ACF, Meta Box, or similar plugins, open a post and confirm custom field data appears in the editor.
  4. Test comment display — find a post that had comments on the source site. Are they visible with correct author names and dates?
  5. Review media library — open the Media screen and scroll through. Every image that was imported should have a thumbnail. Missing thumbnails mean the download failed.
  6. Update internal links — if your posts contain internal links to the old domain, you need to update them. Use a search-replace plugin like Better Search Replace to fix them in bulk.
  7. Flush permalinks — go to Settings → Permalinks and click Save Changes. This regenerates the rewrite rules and ensures imported URLs resolve correctly.
  8. Submit sitemaps — if you use an SEO plugin, regenerate your XML sitemaps and resubmit them to Google Search Console. The imported content needs to be re-indexed.

When Not to Use WordPress Importer

Despite its utility, the importer is not always the right tool. Skip it in these scenarios:

  • Full site migration to a new domain — use All-in-One WP Migration or Duplicator instead. The Importer does not carry theme or plugin settings, so you will spend hours reconfiguring everything.
  • Migrating from a non-WordPress platform without WXR export — while you can build a WXR converter, dedicated migration plugins for Drupal, Joomla, or Shopify handle the mapping logic and edge cases much better.
  • Migrating WooCommerce stores — WooCommerce stores product data in custom post types and extensive metadata. The Importer can handle the post types, but order history, customer accounts, and payment gateway settings are not included. Use a dedicated WooCommerce migration tool.
  • Ongoing content synchronization — the Importer is a one-time batch operation. For continuous sync between staging and production, look into WP Migrate DB Pro or a deployment workflow with version control.

Frequently Asked Questions

Does WordPress Importer overwrite existing content?

No. The importer creates new posts and pages. It does not update already existing content. If you import a post with the same slug as an existing one, WordPress appends a numeric suffix to the slug to avoid conflicts. This is by design — the importer is additive, not destructive.

Can I import from WordPress.com to a self-hosted site?

Yes. WordPress.com provides a standard WXR export under Tools → Export. Download it and import it directly into your self-hosted WordPress installation using the Importer. The process is identical to a self-hosted-to-self-hosted migration.

What happens if the import is interrupted?

The importer does not clean up partial imports. Posts imported before the interruption remain, and restarting the import without cleaning up creates duplicates. The safest approach after an interruption: delete the partially imported content and start fresh with a new WXR file.

Can I import only specific post types?

Not directly through the UI. The Importer processes everything in the WXR file. To selectively import, you need to modify the WXR file before uploading — delete the <item> elements for post types you do not want — or use a plugin like Advanced Export that lets you choose what to export in the first place.

Does the Importer handle featured images?

Yes, provided you check the Download and import file attachments option. The importer fetches the featured image from the source server and assigns it to the imported post. If the source server is unreachable, the featured image will be missing.

Will my SEO metadata survive the import?

Yes. SEO plugins like Yoast and Rank Math store their data as custom fields. Since the WXR format includes all post meta, your SEO titles, descriptions, focus keywords, and social media metadata transfer intact — as long as you have the same SEO plugin installed on the destination site.

How do I increase the PHP upload limit for large WXR files?

Edit your php.ini file or add directives to .htaccess: php_value upload_max_filesize 256M and php_value post_max_size 256M. If on shared hosting without access to these files, ask your host to increase the limits temporarily. The alternative is to use WP-CLI, which bypasses HTTP upload limits.

Can I import encrypted or password-protected posts?

Yes. The WXR format includes the password protection flag and the password itself. The importer recreates password-protected posts with the same password, and they behave identically on the destination site.

Does the Importer support multisite networks?

Yes, but with a caveat. The Importer works on individual sites within a multisite network. Import on the specific subsite where you want the content. It does not bulk import across multiple subsites — you run it once per subsite.

What happens to shortcodes from plugins that are not installed on the destination?

They remain as plain text in the post content — for example, [my_plugin_shortcode] will display as-is. The Importer does not process or strip shortcodes. Once you install and activate the corresponding plugin, the shortcodes should render correctly.

Tap to react