Migration·9 min read·

WordPress.org self-hosted to VeloCMS migration steps

Self-hosted WordPress gives you direct database access, which makes migration faster than WordPress.com. This guide walks through the MySQL export path, image bulk transfer, and permalink redirect strategy.

Self-hosted WordPress uses the same WXR XML export as WordPress.com — described step by step in the WordPress.com playbook, and the import side (Admin → Tools → Import in VeloCMS) is identical either way. What's different with self-hosted WordPress is you have server access, so you can generate that export faster and in more control via WP-CLI instead of waiting on the admin UI's export throttle.

WP-CLI export (recommended for larger sites)

If WP-CLI is installed on your server, run wp export --dir=/tmp/wp-export --post_type=post --post_status=publish to generate a WXR file. This is faster than the admin UI export for large sites because WP-CLI runs without the 30-second PHP timeout that limits admin exports. Transfer the .xml file to your local machine and follow the import steps in the WordPress.com playbook from Step 2 onward — upload it directly at Admin → Tools → Import.

For very large sites (2,000+ posts)

If your site has thousands of posts, a single WXR export can get large enough that it's slow to upload or generate in one pass. Export in chunks instead using WP-CLI's date-range flags:

wp export --dir=/tmp/wp-export --post_type=post --post_status=publish \
  --start_date=2024-01-01 --end_date=2024-12-31

# Repeat with the next year's range, then the next, etc.

Upload each chunk separately at Admin → Tools → Import, reviewing the import log after each batch before moving to the next.

What happens to wp-uploads images

Unlike WordPress.com (where images are hosted on WordPress's own servers), self-hosted WordPress stores images in wp-content/uploads/ on your server — but the WXR export still references them by their full public URL. As long as your site stays live during import, VeloCMS's importer follows those URLs directly and re-uploads each image to your Cloudflare R2 bucket automatically. There's no separate archive or upload step required.

Permalink redirect strategy for self-hosted

Self-hosted WordPress typically uses one of three permalink patterns: /?p=123 (numeric), /YYYY/MM/DD/slug (date-based), or /slug (plain). The VeloCMS importer preserves post slugs, so /slug to /blog/slug redirects are straightforward (just add the /blog/ prefix). Date-based permalinks need a pattern-matching rule instead of a simple one-to-one mapping — add these under Admin → Settings → Redirects, or use Cloudflare's Bulk Redirects if you're already routing through Cloudflare for other rules.