wp-content » plugins » Reprint: Move a WordPress Site to a New Host Without an Archive

Reprint: Move a WordPress Site to a New Host Without an Archive

WordPress.org announced Reprint on November 13, 2026: a free, open-source tool that copies a WordPress site’s files and database straight to another server. If your migration plugin keeps timing out while it builds a giant archive on a slow shared host, this is worth a look.

The old host never builds a full-site archive. A small plugin on the source serves the files and database over HTTPS, and a command-line client on the new server pulls them. Interrupted copies resume, and if you pass a new site address, it rewrites the old URLs, including the ones in serialized data.

I am following the official Move to another host guide here, with the server parts filled in.


The source site only needs an administrator account. You do not need SSH on the old host. The Reprint plugin works on WordPress 4.7 or newer with PHP 5.6.20 or newer.

The destination needs command-line PHP 7.4 or newer, an empty database, and control over its web server configuration.

As of 2026-11-14 the plugin is at version 0.11.8 and was published at the end of October. It is new software, so I would not delete a single backup because of it. Keep your usual backup routine until it has a longer track record.


Reprint only reads from the source, but the move ends with a DNS switch and you want a rollback point that does not depend on any tool. Take a normal file and database backup first. If your backup plugin hangs on the database, export it with WP-CLI as shown in Backup stuck on the database.

Reprint imports into a database that already exists and is empty. Use a new user and password here. The guide says not to reuse the old host’s database credentials.

mysql -u root -p
CREATE DATABASE site_database CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'site_user'@'127.0.0.1' IDENTIFIED BY 'a-long-random-password';
GRANT ALL PRIVILEGES ON site_database.* TO 'site_user'@'127.0.0.1';
FLUSH PRIVILEGES;

Each statement should answer with Query OK. The user needs rights to create, change and drop tables, because the import can replace existing tables.

On a control panel you do this in the GUI instead. In OpenPanel it is MySQL > Databases > New database, where names can use letters, numbers and underscores. In cPanel it is the MySQL Databases page or the Database Wizard. Both panels also let you pick the PHP version per domain, which is a good moment to match the source or go newer. Keep in mind that the host guide assumes you control the web server config, so on panel hosting check where your domain’s document root lives before Step 5.

curl -fL https://plugins.svn.wordpress.org/reprint/downloads/reprint.phar -o reprint.phar
php reprint.phar --version

The second command should print the client version. If it fails, check php -v first, since the client needs PHP 7.4 or newer on the command line, then go through the troubleshooting page in the Reprint handbook.

On the source site, go to Plugins > Add New Plugin, install and activate Reprint. Activating it does not start anything. Then create a key on the new server:

php reprint.phar keygen https://source.example \
  --state-dir=/srv/reprint-state --out=/srv/reprint-key.pem

The client prints a Migration Token. In the old site’s admin, open Tools > Reprint Server, find Authorize a client to copy this site, paste the token into the Migration Token field and click Authorize client.

Keep reprint-key.pem and the state folder private. The state folder holds credentials.

This is the command from the host guide. Replace both addresses and the database details with your own:

php reprint.phar pull https://source.example \
  --private-key-path=/srv/reprint-key.pem \
  --state-dir=/srv/reprint-state --fs-root=/srv/reprint-files \
  --flatten-to=/srv/site \
  --target-engine=mysql --target-host=127.0.0.1 \
  --target-user=site_user --target-pass=YOUR_DATABASE_PASSWORD \
  --target-db=site_database --new-site-url=https://destination.example \
  --runtime=none --start-runtime=none

The downloaded files land in /srv/reprint-files. /srv/site links to them and is the one folder your web server serves. The two none flags skip Reprint’s built-in development server, because nginx or Apache will serve the site.

See also  RSS Feed Requests Overloading WordPress? Cut Post Feeds Fast

💡 Do not delete /srv/reprint-files after the copy. The guide is explicit that removing it breaks the site in /srv/site.

If the connection drops, run exactly the same command again. It resumes from the last saved point instead of starting over.

A minimal nginx server block for the new site looks like this:

server {
    listen 80;
    server_name destination.example;
    root /srv/site;
    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    }
}

Change the socket path to your PHP-FPM version, run nginx -t (it should report that the syntax is ok and the test is successful) and reload nginx. Add SSL before going live. If PHP-FPM restricts paths with open_basedir, allow /srv/reprint-files as well, since the site folder points into it.

If the domain stays the same, test before DNS changes by pointing it at the new IP in your own hosts file:

203.0.113.10  destination.example

Then check what the Reprint guide checks: the home page opens, internal links stay on the copy, images load and /wp-admin/ lets you sign in. Other ways to preview are in accessing WordPress using a temporary server URL.

The source keeps serving visitors during a copy, so new orders, comments and posts keep arriving. When the test copy looks right, pause changes on the old site, run the same pull once more, and only then point the domain at the new server.

That last pull is not a merge. The database is imported again and replaces whatever you changed on the destination, so do not fix content on the new server between the test and the final pull. File copies are incremental, so the second run is faster.

Reprint does not touch DNS and does not delete the source. Leave the old site running for a few days as your rollback.

Once the move is done, remove the Migration Token under Tools > Reprint Server. Deactivating the plugin keeps its settings. Deleting it through WordPress removes the stored settings and credentials, which is what I would do on a site you are leaving anyway.


The client reports error codes, and the troubleshooting page has a fix for each. The ones I expect to see most on shared hosting:

  • AUTH_UNKNOWN_KEY: the key was never authorized. Paste the token under Tools > Reprint Server again.
  • AUTH_HEADERS_STRIPPED: the host drops custom HTTP headers before they reach WordPress. Only the host can change that.
  • CLOUDFLARE_CHALLENGE or WORDFENCE_BLOCKED: a firewall stopped the client. Reprint cannot solve a Cloudflare browser challenge, so allow the Reprint API address for the duration of the move.
  • REDIRECT: use the exact address the message names, with the right scheme and www form.
  • SERVER_ERROR: look in the source site’s PHP error log.

Do not delete the state folder as a first step. It is what lets the next run resume.

A few limitations from the handbook are worth knowing before you start. Files PHP cannot read because of open_basedir are reported and left out. MySQL 5.5 works as a source but not as a destination. Caches, logs and backup archives are skipped on purpose. Mail, payment and scheduled job settings in the copied database still point at the live accounts, which matters if you pull a copy for staging instead of a move.

TL;DR: Install Reprint on the old site, run keygen on the new server and authorize the token under Tools > Reprint Server, then pull into an empty database with --flatten-to and point nginx at that folder. Test through your hosts file, do one final pull with the old site paused, switch DNS and revoke the token. If you are also changing the domain by hand later, my domain change guide covers the other ways.

Was this post helpful?

Leave a Comment

I enjoy constructive responses and professional comments to my posts, and invite anyone to comment or link to my site.

Recommended