Migrate a WordPress site to ZevCloud
This guide walks through moving an existing WordPress site to ZevCloud, whether the source site is still live, taken down, or you only have an export sitting on your laptop.
By the end you will have your posts, pages, comments, and media files running on a fresh WordPress install at a <slug>.zevcloud.app subdomain or your own custom domain.
What you need before you start
Section titled “What you need before you start”Three things from the old site:
- A database dump. Either
.sqlor.sql.gz, produced bymysqldump, phpMyAdmin’s Export feature, or a backup tool like UpdraftPlus. The dump should include every table prefixed withwp_(or whatever the old install’s table prefix was). - Your
wp-content/uploads/folder. This is where every image, video, PDF, and attachment lives. Posts reference uploads by URL, so without this folder every media item in your archive breaks. Grab the whole directory, including itsYYYY/MM/subfolders. - A list of your themes and plugins. Just names. You do not need the files. We reinstall fresh from the original source.
That is it. You do not need wp-config.php, wp-content/themes/, wp-content/plugins/, or WordPress core files. The new install ships with all of that.
What this guide does not cover
Section titled “What this guide does not cover”- Multisite / WordPress Network installs. Same approach mostly works, but the
wp_blogstable needs handling. Email support before you start. - WooCommerce stores with live orders. The migration itself works, but you need to coordinate the DNS cutover so customers do not land on the old store while orders are in flight.
- Restoring from a corrupted database dump. If the dump is incomplete, the import will fail with a SQL error. You will need to repair the dump first.
If any of those apply, write to support@zevcloud.net before you start. We can help.
The migration
Section titled “The migration”-
Create a fresh WordPress site
Section titled “Create a fresh WordPress site”On the ZevCloud dashboard, open a project (or create one), add a new service, and pick WordPress. Choose a plan, a slug (
my-blogbecomesmy-blog.zevcloud.app), and the region.Provisioning takes 30 to 60 seconds. When it finishes you will have:
- The site URL:
https://<slug>.zevcloud.app - The admin URL:
https://<slug>.zevcloud.app/wp-admin/ - An initial admin account (the credentials are shown once on the dashboard, copy them somewhere safe).
- The site URL:
-
Open the credentials panel
Section titled “Open the credentials panel”On the new WordPress service, open the Credentials tab. You will see two sets:
- SFTP for uploading files: host, port, username, password.
- Database for importing the SQL dump: host, port, database name, user, password.
Keep the tab open. You need both sets in the next two steps.
-
Upload your media files via SFTP
Section titled “Upload your media files via SFTP”Connect with any SFTP client (FileZilla, Cyberduck, the
sftpcommand line) using the credentials from the dashboard.On the remote side, navigate to
wp-content/uploads/. Upload your olduploads/directory in full, preserving the date-based subfolder structure (2024/01/,2024/02/, and so on).# If you prefer the CLI, from inside your local uploads/ folder:sftp -P <port> <user>@<host>cd wp-content/uploadsput -r *On a typical site this is the slowest step. A few thousand images can take 10 to 20 minutes over a normal connection.
-
Import the database
Section titled “Import the database”The reliable path for any dump size is SFTP + Database tab import: the file goes to your service via SFTP (resumable, no timeouts, no proxy in the way), then a single click on the dashboard kicks off a server-side import.
-
SFTP the dump into your service. Reuse the SFTP connection from step 3, but place the dump file at the root of your home directory (not inside
wp-content/uploads/):sftp -P <port> <user>@<host>put old-site.sql.gzBoth
.sqland.sql.gzwork — gzipped files are decompressed transparently during import, so don’t bother extracting first. -
Open the dashboard’s Database tab on your WordPress service.
-
Pick the file in “Import database from SFTP”. The right-hand card lists every
.sqland.sql.gzfile in your home directory. Select your dump. -
Tell us about the URL rewrite. If your DNS already points to ZevCloud, tick “My DNS is already pointing to this deployment” — we’ll skip the URL rewrite. Otherwise, paste your old site URL (e.g.
https://oldsite.com) and we’ll rewrite every reference in the dump to your new ZevCloud URL. -
Confirm and import. Tick “I understand this replaces my current database”, click Import. The page stays on the dashboard while the import runs server-side — typically 30 s to 5 min depending on dump size. The persistent status row in the same card flips from “in progress” to “completed” or “failed” when done.
The import will print warnings about existing tables (
wp_options,wp_users, etc.) being overwritten. That is expected. The dump replaces what the fresh install set up. -
-
Fix site URL and run search-replace
Section titled “Fix site URL and run search-replace”After the import, the database still has your old domain in
wp_options.siteurlandwp_options.home. WordPress reads those values to know where it lives, so loadinghttps://<slug>.zevcloud.app/wp-admin/will redirect you to the old domain. Fix this in two parts.Part A: update
siteurlandhomeso the admin loads.Open the Database Manager from the dashboard, navigate to the
wp_optionstable, and edit the rows whereoption_nameissiteurlandhome— setoption_valueto your new site URL.Or run this SQL from Adminer’s SQL command view:
UPDATE wp_optionsSET option_value = 'https://my-blog.zevcloud.app'WHERE option_name IN ('siteurl', 'home');(If your old install used a different table prefix than
wp_, adjust accordingly.)Part B: run search-replace across the rest of the database.
The rest of the database is full of references to the old domain: post content, embedded images, plugin settings, theme customiser values. WordPress stores some of these inside serialised PHP arrays, which is why a plain SQL
UPDATEor asedon the dump file will corrupt them. You need a tool that knows how to walk serialised data.Option 1: Better Search Replace plugin (recommended for non-CLI users).
Now that the admin loads, log in, install Better Search Replace from WP.org, and run it with:
- Search for:
https://olddomain.com - Replace with:
https://my-blog.zevcloud.app - Select tables: all of them.
- Run it once with Dry run ticked to confirm the diff, then once without.
Run it a second time for
http://olddomain.comif your old site had mixed protocols.Option 2: WP-CLI if your service has shell access:
wp search-replace 'https://olddomain.com' 'https://my-blog.zevcloud.app' --all-tableswp search-replace 'http://olddomain.com' 'https://my-blog.zevcloud.app' --all-tablesWP-CLI also handles
siteurlandhomecorrectly in the same pass, so if you go the WP-CLI route you can skip Part A and run only this step. - Search for:
-
Reinstall themes and plugins
Section titled “Reinstall themes and plugins”Log into the new admin at
https://<slug>.zevcloud.app/wp-admin/with the admin credentials from step 1 (not the credentials from your old site).- Themes: install the theme from its original source. WP.org, ThemeForest, a private GitHub repo, wherever you got it. Activate it. The customiser settings in the database are still there from the import, so the theme should look the way it did on the old site.
- Plugins: install each plugin from WP.org one at a time and activate them. Most plugins read their settings out of the database, so they pick up where they left off. A few (Yoast SEO, Wordfence, anything with API keys) need their settings re-entered.
-
Reconfigure email sending
Section titled “Reconfigure email sending”If your old site used an SMTP plugin (WP Mail SMTP, Post SMTP, FluentSMTP), the credentials in the database are likely for an SMTP host you no longer have access to. Re-enter them, or swap to an SMTP provider you control.
If you did not have an SMTP plugin and were relying on WordPress’s default
wp_mail()over the host’s mail server, install one now. WordPress sites on a PaaS need an SMTP relay to send mail reliably. -
Verify the site
Section titled “Verify the site”Walk through the public site:
- Home page renders correctly.
- Posts and pages display with their original layouts.
- Images and other media load (URLs should now point to
<slug>.zevcloud.app, not the old domain). - Internal links go to the new domain.
- Contact forms submit successfully.
Then walk through the admin:
- You can log in.
- Posts and pages are listed correctly.
- Editing a post and previewing it works.
- Cron jobs are firing (check Tools → Site Health → Info → WordPress Constants for
DISABLE_WP_CRON).
Connecting your custom domain
Section titled “Connecting your custom domain”When the migrated site looks right on the <slug>.zevcloud.app URL, you can point your custom domain at it.
-
Add the domain in the dashboard. On the WordPress service, open Domains → Add domain, enter the domain, and follow the DNS instructions you see.
-
Update DNS at your registrar. This is usually a CNAME (for subdomains) or an A record (for apex / root domains). The dashboard shows the exact value to use. If your domain is registered through ZevCloud already, this step is one click.
-
Wait for DNS to propagate. Typically 5 to 30 minutes, occasionally longer. The dashboard polls and turns the domain green when it picks up.
-
Run search-replace one more time to swap from the temporary
<slug>.zevcloud.appURL to your custom domain:wp search-replace 'https://my-blog.zevcloud.app' 'https://example.com' --all-tablesOr use Better Search Replace as before.
-
Update WordPress site URL in Settings → General if it has not already been updated by search-replace.
Things that go wrong, and how to fix them
Section titled “Things that go wrong, and how to fix them”Mixed-content warnings, broken images, CSS not loading
Section titled “Mixed-content warnings, broken images, CSS not loading”You skipped step 5, or search-replace did not cover all tables. Re-run with all tables selected (or --all-tables on WP-CLI), and clear any caching plugin’s cache.
”Error establishing a database connection” right after import
Section titled “”Error establishing a database connection” right after import”The import overwrote wp_options.siteurl and wp_options.home with the old domain, and now WordPress tries to load resources from a domain that no longer exists. Two ways out:
- Run search-replace from WP-CLI even before the front end renders cleanly. CLI does not need a working front end.
- Open your database client, find
wp_options, edit thesiteurlandhomerows by hand to the new URL, then load the site.
Plugins crash with “Fatal error: Uncaught Error…”
Section titled “Plugins crash with “Fatal error: Uncaught Error…””Almost always a PHP version mismatch. WordPress on ZevCloud runs current PHP. Plugins that have not been updated since 2022 sometimes use functions removed in PHP 8+.
- Check the plugin’s last update date on WP.org.
- Look for an updated alternative.
- If the plugin is custom and yours, fix the call.
- Worst case: deactivate it and find a replacement.
Some media URLs still point to the old domain after search-replace
Section titled “Some media URLs still point to the old domain after search-replace”A few plugins and themes store URLs in custom tables outside the wp_ prefix, or in option values that the search-replace tool needs to be told about. In Better Search Replace, make sure Select all tables is ticked rather than leaving the default. With WP-CLI, name custom tables explicitly:
wp search-replace 'https://olddomain.com' 'https://example.com' \ --all-tables \ --include-columns=meta_value,option_valueMy old admin password does not work
Section titled “My old admin password does not work”The imported database brought over the user accounts, but in some cases the password hashes do not validate against current PHP. Use the dashboard’s Reset admin password action on the WordPress service, or, with WP-CLI:
wp user update <username> --user_pass='new-password'The old site used a non-standard table prefix
Section titled “The old site used a non-standard table prefix”If the old install used xyz_ instead of wp_, every reference in this guide (wp_options, wp_users, etc.) becomes xyz_options, xyz_users. The fresh ZevCloud install creates tables with the wp_ prefix by default. Either match prefixes by editing wp-config.php to set $table_prefix = 'xyz_'; before the import, or rename the tables in your dump to match wp_.
When to ask for help
Section titled “When to ask for help”Write to support@zevcloud.net before you continue if any of these apply:
- The database dump is over 1 GB.
- The site is a multisite or WordPress Network install.
- WooCommerce with live orders.
- Custom database tables outside the
wp_prefix. - The old site was on PHP 5.6 or PHP 7.0.
Include the site URL, what you have access to (database dump, uploads, neither), and where you are in the steps above. Migrations are a normal support flow, especially during the iNTECH Cloud Hosting transition.