Cambiar el sitio principal en WordPress Multisite

12 jul 2016, 09:40:55
Vistas: 29.5K
Votos: 10

Estamos ejecutando varios sitios en subdominios en un entorno WordPress Multisite y queremos cambiar el sitio principal desde la raíz a un subdominio de la siguiente manera:

El sitio actual es example.com con ID 1 (no se puede renombrar porque el campo está establecido y no es editable)

El nuevo sitio es new.example.com con ID 15 (intenté renombrarlo a example.com)

Seguí algunas instrucciones para hacer el cambio que involucraban renombrar los sitios y actualizar el archivo wp-config.php para establecer el nuevo ID de 15 para SITE_ID_CURRENT_SITE y Blog_ID_CURRENT_SITE. El resultado fue que el sitio principal no cambió y el panel de administración se desconfiguró.

¿Existe una manera directa de cambiar el sitio principal y reemplazarlo con el contenido del sitio en subdominio sin tener que importar posts/páginas y plugins?


ACTUALIZACIÓN:

Gracias por proporcionar estos consejos. Mi conclusión con lo que he visto en la base de datos, leído y obtenido de ustedes es que el nuevo sitio en subdominio que reemplazará al sitio principal necesita tener los nombres de las tablas base y el ID 1, además de actualizar las rutas, etc. Mi única preocupación es que después de cambiar estos elementos, el administrador de la red tendrá problemas -- así que básicamente necesito comparar las tablas base (wp_options etc) con sus equivalentes (wp_x_options etc) para ver si hay algo único relacionado con el administrador de la red en esas tablas base.

2
Comentarios

Por si acaso no es un error tipográfico anterior, debería ser en mayúsculas BLOG_ID_CURRENT_SITE, y creo que SITE_ID_CURRENT_SITE probablemente debe permanecer en 1 (para que coincida con la tabla wp_site). Consulta el código en wp-includes/ms-settings.php que utiliza estos para configurar $current_site->blog_id - obviamente necesitas tener DOMAIN_CURRENT_SITE, PATH_CURRENT_SITE configurados, etc. No sé si hacer esto correctamente resolverá el problema. No tengo un multisitio con subdominios para verificarlo: también puede haber rutas en wp_X_options que necesites cambiar: quizás necesites depurar el estado incorrecto para determinar qué está fallando.

Rup Rup
12 jul 2016 12:19:17
Todas las respuestas a la pregunta 2
6
14

¿Cuatro años y ninguna respuesta? Así que aquí vamos...

Tomemos la siguiente configuración de red como ejemplo (estoy usando el comando de lista de sitios de 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 |
+---------+--------------------+---------------------+---------------------+

La lista de sitios de la red se vería así:

Lista de sitios de la red

Queremos usar el sitio con ID 2 como el nuevo sitio raíz con la URL http://wp.tmp/. Este es en realidad el mismo problema descrito en la pregunta, solo que con otros valores para el ID y las URLs.

La parte relevante de multisitio en el wp-config.php probablemente se ve así:

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;

Actualizando configuraciones de sitio en la base de datos

WordPress usa las tablas wp_*_option y wp_blogs para encontrar el blog correspondiente a una URL solicitada y para construir enlaces permanentes adecuados para este blog. Por lo tanto, debemos cambiar los valores en las siguientes tres tablas (para este ejemplo):

  • En wp_options las claves home y siteurl
  • En wp_2_options las claves home y siteurl (en tu caso sería wp_15_options)
  • En wp_blogs la columna domain para ambos sitios con ID 1 y 2 (respectivamente 15)

Estoy usando Adminer para esto, pero cualquier otra herramienta de gestión de bases de datos (como PhpMyAdmin) también funciona. (Las capturas de pantalla muestran la GUI en alemán, pero supongo que la idea es clara).

Adminer editando wp_options

En wp_options (la tabla de opciones para el sitio ID 1) cambié los valores de ambas claves home y siteurl de http://wp.tmp a http://foo.wp.tmp. (La captura de pantalla anterior muestra el estado antes de la actualización).

Hice exactamente lo mismo con la tabla wp_2_options pero aquí cambié el valor de http://foo.wp.tmp a http://wp.tmp.

El siguiente paso es actualizar la tabla wp_blogs:

Adminer editando wp_blogs (De nuevo, la captura de pantalla muestra la tabla antes de realizar cualquier cambio). Aquí simplemente intercambias los valores de ambos sitios en la columna domain:

  • wp.tmp se convierte en foo.wp.tmp y
  • foo.wp.tmp se convierte en wp.tmp

Ahora debes actualizar el wp-config.php para manejar correctamente los nuevos datos de configuración:

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; // Este es el nuevo ID del sitio raíz
const SUBDOMAIN_INSTALL    = TRUE;

En este punto, tienes nuevamente un multisitio de WordPress funcional pero con un nuevo sitio raíz:

$ 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 de sitios de red actualizada

Recuerda: durante este proceso, tu sitio no estará disponible y las solicitudes terminarán en algunos errores desagradables, por lo que quizás quieras configurar una respuesta 503 Service Unavailable delante de tu instalación de WordPress. Esto se puede hacer usando .htaccess.

Actualizando el contenido de la base de datos

Ahora viene la parte complicada. En este momento, todas las URLs en las tablas de contenido siguen apuntando a los recursos de los sitios antiguos. Pero reemplazarlos no es tan sencillo: Reemplazar cada http://foo.wp.tmp con http://wp.tmp en el primer paso y cada http://wp.tmp con http://foo.wp.tmp en el siguiente paso terminará con todas las URLs anteriores apuntando al sitio ID 1 (http://foo.wp.tmp).

La mejor manera sería insertar un paso intermedio:

  • Buscar http://foo.wp.tmp y reemplazarlo con un slug preferiblemente único: http://3a4b522a.wp.tmp
  • Buscar http://wp.tmp y reemplazarlo con http://foo.wp.tmp
  • Buscar http://3a4b522a.wp.tmp y reemplazarlo con http://wp.tmp

Todos estos comandos de buscar y reemplazar deberían ignorar las tres tablas (*_options *_blogs) que actualizamos antes, de lo contrario romperían la configuración. También podrías revisar manualmente las URLs en la tabla wp_*_options fuera de las claves home y siteurl.

Sugeriría usar el comando search-replace de WP-CLI para esto, ya que puede manejar datos serializados y no tiene las limitaciones que podría tener HTTP.

10 ago 2016 21:07:11
Comentarios

+1 por un buen resumen detallado. Sería útil tener un comando personalizado de wp-cli para esto ;-) Mencionas una pregunta de "4 años", pero la pregunta se hizo el 2016-07-12. PD: Ayer noté que Adminer ya no está disponible en el directorio de plugins de wordpress.org.

birgire birgire
10 ago 2016 22:35:24

Ja, debería leer estas fechas dos veces. Adminer es de hecho una aplicación independiente que viene en un solo archivo PHP. No hay necesidad de usar el plugin aquí. Escribí un plugin que al menos te permite cambiar la URL de un sitio mediante WP-CLI: https://github.com/inpsyde/wp-cli-site-url

David David
11 ago 2016 01:41:13

sí, soy consciente de eso, me han pedido algunas veces extraer datos de sitios abandonados sin ningún acceso ssh/ftp/cpanel disponible. En ese caso, una versión en plugin resulta útil ;-) Gracias por el enlace, parece un plugin bastante práctico el que has creado.

birgire birgire
11 ago 2016 01:53:01

Excelente respuesta, simplemente estoy sorprendido de que nadie haya escrito un plugin para esto... ¿Hay algún plugin para esto? ¡3 sencillos pasos! Bastante determinista también. ¿Cómo se te ocurrió? :D

Gyuri Gyuri
9 oct 2018 10:41:05

Puede que sea determinista, pero en WordPress casi nada es predecible. En varios años de experiencia profesional con WordPress, solo he encontrado una o dos razones para cambiar el sitio principal en un entorno existente. Creo que es un caso límite raro y por eso no hay un plugin para ello.

David David
10 oct 2018 18:02:56

Gracias, esto me ayudó con un lanzamiento particularmente complicado.

martinedwards martinedwards
14 nov 2018 10:53:12
Mostrar los 1 comentarios restantes
3

Una alternativa más sencilla (que no implica modificar ninguna línea de código) es usar el plugin all-in-one-migration:

  1. exporta new.example.com con ID 15 y
  2. vuelve a importarlo en example.com con ID 1
25 nov 2018 16:43:45
Comentarios

De acuerdo. Teníamos un sub-sitio que necesitaba reemplazar al sitio raíz. Lo importamos directamente sobre el sitio raíz usando All-in-one-Migration con el complemento multisitio.

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

Si bien eso migra los datos del sitio, no cambia el sitio principal - ID1 es donde está todo el núcleo administrativo y las cosas del multisitio, no está claro si el OP quería migrar datos del sitio o migrar lo que es su sitio primario.

Alex Balcanquall Alex Balcanquall
15 ene 2022 21:15:05

Es importante señalar que el plugin All-in-one-migration no incluye esta función sin pagar por la Extensión Multisitio que "comienza en 199$".

Peter Højlund Andersen Peter Højlund Andersen
27 ene 2022 20:03:26