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.

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:
- Choose file — upload your WXR file. WordPress accepts files up to the PHP
upload_max_filesizelimit. If your export exceeds this, you will need to split the file (more on that below). - 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.
- 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.
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.
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-splitcommand-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 256Mandphp_value post_max_size 256Mto your.htaccessfile. Remove these lines after the import. - Use WP-CLI — the command-line importer bypasses HTTP upload limits entirely. Run
wp import yourfile.xml --authors=createand 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.
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:
- Spot-check permalinks — visit a handful of imported posts and pages. Do the URLs match the expected structure?
- Verify categories and tags — open the Categories screen. Are parent-child relationships intact? Do post counts look accurate?
- Check custom fields — if you use ACF, Meta Box, or similar plugins, open a post and confirm custom field data appears in the editor.
- Test comment display — find a post that had comments on the source site. Are they visible with correct author names and dates?
- 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.
- 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.
- Flush permalinks — go to Settings → Permalinks and click Save Changes. This regenerates the rewrite rules and ensures imported URLs resolve correctly.
- 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


