[{"data":1,"prerenderedAt":204},["ShallowReactive",2],{"seo-verification":3,"blog-migrate-client-wordpress-site-new-host-no-downtime-en":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-migrate-client-wordpress-site-new-host-no-downtime-en",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":27,"featuredImage":29,"bgImage":30,"posterImage":31,"relatedSolution":32,"intro":35,"sections":36,"ctaTitle":145,"ctaBody":146,"ctaButton":147,"ctaUrl":148,"relatedPosts":149},538,"migrate-client-wordpress-site-new-host-no-downtime",{"fr":12,"en":10,"ar":13,"es":14},"migrer-site-wordpress-client-nouvel-hebergeur-sans-coupure","نقل-موقع-ووردبريس-عميل-استضافة-جديدة-دون-توقف","migrar-sitio-wordpress-cliente-nuevo-hosting-sin-cortes","Migrate a Client WordPress Site With No Downtime: The Method","Copy, hosts-file test before DNS, write freeze, search-replace, cutover and rollback: the method for moving a client WordPress site to a new host.",11,0,false,"2026-10-30T00:00:00+00:00","2026-10-31T01:54:05+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},3,"Deployment","deploiement","bg-success\u002F10 text-success",[28],{"id":23,"name":24,"slug":25,"color":26,"icon":25},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fmigrer-site-wordpress-client-nouvel-hebergeur-sans-coupure-poster.svg",{"categorySlug":33,"appSlug":34},"cms-websites","wordpress","A WordPress migration rarely fails because of the file copy. It fails because the site keeps living while you move it: an order lands on the old server after the database export, a form writes to a database nobody reads any more. For an agency, the client is the one who calls. This guide gives the sequence, the `wp-config.php` settings, the URL replacement in the database, the write freeze, the symptoms that follow a cutover and the rollback.",[37,41,68,71,74,77,80,90,126,129,138,142],{"type":38,"title":39,"body":40},"h2","The real risk: two databases that drift apart","A WordPress site is made of files, which you can copy safely, and a database, which changes with every visit: order, sign-up, comment, form entry, cart. As soon as you export the database, the old one keeps writing and your copy goes stale. As long as DNS points to the old server, the gap is invisible. On cutover day it becomes a loss: everything that arrived after the export exists only on the old server.\n\nThe method fits in one sentence: build and test the copy in advance, then freeze writes, take a last pass of files and database, and only then change DNS. The general order of a hosting change (TTL, e-mail, domain) is covered in another guide; this one deals with what is specific to WordPress.",{"type":42,"steps":43},"steps",[44,47,50,53,56,59,62,65],{"title":45,"body":46},"D-7: inventory the site","Note the PHP version, the plugins that write (shop, forms, bookings, subscriptions), the scheduled tasks and the payment gateways with their callback addresses.\n`wp core version`\n`wp plugin list --status=active`\n`wp cron event list`\nAlso note where e-mail lives: it will not move.",{"title":48,"body":49},"D-3: lower the TTL","Set the TTL of the site's A and AAAA records to 300 seconds, at least one old TTL period before the cutover. Do not touch MX or TXT records.",{"title":51,"body":52},"D-2: first full copy","Files: `rsync -az --info=progress2 user@old-server:\u002Fpath\u002Fto\u002Fsite\u002F \u002Fpath\u002Fto\u002Fsite\u002F`\nDatabase: `wp db export site.sql --single-transaction` on the old server, then `wp db import site.sql` on the new one. Time both: that duration sizes the freeze window.",{"title":54,"body":55},"D-2: isolate the copy","On the copy, add `define('DISABLE_WP_CRON', true);` to `wp-config.php` and switch off the shop's e-mails. The copy holds real customers: a replayed scheduled event would send duplicate messages.",{"title":57,"body":58},"D-1: test through the hosts file","Browse the copy under its real name without touching public DNS (dedicated section below). Note every anomaly, fix it, start over.",{"title":60,"body":61},"D-day, quiet hour: freeze and take the last difference","Put the source in maintenance with `wp maintenance-mode activate`, redo the database export, resynchronise files with the same `rsync` command, import, then retest through hosts.",{"title":63,"body":64},"D-day: switch DNS and issue the certificate","Replace the A and AAAA records with the new server's addresses, leaving MX alone. Issue the certificate as soon as the name points at the destination, then remove `DISABLE_WP_CRON`.",{"title":66,"body":67},"D-day to D+14: verify, keep, cut","Check the old server's logs and the checklist below. Keep the old server in maintenance, untouched, for at least two weeks before cancelling it.",{"type":38,"title":69,"body":70},"Copy files and database, then set up wp-config.php","Copy files with `rsync` rather than an archive uploaded by hand: it keeps permissions, resumes after an interruption and only retransfers what changed, which makes the last pass very short. For the database, prefer `wp db export` or `mysqldump --single-transaction`, which produces a consistent export without locking InnoDB tables.\n\nOn the new server, `wp-config.php` is the first file to reread. `DB_NAME`, `DB_USER` and `DB_PASSWORD` must match the database created on the destination. `DB_HOST` is often `localhost`, but some hosts require a separate host, a port (`host:3307`) or a socket. Also check `$table_prefix`, which must match the imported tables, otherwise WordPress thinks the installation is empty. Finally, `WP_HOME` and `WP_SITEURL`, if defined in the file, override the database: an old value left here sends every visitor back to the old address.",{"type":38,"title":72,"body":73},"Replace URLs in the database without breaking serialized data","WordPress stores absolute addresses in posts, options, menus and theme and plugin settings, often inside serialized values whose length is written into the data. A `sed` on the export changes the string length without fixing that counter, and the value becomes unreadable: empty widgets, reset theme. `wp search-replace` reads and rewrites these structures correctly.\n\nReplacement is only needed if the address changes: new domain name, a move from `http` to `https`, or a copy built under a temporary address. If you test through the hosts file under the real name, there is nothing to replace. Always start with `wp search-replace 'http:\u002F\u002Fold.your-domain.com' 'https:\u002F\u002Fyour-domain.com' --all-tables --skip-columns=guid --dry-run`, which counts replacements without writing anything. If the number surprises you, stop. Then rerun without `--dry-run`, on the copy and never on the source, followed by `wp cache flush`. The `--skip-columns=guid` option leaves post identifiers untouched, which RSS readers use to recognise content they have already seen.",{"type":38,"title":75,"body":76},"Test the copy before DNS, through the hosts file","The hosts file on your computer tells your machine alone where to send a domain name, without touching public DNS. Add a line `203.0.113.10 your-domain.com www.your-domain.com` (the new server's address) to `\u002Fetc\u002Fhosts`, or to `C:\\Windows\\System32\\drivers\\etc\\hosts` on Windows. For a single request, `curl --resolve your-domain.com:443:203.0.113.10 -I https:\u002F\u002Fyour-domain.com\u002F` does the same without changing the machine. Clear the browser cache, which keeps the previous resolution.\n\nTest journeys, not the home page: admin login, a deep page (which reveals permalinks), a media upload, search and, for a shop, a cart through to the payment page. The copy's certificate may not be issued yet (see below): a warning is then expected, a blank page or a PHP error is not. Remove the hosts line afterwards: a forgotten entry makes you believe for weeks that the cutover has not happened.",{"type":38,"title":78,"body":79},"Freeze writes for sites with orders and forms","A brochure site can switch without freezing anything: the possible loss comes down to a comment. As soon as the site takes payments or collects requests, you need a window without writes. The sequence: announce a short maintenance, put the source in maintenance, redo the database export, resynchronise files (`rsync` now only transfers the difference, often just the new media), import on the destination, replay the `search-replace` if there is one, test through hosts, then change DNS. The old server stays in maintenance until the end.\n\nThis window lasts a few minutes for a database of ordinary size, and it is a duration to measure during the first copy. Payment gateways are a special case: they send notifications to the configured address and replay failed ones under their own retry policy, to be confirmed in their documentation. Check in their dashboard that callbacks refused during maintenance are replayed once the new site is live.",{"type":81,"title":82,"items":83},"ul","What writes during the window, and how to stop it",[84,85,86,87,88,89],"**WooCommerce orders** — the source's maintenance mode blocks them; a customer with a cart already open finds an unavailable site, hence the prior announcement.","**Contact and quote forms** — depending on the plugin, entries live in the database, in a file or are only sent by e-mail; find where each one writes, because an entry stored on the old server after the export is lost.","**Comments and sign-ups** — close them in the discussion and registration settings for the length of the window if maintenance mode is not possible.","**Scheduled tasks** — `wp cron event list` lists them; the copy must not run the same ones as the source before the cutover, otherwise reminders and renewal e-mails go out twice.","**Incoming webhooks** — payment gateways, CRM, shipping tool: their address points at a domain name, so at the new server after the cutover; check that signing secrets were copied with the settings.","**Visitors still reaching the source** — a long-cache resolver sends them there after the cutover; the old server can relay them to the new one while keeping the `Host` header, a step reserved for teams comfortable with reverse proxies.",{"type":91,"title":92,"headers":93,"rows":97},"comparison","Post-cutover symptoms and their cause",[94,95,96],"Symptom","Likely cause","Fix",[98,102,106,110,114,118,122],[99,100,101],"Redirect loop (`ERR_TOO_MANY_REDIRECTS`)","WordPress forces `https` but only sees `http`: a proxy, CDN or load balancer terminates TLS, or the CDN's SSL mode is Flexible","Full (strict) mode on the CDN, or read `X-Forwarded-Proto` in `wp-config.php` to set `$_SERVER['HTTPS']`",[103,104,105],"Error establishing a database connection","Wrong `DB_HOST`, credentials or user privileges; MySQL server stopped","`wp db check`, then a manual test with `mysql -h host -u user -p`; grant privileges on the database",[107,108,109],"Empty installation or install screen","`$table_prefix` differs from the real table prefix","Align the prefix with the output of `SHOW TABLES`",[111,112,113],"Mixed content: broken padlock, blocked images","`http:\u002F\u002F` addresses left in posts or options","`wp search-replace` from `http:\u002F\u002F` to `https:\u002F\u002F`, after a `--dry-run`",[115,116,117],"Posts return 404, home page works","Rewrite rules missing: `.htaccess` not copied or not read, or nginx without `try_files`","`wp rewrite flush --hard`; on nginx, `try_files $uri $uri\u002F \u002Findex.php?$args;`",[119,120,121],"Menus, widgets or theme reset","Serialized values corrupted by a blind replacement","Reimport the export, then redo the replacement with `wp search-replace`",[123,124,125],"Old addresses still in pages","`WP_HOME` or `WP_SITEURL` hard-coded, or page cache not purged","Fix the constants, `wp cache flush`, purge the page cache",{"type":38,"title":127,"body":128},"E-mail and certificate: two topics that do not follow the site","Web hosting and e-mail are two separate services, carried by different DNS records: MX for receiving, TXT (SPF, DKIM, DMARC) for sending. A web migration must change neither the MX records nor the mailboxes. Check it before and after with `dig MX your-domain.com +short` and `dig TXT your-domain.com +short`: both outputs must be identical. The trap is sending: if the SPF lists the old server's address (`ip4:`) and WordPress sends its e-mails from the new one, order notifications end up in spam. Add the new address to the SPF or, better, route WordPress through an authenticated SMTP.\n\nThe certificate follows the address. With HTTP validation (`certbot --nginx` or cPanel AutoSSL), the certificate authority must reach the new server under the real name, which is only possible after the cutover: issue it right away and expect a warning before then, including during your hosts-file tests. If that delay is unacceptable, DNS validation lets you issue the certificate before the cutover, at the cost of API access to the zone. Then check the expiry with `curl -vI https:\u002F\u002Fyour-domain.com\u002F 2>&1 | grep -i expire`.",{"type":81,"title":130,"items":131},"What to check before cutting the old server",[132,133,134,135,136,137],"**Traffic really has moved** — follow the old server's access logs with `tail -f`: only bots and long-cache resolvers should appear, then nobody.","**Writes land in the right place** — place an order with the gateway in test mode, submit a form, and find both in the database and by e-mail.","**Volumes are comparable** — compare row counts of key tables (`wp db query \"SELECT COUNT(*) FROM wp_posts\"`, adapt the prefix) and the size of `wp-content\u002Fuploads` against the source.","**Scheduled tasks run** — `wp cron event run --due-now` must run without errors; wire up a real system cron if traffic is low.","**Mail is intact** — MX, SPF and DKIM unchanged, and a test message received in a real mailbox.","**A final backup exists** — database export and copy of the old server's files, archived off that server, before any shutdown.",{"type":139,"title":140,"body":141},"tip","Decide the rollback before the cutover","Rollback is simple as long as the old server stays intact: put the old address back in the A and AAAA records, using the low TTL already set. It stops being simple once the new database has received orders, because going back erases them. So fix the rule before D-day: rollback is possible without condition until the first real write on the new site, and you fix forward beyond that. Keep the old server intact and paid for at least two weeks: that is the price of reversibility.",{"type":38,"title":143,"body":144},"Across a client portfolio, the method becomes a routine","Write this sequence once, with the measured durations, and reuse it from one client to the next: inventory sheet, freeze window, checklist. The client does not need to understand DNS; they need to know when the maintenance will happen and who confirms that everything works. On ServOrbit, reseller hosting groups your clients' accounts, and assisted migration is an option for the sites you would rather not move yourself. Domains, hosting plans and renewals are tracked from one space, under your brand.","A client portfolio under a single brand","Your clients' domains, hosting plans and renewals are tracked from one agency space, under your brand. Assisted migration is available as an option for the sites you would rather not move yourself.","Discover the agency offer","\u002Fsolutions\u002Fagences",[150,169,185],{"id":151,"slug":152,"slugs":153,"title":157,"excerpt":158,"readTime":17,"views":18,"isPinned":19,"publishedAt":159,"updatedAt":160,"category":161,"categories":166,"featuredImage":29,"bgImage":30,"posterImage":168,"relatedSolution":29},258,"changing-web-host-in-morocco-the-no-downtime-method",{"fr":154,"en":152,"ar":155,"es":156},"changer-hebergeur-au-maroc-sans-coupure","تغيير-مستضيف-الويب-في-المغرب-الطريقة-دون-انقطاع","cambiar-de-hosting-en-marruecos-sin-cortes","Changing Web Host in Morocco: The No-Downtime Method","Changing web host from Morocco: the order of operations, DNS TTL, e-mail, transferring a .ma through the ANRT, and billing continuity.","2026-08-13T00:00:00+00:00","2026-09-07T11:26:10+00:00",{"id":162,"name":163,"slug":164,"color":165,"icon":164},5,"Comparison","comparatif","bg-info\u002F10 text-info",[167],{"id":162,"name":163,"slug":164,"color":165,"icon":164},"\u002Fblog\u002Fcovers\u002Fchanger-hebergeur-au-maroc-sans-coupure-poster.svg",{"id":170,"slug":171,"slugs":172,"title":176,"excerpt":177,"readTime":178,"views":18,"isPinned":19,"publishedAt":179,"updatedAt":180,"category":181,"categories":182,"featuredImage":29,"bgImage":30,"posterImage":184,"relatedSolution":29},528,"shared-hosting-or-vps-for-agency-client-site",{"fr":173,"en":171,"ar":174,"es":175},"choisir-vps-ou-mutualise-site-client-agence","استضافة-مشتركة-أم-vps-لموقع-عميل-الوكالة","hosting-compartido-o-vps-para-sitio-de-cliente-agencia","VPS or shared hosting for a client site: a decision grid","Shared hosting or VPS for a client site: comparison table, monthly maintenance hours, a five-question grid and the signals that call for a migration.",9,"2026-10-29T00:00:00+00:00","2026-10-29T15:45:55+00:00",{"id":162,"name":163,"slug":164,"color":165,"icon":164},[183],{"id":162,"name":163,"slug":164,"color":165,"icon":164},"\u002Fblog\u002Fcovers\u002Fchoisir-vps-ou-mutualise-site-client-agence-poster.svg",{"id":186,"slug":187,"slugs":188,"title":192,"excerpt":193,"readTime":194,"views":18,"isPinned":19,"publishedAt":195,"updatedAt":196,"category":197,"categories":201,"featuredImage":29,"bgImage":30,"posterImage":203,"relatedSolution":29},130,"migrate-your-entire-portfolio-to-servorbit-in-a-single-order",{"fr":189,"en":187,"ar":190,"es":191},"migrer-portefeuille-servorbit-assistant","انقل-محفظتك-بالكامل-إلى-servorbit-في-طلب-واحد","migrar-cartera-servorbit-asistente","Migrate Your Entire Portfolio to ServOrbit in a Single Order","Domains and cPanel accounts together: the migration assistant lets you bring your portfolio over to ServOrbit in one guided order, with no service interruption.",2,"2026-06-23T00:00:00+00:00","2026-10-21T15:21:30+00:00",{"id":178,"name":198,"slug":199,"color":200,"icon":199},"News","actualites","bg-sky-500\u002F10 text-sky-400",[202],{"id":178,"name":198,"slug":199,"color":200,"icon":199},"\u002Fblog\u002Fcovers\u002Fmigrer-portefeuille-servorbit-assistant-poster.svg",1793414262298]