Schimbarea site-ului principal în WordPress Multisite
Rulăm mai multe site-uri pe subdomenii într-un mediu WordPress Multisite și dorim să mutăm site-ul principal din rădăcină într-un subdomeniu astfel:
Site-ul curent este example.com
cu ID 1
(nu poate fi redenumit deoarece câmpul este setat și needitabil)
Noul site este new.example.com
cu ID 15
(am încercat să-l redenumesc la example.com
)
Am urmat câteva instrucțiuni pentru comutare care implicau redenumirea site-urilor și actualizarea fișierului wp-config.php
pentru a seta noul ID 15 pentru SITE_ID_CURRENT_SITE
și Blog_ID_CURRENT_SITE
. Rezultatul a fost că site-ul principal nu s-a schimbat și panoul de administrare s-a stricat.
Există o modalitate directă de a schimba site-ul principal și de a-l înlocui cu conținutul site-ului de pe subdomeniu fără a importa postări/pagini și plugin-uri?
ACTUALIZARE:
Mulțumesc pentru aceste sfaturi. Concluzia mea, bazată pe ce am văzut în baza de date, ce am citit și ce am primit de la voi este că noul site de pe subdomeniu care va înlocui site-ul principal trebuie să aibă numele tabelelor de bază și ID-ul 1, căile actualizate etc. Singura mea îngrijorare este că după schimbarea acestora, administrarea rețelei va avea probleme -- deci practic trebuie să compar tabelele de bază (wp_options etc) cu cele echivalente (wp_x_options etc) pentru a vedea dacă există ceva unic legat de administrarea rețelei în acele tabele de bază.

Patru ani și niciun răspuns? Deci să începem…-
Să luăm următoarea configurație de rețea ca exemplu (folosesc comanda listă site din WP-CLI):
$ wp site list
+---------+--------------------+---------------------+---------------------+
| blog_id | url | last_updated | registered |
+---------+--------------------+---------------------+---------------------+
| 1 | http://wp.tmp/ | 2016-08-04 08:39:35 | 2016-07-22 09:25:42 |
| 2 | http://foo.wp.tmp/ | 2016-07-22 09:28:16 | 2016-07-22 09:28:16 |
+---------+--------------------+---------------------+---------------------+
Lista de site-uri din rețea ar arăta astfel:
Vrem să folosim site-ul cu ID-ul 2
ca nou site rădăcină cu URL-ul http://wp.tmp/
. Aceasta este de fapt aceeași problemă descrisă în întrebare, doar cu alte valori pentru ID și URL-uri.
Partea relevantă pentru multi-site din wp-config.php
arată probabil astfel:
const MULTISITE = TRUE;
const DOMAIN_CURRENT_SITE = 'wp.tmp';
const PATH_CURRENT_SITE = '/';
const SITE_ID_CURRENT_SITE = 1;
const BLOG_ID_CURRENT_SITE = 1;
const SUBDOMAIN_INSTALL = TRUE;
Actualizarea setărilor site-ului în baza de date
WordPress utilizează tabelele wp_*_option
și wp_blogs
pentru a găsi blogul corespunzător pentru un anumit URL de solicitare și pentru a construi legături permanente corecte pentru acest blog. Deci trebuie să schimbăm valorile din următoarele trei tabele (pentru acest exemplu):
- În
wp_options
cheilehome
șisiteurl
- În
wp_2_options
cheilehome
șisiteurl
(în cazul dumneavoastră acesta ar fiwp_15_options
) - În
wp_blogs
coloanadomain
pentru ambele site-uri cu ID-ul1
și2
(respectiv15
)
Folosesc Adminer pentru asta, dar orice alt instrument de gestionare a bazei de date (PhpMyAdmin) funcționează la fel. (Capturile de ecran arată interfața în limba germană, dar cred că ideea este clară.)
În wp_options
(tabelul de opțiuni pentru site-ul cu ID-ul 1
) am schimbat valorile ambelor chei home
și siteurl
de la http://wp.tmp
la http://foo.wp.tmp
. (Captura de ecran de mai sus arată starea înainte de actualizare.)
Am făcut exact același lucru cu tabelul wp_2_options
, dar aici am schimbat valoarea de la http://foo.wp.tmp
la http://wp.tmp
.
Următorul pas este actualizarea tabelului wp_blogs
:
(Încă o dată, captura de ecran arată tabelul înainte de a face orice modificare.) Aici pur și simplu schimbați valorile din ambele site-uri în coloana
domain
:
wp.tmp
devinefoo.wp.tmp
șifoo.wp.tmp
devinewp.tmp
Acum trebuie să actualizați wp-config.php
pentru a gestiona corect noile date de configurare:
const MULTISITE = TRUE;
const DOMAIN_CURRENT_SITE = 'wp.tmp';
const PATH_CURRENT_SITE = '/';
const SITE_ID_CURRENT_SITE = 1;
const BLOG_ID_CURRENT_SITE = 2; // Acesta este noul ID al site-ului rădăcină
const SUBDOMAIN_INSTALL = TRUE;
În acest moment aveți din nou o rețea WordPress funcțională, dar cu un nou site rădăcină:
$ wp site list
+---------+--------------------+---------------------+---------------------+
| blog_id | url | last_updated | registered |
+---------+--------------------+---------------------+---------------------+
| 1 | http://foo.wp.tmp/ | 2016-08-04 08:39:35 | 2016-07-22 09:25:42 |
| 2 | http://wp.tmp/ | 2016-07-22 09:28:16 | 2016-07-22 09:28:16 |
+---------+--------------------+---------------------+---------------------+
Rețineți: în timpul acestui proces, site-ul dumneavoastră nu va fi disponibil și solicitările vor rezulta în erori neplăcute, așa că ați putea dori să configurați un răspuns 503 Service Unavailable
în fața instalării WordPress. Acest lucru poate fi făcut folosind .htaccess
.
Actualizarea conținutului din baza de date
Acum vine partea complicată. În acest moment, toate URL-urile din tabelele de conținut indică încă către resursele site-urilor vechi. Dar înlocuirea lor nu este atât de ușoară: Înlocuirea fiecărui http://foo.wp.tmp
cu http://wp.tmp
în primul pas și a fiecărui http://wp.tmp
cu http://foo.wp.tmp
în pasul următor va duce la faptul că toate fostele URL-uri vor indica către site-ul cu ID-ul 1 (http://foo.wp.tmp
).
Cea mai bună metodă ar fi să introduceți un pas intermediar:
- Căutați
http://foo.wp.tmp
și înlocuiți-l cu un slug preferabil unic:http://3a4b522a.wp.tmp
- Căutați
http://wp.tmp
și înlocuiți-l cuhttp://foo.wp.tmp
- Căutați
http://3a4b522a.wp.tmp
și înlocuiți-l cuhttp://wp.tmp
Toate aceste comenzi de căutare și înlocuire ar trebui să ignore cele trei tabele (*_options
*_blogs
) pe care le-am actualizat anterior, altfel ar strica configurația. De asemenea, ar putea fi util să verificați manual URL-urile din tabelul wp_*_options
în afara cheilor home
și siteurl
.
Aș sugera să folosiți comanda search-replace din WP-CLI pentru asta, deoarece poate gestiona date serializate și nu are limitările pe care le-ar putea avea HTTP.

+1 pentru o prezentare bună și detaliată. Ar fi util să avem o comandă personalizată wp-cli pentru asta ;-) Menționezi o întrebare „veche de 4 ani”, dar întrebarea a fost pusă pe 2016-07-12. PS: Am observat ieri că Adminer nu mai este disponibil în directorul de plugin-uri pe wordpress.org.

Ha, ar trebui să citesc aceste date de două ori. Adminer este de fapt o aplicație standalone care vine într-un singur fișier PHP. Nu este nevoie să folosești un plugin aici. Am scris un plugin care măcar îți permite să schimbi URL-ul unui site prin WP-CLI: https://github.com/inpsyde/wp-cli-site-url

da, sunt conștient de asta, am fost de câteva ori solicitat să extrag date de pe site-uri abandonate fără niciun acces ssh/ftp/cpanel etc. În acel caz, o versiune de plugin devine utilă ;-) Mulțumesc pentru link, pare un plugin util pe care l-ai construit acolo.

Răspuns excelent, sunt pur și simplu șocat că nimeni nu a creat un plugin pentru asta... Există vreun plugin pentru asta? 3 pași simpli! Și destul de determinist, de altfel. Cum ai dat de soluția asta? :D

S-ar putea să fie determinist, dar în WordPress aproape nimic nu este predictibil. În câțiva ani de WordPress profesional am avut ocazia doar de una sau de două ori să schimb site-ul principal într-un mediu existent. Cred că este un caz foarte rar și de aceea nu există un plugin pentru asta.

O alternativă mai ușoară (care nu implică modificarea vreunei linii de cod) este să folosești plugin-ul all-in-one-migration:
- exportează
new.example.com
cuID 15
și - reimportează-l pe
example.com
cuID 1

Sunt de acord. Am avut un sub-site care trebuia să înlocuiască site-ul principal. Am importat direct peste site-ul principal folosind All-in-one-Migration cu add-on-ul pentru multisite.

Deși acest proces migrează datele site-ului, nu schimbă site-ul principal - ID1 este locul unde se află toate setările de administrare și funcționalitățile multi-site, nu este clar dacă OP dorea să migreze datele site-ului sau să schimbe care este site-ul principal.
