Schimbarea site-ului principal în WordPress Multisite

12 iul. 2016, 09:40:55
Vizualizări: 29.5K
Voturi: 10

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ă.

2
Comentarii

Doar pentru cazul în care nu este o greșeală de tipar mai sus, ar trebui să fie cu majusculă BLOG_ID_CURRENT_SITE, iar cred că SITE_ID_CURRENT_SITE trebuie să rămână 1 (pentru a se potrivi cu tabela wp_site). Consultați codul din wp-includes/ms-settings.php care folosește acestea pentru a configura $current_site->blog_id - evident, aveți nevoie de DOMAIN_CURRENT_SITE, PATH_CURRENT_SITE setate etc. Nu știu dacă corectarea acestora va rezolva problema. Nu am un multisite cu subdomenii pentru a verifica: pot exista și căi în wp_X_options pe care ar trebui să le modificați: poate fi necesar să faceți depanarea în starea defectuoasă pentru a înțelege ce nu funcționează corect.

Rup Rup
12 iul. 2016 12:19:17
Toate răspunsurile la întrebare 2
6
14

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:

lista site-uri rețea

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 cheile home și siteurl
  • În wp_2_options cheile home și siteurl (în cazul dumneavoastră acesta ar fi wp_15_options)
  • În wp_blogs coloana domain pentru ambele site-uri cu ID-ul 1 și 2 (respectiv 15)

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ă.)

adminer editare wp_options

Î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:

adminer editare 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 devine foo.wp.tmp și
  • foo.wp.tmp devine wp.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 |
+---------+--------------------+---------------------+---------------------+

lista site-uri rețea actualizată

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 cu http://foo.wp.tmp
  • Căutați http://3a4b522a.wp.tmp și înlocuiți-l cu http://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.

10 aug. 2016 21:07:11
Comentarii

+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.

birgire birgire
10 aug. 2016 22:35:24

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

David David
11 aug. 2016 01:41:13

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.

birgire birgire
11 aug. 2016 01:53:01

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

Gyuri Gyuri
9 oct. 2018 10:41:05

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.

David David
10 oct. 2018 18:02:56

Mulțumesc, asta m-a ajutat cu o lansare deosebit de complicată.

martinedwards martinedwards
14 nov. 2018 10:53:12
Arată celelalte 1 comentarii
3

O alternativă mai ușoară (care nu implică modificarea vreunei linii de cod) este să folosești plugin-ul all-in-one-migration:

  1. exportează new.example.com cu ID 15 și
  2. reimportează-l pe example.com cu ID 1
25 nov. 2018 16:43:45
Comentarii

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.

Matt Beckman Matt Beckman
4 oct. 2019 00:55:46

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.

Alex Balcanquall Alex Balcanquall
15 ian. 2022 21:15:05

Este important de menționat că plugin-ul All-in-one-migration nu oferă această funcționalitate fără a achiziționa Extensia pentru Multisite care "începe de la 199$".

Peter Højlund Andersen Peter Højlund Andersen
27 ian. 2022 20:03:26