Cambiar el sitio principal en WordPress Multisite
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.

¿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í:
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 claveshome
ysiteurl
- En
wp_2_options
las claveshome
ysiteurl
(en tu caso seríawp_15_options
) - En
wp_blogs
la columnadomain
para ambos sitios con ID1
y2
(respectivamente15
)
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).
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
:
(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 enfoo.wp.tmp
yfoo.wp.tmp
se convierte enwp.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 |
+---------+--------------------+---------------------+---------------------+
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 conhttp://foo.wp.tmp
- Buscar
http://3a4b522a.wp.tmp
y reemplazarlo conhttp://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.

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

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

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.

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

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.

Una alternativa más sencilla (que no implica modificar ninguna línea de código) es usar el plugin all-in-one-migration:
- exporta
new.example.com
conID 15
y - vuelve a importarlo en
example.com
conID 1

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.

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.
