Por qué una preproducción y no probar en el sitio en línea
Un plugin de formularios que ya no se inicia, un tema que pierde su maquetación, la pantalla «Ha habido un error crítico en este sitio»: estos fallos llegan tras una actualización que parecía inofensiva. Con tres sitios que gestionar, basta la prudencia. Con treinta, se actualiza a ciegas o se deja de actualizar, y entonces lo que cuesta es la vulnerabilidad sin corregir.
Una preproducción es una copia viva del sitio, en una dirección distinta, con su propia base de datos. Se puede romper lo que se quiera, leer los errores, corregir y luego repetir en producción el paso ya validado. No sustituye a la copia de seguridad: hace que rara vez haga falta usarla.
Lo que le aporta la preproducción
- Actualizaciones sin sorpresas — cada cambio de núcleo, tema o plugin se ve en pantalla antes de llegar a los visitantes.
- Un diagnóstico legible — los errores van a un registro, no delante del cliente, y la causa se encuentra antes de que llame.
- Una revisión compartida — el cliente o su jefe de proyecto valida en una dirección aparte, sin tocar el sitio público.
- Un diario de cambios — anota la versión anterior y la nueva de cada plugin, y repite exactamente lo mismo en producción.
- Un ensayo de novedades — tema nuevo, constructor de páginas nuevo, módulo de pago nuevo: todo se juzga sobre una copia.
- Una vuelta atrás preparada — la copia de seguridad se hace y se comprueba antes de la prueba, no después del incidente.
Requisitos con cifras antes de copiar
Cuente tres veces el tamaño del sitio en línea en espacio de disco: el sitio, su copia y la exportación de la base. Mida wp-content con du -sh wp-content y la base en phpMyAdmin o con wp db size. Prevea un subdominio por cliente, por ejemplo staging.your-domain.com, y la misma versión de PHP que producción: una preproducción con un PHP más reciente valida una configuración que no es la del cliente. Esa versión se lee en Herramientas › Salud del sitio › Información, y las versiones aún soportadas se mantienen al día en php.net/supported-versions.php.
Hace falta además un terminal con wp-cli (SSH en una cuenta que lo permita, o un VPS). Esta guía describe la copia manual, primero los archivos y luego la base, que muestra exactamente qué se copia. Si WP Toolkit está disponible en su cuenta, su clonado produce esa copia por usted (consulte la guía «Instalar WordPress desde cPanel»); el resto de la guía (noindex, autenticación, correos cortados, pruebas) se aplica entonces igual. Para instalar un sitio nuevo desde cPanel, consulte la guía dedicada.
Montar la preproducción, paso a paso
Hacer copia de seguridad de producción antes de escribir nada
Desde la carpeta del sitio en línea:
mkdir -p ~/preprod-backupswp db export ~/preprod-backups/before-staging.sql --single-transactiontar -czf ~/preprod-backups/files-before-staging.tar.gz -C ~/public_html .
Compruebe que ambos archivos existen y no están vacíos conls -lh ~/preprod-backups. Las copias de seguridad del plan no eximen de este gesto: su frecuencia depende del plan, así que pueden tener varios días.Crear el subdominio y su carpeta
Cree
staging.your-domain.comen cPanel (la guía «Crear un subdominio en cPanel» detalla la pantalla) con una carpeta raíz propia, preferiblemente fuera depublic_html, por ejemplo~/staging.your-domain.com. Una carpeta dentro depublic_htmltambién sería accesible desde una dirección del sitio en línea. Espere a que se emita el certificado TLS del subdominio antes de probar.Copiar los archivos
rsync -a --exclude='wp-content/cache/' ~/public_html/ ~/staging.your-domain.com/
Adapte la ruta de origen a la carpeta raíz del sitio del cliente. Sin terminal, el administrador de archivos de cPanel permite comprimir la carpeta, moverla y extraerla en la carpeta del subdominio.Crear una base y un usuario dedicados
En la sección de bases de datos MySQL de cPanel, cree una base nueva y un usuario, y concédale todos los privilegios solo sobre esa base. Luego abra el
wp-config.phpde la copia y cambieDB_NAME,DB_USERyDB_PASSWORD. Es el error más caro de esta guía: copiarwp-config.phpsin modificar esas tres líneas hace que la preproducción escriba en la base de producción.Importar la base
Desde la carpeta de la copia:
cd ~/staging.your-domain.comwp db import ~/preprod-backups/before-staging.sqlwp option get siteurl
La última orden debe mostrar todavía la dirección de producción: es normal, las URL aún no se han reemplazado. Si falla,wp-config.phpsigue apuntando a la base equivocada.Reemplazar las URL, primero en seco
wp search-replace 'https://your-domain.com' 'https://staging.your-domain.com' --all-tables --skip-columns=guid --dry-run
Lea el informe: enumera las tablas y el número de reemplazos. Después repita la misma orden sin--dry-run. WordPress guarda muchos ajustes como datos serializados, donde cada cadena lleva su longitud: unsedsobre la exportación cambia la longitud de la URL sin corregir esa cuenta, y los ajustes quedan ilegibles.wp search-replaceentiende esos datos y los reescribe correctamente.Fijar los ajustes de preproducción en wp-config.php
Añada, encima de la línea «That's all, stop editing»:
define('WP_ENVIRONMENT_TYPE', 'staging');define('DISABLE_WP_CRON', true);define('DISALLOW_FILE_EDIT', true);define('WP_DEBUG', true);define('WP_DEBUG_LOG', true);define('WP_DEBUG_DISPLAY', false);
Los errores van awp-content/debug.logsin mostrarse a los visitantes.WP_ENVIRONMENT_TYPEexiste desde WordPress 5.5 y admitelocal,development,stagingyproduction: permite que temas y plugins se adapten, pero no oculta el sitio a los buscadores, de ahí el paso siguiente.Cerrar el acceso y pedir el noindex
En Ajustes › Lectura, marque «Disuadir a los motores de búsqueda de indexar este sitio», o desde la línea de comandos:
wp option update blog_public 0. Añada después autenticación HTTP a la carpeta de la copia: un archivo.htpasswdcreado conhtpasswd -c ~/.htpasswd-staging client, y en el.htaccessde la carpeta las directivasAuthType Basic,AuthName "Preproduction",AuthUserFileapuntando a ese archivo yRequire valid-user. En su defecto, limite el acceso a una lista de IP.Comprobar la copia como lo haría un robot
curl -sI https://staging.your-domain.com/
La respuesta debe ser un401. Después, con las credenciales:curl -s -u client https://staging.your-domain.com/ | grep -i robots
Debe verse una etiquetameta name='robots'que contenganoindex. Si un plugin de caché o de SEO la sustituye, es ese el que hay que configurar. Por último, compruebe que el tema no contiene ninguna dirección de producción escrita a mano:grep -r "https://your-domain.com" wp-content/themes.Integrar la preproducción en su rutina de agencia
Convierta este montaje en una plantilla: un subdominio por cliente, en la cuenta cPanel del cliente, con la misma lista de comprobación. El orden de las operaciones para trasladar un sitio a otro alojamiento lo cubre la guía «Migrar un sitio WordPress de cliente sin cortes»; la preproducción descrita aquí es una herramienta duradera, no un paso de la migración.
Aislar de verdad: el noindex no basta
El noindex pide a los buscadores que no conserven una página; no impide que nadie la lea. Una preproducción abierta a todos acaba en un enlace pegado en un ticket, en un mapa del sitio o en una captura de pantalla, y entonces publica contenido duplicado de producción. Las dos protecciones se complementan: el noindex indica a los buscadores que no indexen, y la autenticación HTTP o la lista de IP prohíbe el acceso.
Una trampa: si bloquea el subdominio con robots.txt, un robot ya no lee la página y por tanto nunca ve la etiqueta noindex. Con la autenticación en su sitio, ese archivo no sirve de nada.
Neutralizar correos, pagos y tareas programadas
La copia contiene a los clientes reales del sitio: suscriptores, compradores, direcciones de pedidos. Todo lo que se envía solo debe cortarse antes de la menor prueba; de lo contrario, un recordatorio de carrito, un aviso de cita o una renovación de suscripción sale por duplicado desde la copia. Las tareas programadas de WordPress se disparan con las visitas: en preproducción, desactívelas con DISABLE_WP_CRON y ejecútelas a mano con wp cron event run --due-now cuando quiera probarlas.
Lista de comprobación antes de tocar un solo plugin
- Correos — plugin de envío en modo de prueba o redirigido a un buzón de revisión, notificaciones de la tienda desactivadas.
- Pagos — pasarela en modo de prueba, claves de producción retiradas de la copia, direcciones de retorno (webhooks) no declaradas para la preproducción.
- Tareas programadas —
DISABLE_WP_CRONdefinido, eventos pendientes listados conwp cron event list. - Edición de archivos —
DISALLOW_FILE_EDITactivo para no editar el código desde la administración. - Registro de errores —
WP_DEBUG_LOGactivo yWP_DEBUG_DISPLAYenfalse. - Integraciones de terceros — CRM, directorios, herramientas de estadísticas y claves de API de producción sustituidos o retirados.
- Buscadores — noindex fijado y autenticación en su sitio, comprobados con
curlcomo arriba.
Probar las actualizaciones, una a una
Liste lo que espera actualización con wp plugin list --update=available. Actualice después un plugin cada vez: wp plugin update nombre-plugin, recorra las páginas que importan (inicio, formulario de contacto, carrito, inicio de sesión) y lea el final del registro con tail -n 30 wp-content/debug.log. Pase al siguiente solo cuando el registro esté en calma. Haga lo mismo con el tema mediante wp theme update nombre-tema y luego con el núcleo mediante wp core update.
Anote en un diario de cambios, para cada línea, la versión anterior y la nueva. Esa es la lista que repetirá en producción, versión por versión, en lugar de copiar nada.
Cuando la actualización rompe: leer debug.log
El síntoma clásico es la pantalla «Ha habido un error crítico en este sitio». WordPress entra entonces en modo de recuperación y envía un enlace a la dirección de administración, lo que supone que el envío de correos funciona: en preproducción está neutralizado, así que no lo espere. La causa está en el registro: tail -n 40 wp-content/debug.log. Busque la última línea que empiece por PHP Fatal error, del tipo Call to undefined function o Cannot declare class, y anote la ruta del archivo: la carpeta bajo wp-content/plugins/ señala el plugin culpable. Desactívelo sin pasar por la administración con wp plugin deactivate nombre-plugin, y el sitio vuelve y usted sabe a quién señalar.
Solución de problemas: los otros síntomas que sí aparecen
- El sitio redirige a producción —
wp option get siteurlywp option get homemuestran aún la dirección antigua, o un constructor de páginas conserva URL escritas a mano; repita el reemplazo, con--precisesi hace falta. - «Error al establecer una conexión con la base de datos» —
DB_NAME,DB_USER,DB_PASSWORDoDB_HOSTde la copia son incorrectos, o el usuario no tiene derechos sobre la base nueva. - Imágenes o estilos cargados desde producción — las URL escapadas, como
https:\/\/en los datos JSON de los constructores, escaparon al reemplazo; repítalo con esa forma. - Bucle de inicio de sesión o cierre inmediato — las cookies pertenecen al dominio antiguo; bórrelas y compruebe
siteurlyhome. - La preproducción aparece en un buscador — el noindex se fijó demasiado tarde o un plugin lo sustituye; pase a la autenticación HTTP y solicite la retirada de la dirección.
Archivos o base: qué se traslada y cómo
Desplace la tabla
| Elemento | Dónde vive | Cómo trasladarlo a producción |
|---|---|---|
| Tema y tema hijo | Archivos | Desplegar la carpeta validada, o repetir `wp theme update` a la versión probada |
| Plugins | Archivos | Repetir `wp plugin update nombre-plugin --version=X` con la versión probada |
| Plugins de uso obligatorio (mu-plugins) | Archivos | Copiar el archivo validado, guardando el antiguo al lado |
| Medios subidos (uploads) | Archivos | No empujar nunca de preproducción a producción: producción sigue recibiendo medios nuevos |
| Ajustes de plugins | Base (opciones) | Rehacer el ajuste a mano en producción, o `wp option update`, nombrando la opción |
| Pedidos, formularios, cuentas, comentarios | Base | No pisar nunca: estos datos viven en producción |
| Tablas creadas por una actualización | Base | Dejar que el plugin las cree repitiendo la actualización en producción |
Pasar a producción y poder volver atrás
En un sitio transaccional, no importe nunca la base de preproducción en producción: durante sus pruebas llegaron en línea pedidos, altas y entradas de formulario, y una importación los borra. Repita en su lugar los cambios validados. Secuencia: copia de seguridad reciente (wp db export y archivo de los ficheros, como en el paso 1), wp maintenance-mode activate, actualizaciones en orden y a las versiones del diario, revisión de las páginas clave y luego wp maintenance-mode deactivate.
Para volver atrás, restaure primero los archivos: wp plugin install nombre-plugin --version=anterior --force o el archivo del paso 1. Restaure la base solo como último recurso, y solo si la actualización modificó tablas: se perdería todo lo entrado desde la copia, así que la exportación debe tener solo unos minutos. Conserve la copia hasta que el cliente haya aprobado el sitio en línea.
El reflejo de endurecimiento
Cuando la actualización esté validada, elimine la copia de la base de producción que queda en ~/preprod-backups y en la preproducción: una exportación completa contiene direcciones, pedidos y hashes de contraseñas de los clientes. No deje nunca WP_DEBUG activo en el sitio en línea, el registro puede contener rutas y consultas.
Una rutina que aguanta a escala de cartera
Una preproducción se juzga por su disciplina: siempre el mismo montaje, la misma lista de comprobación, el mismo diario. Para una agencia, la rutina cabe en una plantilla de procedimiento: un subdominio por cliente, una base dedicada, noindex más autenticación, correos cortados, actualizaciones una a una, despliegue por repetición. Funciona tanto mejor cuanto cada sitio de cliente vive en su propia cuenta, con sus copias de seguridad y accesos separados.