Zamenjava URL-jev po menjavi domene z ukazom wp search-replace

WordPress Branje: 6 min

Če se tvoje spletno mesto WordPress seli na novo domeno ali uvajaš kopijo staging, stari naslov ni le na strani Nastavitve: je v besedilu prispevkov, v naslovih slik, v pripomočkih, v nastavitvah predloge in vtičnikov. Ukaz WP-CLI wp search-replace jih prepiše v enem koraku in, kar je najpomembnejše, ne pokvari niti serializiranih podatkov.

Če spletno mesto upravlja WP Toolkit, v preprostejšem primeru zamenjavo naslova opravi tudi točka Posodobi URL spletnega mesta v meniju ⋮ vrstice spletnega mesta. Ta članek prikazuje pot iz ukazne vrstice, ki vse pokaže in vse omogoči preveriti. Na gostovanju cPanel je WP-CLI na voljo v paketih z dostopom SSH; osnove opisuje članek o uporabi WP-CLI.

Zakaj preprosta zamenjava s SQL ni dobra?

WordPress in vtičniki veliko nastavitev hranijo v serializirani obliki PHP, ki pred vsako besedilo zapiše njegovo dolžino v bajtih: s:22:"https://regi-domain.hu". Če SQL REPLACE() ali urejevalnik besedil v datoteki SQL zamenja domeno, se besedilo spremeni, dolžina pa ne. PHP vrednosti takrat ne more prebrati nazaj, WordPress uporabi privzeto, pripomočki ali nastavitve vtičnikov pa postanejo prazni brez sporočila o napaki.

Infografika: dolžina serializirane vrednosti se pri zamenjavi s SQL pokvari, wp search-replace jo preračuna

Zahrbtna podrobnost: če sta stara in nova domena slučajno enako dolgi, preprosta zamenjava navidez deluje, napaka pa se pokaže šele pri naslednji selitvi. Pri besedilih s šumniki dolžina šteje v bajtih, črka s šumnikom je 2 bajta, zato tudi ročno popravljanje ni smiselno.

wp search-replace serializirano vrednost razpakira, zamenja znotraj strukture, nato jo zapiše nazaj in preračuna dolžine.

1. Varnostna kopija

Preden kaj spremeniš, shrani podatkovno bazo. Na strežnikih cPanel aWh wp db export ni uporaben (funkcija PHP proc_open je onemogočena), zato neposredno uporabi ukaz mysqldump. Pripravo datoteke ~/.my.cnf z geslom podatkovne baze prikazuje članek o uporabi WP-CLI.

cd ~/public_html
mysqldump --single-transaction --no-tablespaces "$(wp config get DB_NAME)" > ~/domainvaltas-elott.sql
tail -1 ~/domainvaltas-elott.sql

Zadnja vrstica naj bo -- Dump completed on …. Če gre kaj narobe, obnovitev:

mysql "$(wp config get DB_NAME)" < ~/domainvaltas-elott.sql

Ustrezni sta tudi funkcija WP Toolkit Varnostna kopija/obnovitev in dnevna varnostna kopija JetBackup (možnosti varnostnega kopiranja), vendar se iz sveže datoteke SQL lahko obnoviš v nekaj minutah.

2. Preštej, kaj boš zamenjal

Išči golo domeno, brez protokola. Urejevalnik blokov in veliko vtičnikov naslov hrani v JSON, v obliki https:\/\/regi-domain.hu; iskanje https://regi-domain.hu teh ne najde, regi-domain.hu pa jih.

wp db search 'regi-domain.hu' --all-tables --stats

Na koncu izpisa je število zadetkov, na primer Success: Found 7 matches.

3. Poskusni zagon

wp search-replace 'regi-domain.hu' 'uj-domain.hu' --all-tables --skip-columns=guid --precise --report-changed-only --dry-run

Terminal v cPanelu: poskusni zagon wp search-replace s številom zamenjav po tabelah

Stikala:

  • --dry-run: ničesar ne zapiše, le pokaže, koliko zamenjav bi opravil v katerem stolpcu katere tabele.
  • --all-tables: pregleda tudi lastne tabele vtičnikov (na sliki je na primer tudi tabela WooCommerce). Če v podatkovni bazi hraniš tabele več spletnih mest, namesto tega uporabi stikalo --all-tables-with-prefix, da se dotakne le tabel s tvojo predpono.
  • --skip-columns=guid: polje guid prispevkov je stalni identifikator, ne naslov; če ga prepišeš, bralniki virov vse stare prispevke vidijo kot nove.
  • --precise: vsako vrstico obdela s PHP; je počasnejše, a pri zapletenih podatkih graditeljev strani zanesljivejše.
  • --report-changed-only: izpiše le tabele, kjer bo res prišlo do zamenjave.

Rezultat primerjaj s številom iz 2. koraka. Če je zamenjav veliko več, je iskano besedilo del tudi drugega imena (na primer pelda.hu je tudi v naslovu masikpelda.hu); takrat zamenjaj z daljšo, natančnejšo obliko. Če jih je veliko manj, si verjetno v mapi napačnega spletnega mesta.

4. Zamenjava

Zaženi isti ukaz brez --dry-run, da se izvede natanko tisto, kar si preveril:

wp search-replace 'regi-domain.hu' 'uj-domain.hu' --all-tables --skip-columns=guid --precise --report-changed-only

Zadnja vrstica je Success: Made N replacements., kjer je N enak številu iz poskusnega zagona. Pri namestitvi z več spletnimi mesti (multisite) dodaj stikalo --network, sicer se spremeni le naslov glavnega spletnega mesta.

5. S HTTP na HTTPS v ločenem koraku

Zamenjave domene in protokola ne združuj v eno iskanje. Najprej zamenjaj domeno, nato na novi domeni protokol:

wp search-replace 'http://uj-domain.hu' 'https://uj-domain.hu' --all-tables --skip-columns=guid --precise --report-changed-only
wp option update siteurl 'https://uj-domain.hu'
wp option update home 'https://uj-domain.hu'

Če le prehajaš na HTTPS, brez menjave domene, je ta korak celotno delo. Pri iskanju izpuščenih povezav http:// pomaga članek o mixed content.

6. Praznjenje predpomnilnikov

Dokler predpomnilnik streže staro vsebino, rezultat zamenjave ni viden:

wp cache flush
wp transient delete --all
wp rewrite flush

Nato v vmesniku vtičnika izprazni lastno shrambo vtičnika za predpomnjenje (na primer AccelerateWP, LiteSpeed Cache, WP Rocket), in če uporabljaš CDN, tudi tam.

7. Kar ni v podatkovni bazi

search-replace prepiše le podatkovno bazo. Poglej tudi datoteke:

grep -n "WP_HOME\|WP_SITEURL\|DOMAIN_CURRENT_SITE" ~/public_html/wp-config.php
grep -rn "regi-domain\.hu" ~/public_html/.htaccess ~/public_html/wp-content/themes/

Če je v datoteki wp-config.php WP_HOME ali WP_SITEURL s starim naslovom, ta prepiše podatkovno bazo: zamenjava je brezhibna, viden pa je stari naslov, polja na strani Nastavitve pa so siva. Te vrstice popravi ali izbriši. Poleg tega preveri naslove, vžgane v predlogo, preusmeritve v .htaccess, nastavitve CDN, vtičnikov SMTP in statistike ter povratne naslove, registrirane pri zunanjih storitvah (plačilni prehod, API).

Elementor svojo vsebino hrani v dvakrat kodiranem JSON, absolutni naslovi pa so tudi v njegovih prevedenih datotekah CSS. Uporabi funkcijo Replace URL na strani Tools (Orodja) menija Elementor, nato znova ustvari CSS:

wp elementor flush-css

Tudi drugi graditelji strani (Divi, Beaver Builder, WPBakery) imajo lasten predpomnilnik CSS; izprazni ga, preden skleneš, da zamenjava ni uspela.

Preverjanje

wp option get siteurl && wp option get home
wp db search 'regi-domain.hu' --all-tables --stats
curl -sI https://uj-domain.hu/ | head -5
curl -s https://uj-domain.hu/ | grep -c 'regi-domain\.hu'

siteurl in home naj kažeta nov naslov, wp db search naj najde ujemanje kvečjemu v stolpcu guid, odgovor curl -sI naj bo 200 in naj ne preusmerja nazaj na staro domeno, zadnji ukaz pa naj izpiše 0. Če ni ničla, je stari naslov ostal na enem od mest, naštetih v 7. koraku.

Nato v skrbniškem vmesniku odpri strani, ki hranijo serializirane nastavitve: Videz › Gradniki, Prilagajalnik, dostavne cone WooCommerce in predloge graditelja strani. Če je katera prazna, kjer je bila prej nastavitev, obnovi varnostno kopijo in zamenjavo znova zaženi s stikalom --precise.

Pogoste napake

Nič zamenjav, čeprav je stara domena povsod. Zagnal si ga v napačni mapi (preveri: wp option get siteurl) ali je naslov shranjen drugače, kot si iskal. Išči krajšo obliko: wp db search 'regi-domain' --all-tables --stats.

Zamenjava je uspela, stran pa preusmerja na stari naslov. Najpogostejši vzroki po vrsti: WP_HOME/WP_SITEURL v datoteki wp-config.php, neizpraznjen predpomnilnik, CDN, ki streže stari naslov, ali preusmeritev v datoteki .htaccess.

Podmesta omrežja več spletnih mest so ostala na starem naslovu. Izpuščeno je stikalo --network ali konstanta DOMAIN_CURRENT_SITE datoteke wp-config.php še vsebuje staro domeno. Popravi, znova zaženi s stikalom --network in preveri: wp site list --field=url.

Živa spletna trgovina. Pri spletni trgovini za čas zamenjave ustavi naročila (na primer z načinom vzdrževanja), preveri rezultat in šele nato trgovino znova odpri. Če menjava domene prinaša tudi selitev gostovanja, celoten postopek opisuje članek o selitvi WordPressa.

Nazaj: WordPress – članki (45)