Todo sitio WordPress, desde un blog personal hasta una tienda WooCommerce de nivel empresarial, necesita un entorno staging. Hacer cambios directamente en un sitio web activo es la mayor fuente de tiempo de inactividad evitable en el ecosistema WordPress. Un sitio staging te da una copia privada de tu entorno de producción donde puedes probar actualizaciones, depurar problemas y desarrollar nuevas funcionalidades sin ningún riesgo para tus visitantes.
Esta guía te lleva a través de cada enfoque práctico para crear un sitio staging, pasar staging a producción de forma segura y construir un pipeline de despliegue profesional que escala desde un solo sitio hasta docenas de proyectos de clientes.
Por qué todo sitio WordPress necesita un entorno staging
El panel de administración de WordPress hace tentador hacer clic en “Actualizar” en plugins y temas sin pensarlo dos veces. Pero una sola actualización de plugin incompatible puede romper el diseño de tu sitio, hacer fallar el checkout de WooCommerce o incluso provocar una pantalla blanca de la muerte. En un sitio activo, eso significa ingresos perdidos y confianza dañada.
Un entorno staging resuelve esto proporcionando:
- Campo de pruebas seguro - prueba actualizaciones de plugins, cambios de versión PHP y modificaciones de temas sin tocar producción.
- Espacio de revisión del clientes - permite que los clientes aprueben cambios de diseño en una instancia WordPress real antes de que nada vaya a producción.
- Espacio de trabajo de desarrollo - construye funcionalidad personalizada, prueba integraciones REST API y experimenta con nuevos bloques de forma aislada.
- Red de seguridad para rollback - si algo se rompe en staging, producción queda intacta. Si algo se rompe después del despliegue, tienes un estado bueno conocido al que volver.
Las agencias WordPress profesionales tratan el staging como una parte innegociable de cada proyecto. El tiempo que inviertes en configurar un flujo de trabajo adecuado se amortiza la primera vez que previene una caída en producción.
Staging a nivel de hosting: el camino más rápido
La mayoría de los alojamientos WordPress gestionados incluyen ahora entornos staging como funcionalidad integrada. Este es el enfoque más sencillo para propietarios de sitios que quieren staging sin tocar la línea de comandos.
Kinsta
Kinsta proporciona un entorno staging con un clic para cada sitio en el panel MyKinsta. Crea un clon completo de tu sitio de producción, incluyendo archivos y base de datos, en un subdominio separado. Cuando estés listo, el botón “Push to Live” te permite desplegar todo el entorno staging o transferir selectivamente solo archivos o solo la base de datos.
WP Engine
WP Engine ofrece tres entornos por instalación: Development, Staging y Production. Puedes copiar datos entre entornos en ambas direcciones. Su sistema maneja la reescritura de URLs automáticamente, así que las referencias en la base de datos a tu dominio de producción se actualizan al copiar a staging y viceversa.
Cloudways
Cloudways proporciona staging a través de sus operaciones “Pull” y “Push”. Clonas tu aplicación de producción a un servidor staging, haces cambios y luego transfieres los cambios de vuelta. Cloudways maneja la sincronización de archivos y la migración de base de datos entre entornos.
Limitaciones del staging a nivel de hosting
Aunque las herramientas de staging del hosting son convenientes, tienen limitaciones. Estás atado al flujo de trabajo de ese alojamiento. Las fusiones de bases de datos pueden ser impredecibles si los editores de contenido están publicando activamente en producción mientras trabajas en staging. Y la mayoría de los alojamientos no soportan branching, múltiples entornos staging ni disparadores de despliegue automatizados. Para más control, necesitas enfoques basados en plugins o manuales.
Staging basado en plugins: sin SSH necesario
Si tu alojamiento no ofrece staging, o necesitas una solución más flexible, varios plugins de WordPress pueden crear y gestionar entornos staging directamente desde el panel de administración.
WP Staging
WP Staging es el plugin de staging más popular en el repositorio de WordPress. La versión gratuita crea un clon staging en un subdirectorio de tu cuenta de alojamiento existente. La versión Pro añade la capacidad de transferir cambios del staging de vuelta a producción.
Para crear un sitio staging con WP Staging:
- Instala y activa el plugin WP Staging desde el repositorio de WordPress.
- Navega a WP Staging en la barra lateral del admin y haz clic en “Create Staging Site”.
- Selecciona qué tablas de la base de datos y carpetas incluir en el clon.
- Haz clic en “Start Cloning” y espera a que el proceso finalice.
El sitio staging será accesible en tudominio.com/staging (o el nombre de subdirectorio que hayas elegido). El plugin añade automáticamente autenticación básica y cabeceras noindex a la copia staging.
BlogVault
BlogVault adopta un enfoque diferente al crear el sitio staging en su propia infraestructura. Esto significa que el staging no consume recursos de tu servidor de producción. BlogVault maneja copias de seguridad, creación de staging y fusiones con un clic. Es particularmente útil para sitios en alojamiento compartido donde los recursos del servidor son limitados.
Cuando los plugins se quedan cortos
El staging basado en plugins funciona bien para sitios centrados en contenido con actualizaciones ocasionales. Pero para sitios con desarrollo continuo, plugins personalizados o requisitos de despliegue complejos, eventualmente superarás el enfoque de plugins. Ahí es donde el staging manual con SSH y WP-CLI se vuelve esencial.
Staging manual vía SSH y WP-CLI
El staging manual te da control total sobre cada aspecto del proceso. Este es el enfoque utilizado por desarrolladores WordPress profesionales y agencias que gestionan múltiples proyectos de clientes.
Prerrequisitos
Antes de empezar, asegúrate de tener:
- Acceso SSH a ambos servidores, producción y staging
- WP-CLI instalado en ambos servidores
- Un subdominio staging configurado (ej.:
staging.tudominio.com) - Versiones PHP coincidentes en ambos entornos
Paso 1: sincronizar archivos con rsync
Usa rsync para copiar tus archivos WordPress de producción al servidor staging. Las flags --exclude impiden copiar archivos específicos del entorno que deben diferir entre staging y producción:
rsync -avz --delete \
--exclude='wp-config.php' \
--exclude='.htaccess' \
--exclude='wp-content/cache/' \
--exclude='wp-content/uploads/wpo-cache/' \
--exclude='wp-content/debug.log' \
production:/var/www/html/ \
staging:/var/www/staging/
La flag --delete asegura que los archivos eliminados de producción también se eliminan del staging, manteniendo ambos entornos sincronizados.
Paso 2: exportar e importar la base de datos
Exporta la base de datos de producción con mysqldump e impórtala en la base de datos staging:
# Exportar base de datos de producción
mysqldump -u db_user -p production_db > production_backup.sql
# Importar en base de datos staging
mysql -u staging_user -p staging_db < production_backup.sql
Alternativamente, usa WP-CLI para manejar la exportación e importación en una sola pipeline:
# Exportar de producción, canalizar directamente a staging
wp db export --ssh=production - | wp db import --ssh=staging -
Paso 3: reemplazar URLs en la base de datos con search-replace
Este es el paso más crítico. WordPress almacena URLs absolutas en toda la base de datos, en entradas, opciones, datos de widgets y arrays serializados. Un simple buscar y reemplazar SQL corrompe los datos serializados. El comando search-replace de WP-CLI maneja los datos serializados correctamente:
wp search-replace 'https://tudominio.com' 'https://staging.tudominio.com' \
--all-tables \
--precise \
--recurse-objects \
--skip-columns=guid
Explicación de las flags clave:
--all-tablesbusca en cada tabla, incluidas las creadas por plugins.--preciseactiva un reemplazo más riguroso en datos serializados.--recurse-objectsmaneja objetos serializados profundamente anidados.--skip-columns=guiddeja la columna GUID sin cambios, como recomienda la documentación de WordPress.
Paso 4: limpiar cachés y verificar
Después de la migración, limpia todas las cachés para asegurar que el sitio staging cargue datos frescos:
wp cache flush
wp rewrite flush
wp transient delete --all
Abre el sitio staging en un navegador y verifica:
- La página de inicio carga correctamente con la URL staging.
- Los enlaces internos apuntan al dominio staging.
- Los archivos multimedia cargan correctamente.
- Los formularios y el proceso de checkout funcionan según lo esperado.
Pasar staging a producción de forma segura
Cuando tus cambios en staging están probados y aprobados, necesitas transferirlos a producción sin tiempo de inactividad. El proceso es esencialmente lo contrario de crear el sitio staging, pero con medidas de seguridad adicionales.
Lista de verificación antes del despliegue
Antes de pasar staging a producción:
- Crear una copia de seguridad de producción - ten siempre un punto de reversión.
- Poner producción en modo mantenimiento - previene conflictos en la base de datos por actividad simultánea de usuarios.
- Notificar a las partes interesadas - informa al equipo de que un despliegue está en curso.
- Programar durante tráfico bajo - minimiza el impacto en visitantes reales.
Desplegar archivos
Sincroniza los archivos modificados del staging a producción, nuevamente excluyendo la configuración específica del entorno:
# Activar modo mantenimiento
wp maintenance-mode activate --ssh=production
# Sincronizar archivos de staging a producción
rsync -avz --delete \
--exclude='wp-config.php' \
--exclude='.htaccess' \
--exclude='wp-content/cache/' \
--exclude='wp-content/uploads/wpo-cache/' \
staging:/var/www/staging/ \
production:/var/www/html/
Desplegar la base de datos
Si tus cambios en staging incluyen modificaciones en la base de datos (nuevas páginas, opciones actualizadas, configuraciónes de plugins), exporta e importa la base de datos staging en producción:
# Exportar base de datos staging
wp db export --ssh=staging staging_export.sql
# Importar en producción
wp db import --ssh=production staging_export.sql
# Reemplazar de vuelta a URL de producción
wp search-replace 'https://staging.tudominio.com' 'https://tudominio.com' \
--all-tables \
--precise \
--recurse-objects \
--skip-columns=guid \
--ssh=production
Tareas posteriores al despliegue
Después de la importación de la base de datos y search-replace:
# Limpiar todas las cachés
wp cache flush --ssh=production
wp rewrite flush --ssh=production
wp transient delete --all --ssh=production
# Desactivar modo mantenimiento
wp maintenance-mode deactivate --ssh=production
Verifica el sitio de producción inmediatamente. Comprueba la página de inicio, las páginas de destino principales, el proceso de checkout y los formularios de contacto. Monitoriza los registros de errores durante los primeros 30 minutos después del despliegue.
Análisis detallado del search-replace en la base de datos
El comando search-replace de WP-CLI es una de las herramientas más potentes en el kit de herramientas de despliegue WordPress. Más allá de la sustitución básica de URLs, maneja varios escenarios críticos.
Primero una ejecución de prueba (dry run)
Ejecuta siempre una prueba antes de ejecutar search-replace en producción:
wp search-replace 'https://staging.tudominio.com' 'https://tudominio.com' \
--all-tables \
--dry-run
La salida de la prueba muestra exactamente cuántas sustituciones se realizarán en cada tabla, sin modificar ningún dato. Revisa esta salida cuidadosamente antes de ejecutar el comando real.
Manejo de multisite
Para instalaciones WordPress multisite, añade la flag --network y reemplaza URLs para cada sitio individualmente:
wp search-replace 'staging.tudominio.com' 'tudominio.com' \
--all-tables \
--network \
--precise \
--recurse-objects
Reemplazo de protocolos mixtos
Si tu sitio staging usa HTTP mientras producción usa HTTPS (o viceversa), ejecuta dos pasadas:
wp search-replace 'http://staging.tudominio.com' 'https://tudominio.com' --all-tables
wp search-replace '//staging.tudominio.com' '//tudominio.com' --all-tables
Esto captura URLs relativas al protocolo que algunos plugins y temas generan.
Flujos de trabajo de despliegue basados en git
Para equipos que trabajan en temas o plugins personalizados, el control de versiones con git transforma el proceso de despliegue de copia manual propensa a errores en un flujo de trabajo repetible y auditable.
Estructura del repositorio
Un proyecto WordPress típico gestionado con git rastrea solo el código personalizado, no el núcleo de WordPress ni plugins de terceros:
.
├── .github/
│ └── workflows/
│ └── deploy.yml
├── wp-content/
│ ├── themes/
│ │ └── your-theme/
│ ├── plugins/
│ │ └── your-custom-plugin/
│ └── mu-plugins/
├── .gitignore
└── composer.json
Tu .gitignore debe excluir archivos del núcleo de WordPress, uploads, directorios de caché y configuración sensible:
# Núcleo de WordPress
/wp-admin/
/wp-includes/
/wp-*.php
/index.php
/xmlrpc.php
# Configuración
wp-config.php
.htaccess
# Uploads y caché
wp-content/uploads/
wp-content/cache/
wp-content/upgrade/
# Dependencias
vendor/
node_modules/
Estrategia de branches
Una estrategia de branches simple para proyectos WordPress:
main- código listo para producción, desplegado en el sitio activo.staging- branch de integración, desplegado en el entorno staging.feature/*- branches individuales de funcionalidad creados desdestaging.
Los desarrolladores crean branches de funcionalidad, prueban localmente, abren pull requests hacia staging, y después de la aprobación, el branch staging se fusiona en main para el despliegue en producción.
Desplegar con git en el servidor
Si tu servidor soporta git, puedes hacer pull de los cambios directamente:
# En el servidor de producción
cd /var/www/html
git fetch origin
git checkout main
git pull origin main
# Ejecutar composer si es necesario
composer install --no-dev --optimize-autoloader
# Limpiar cachés
wp cache flush
wp rewrite flush
Para servidores sin acceso git, usa rsync desde tu máquina local después de hacer checkout del branch que quieres desplegar:
git checkout main
rsync -avz --delete \
--exclude='.git/' \
--exclude='node_modules/' \
--exclude='.env' \
./wp-content/ \
production:/var/www/html/wp-content/
Fundamentos de CI/CD para WordPress con GitHub Actions
Continuous Integration y Continuous Deployment (CI/CD) automatizan todo el flujo de trabajo: cuando haces push de código a un branch específico, un pipeline ejecuta pruebas, verifica la calidad del código y despliega automáticamente en el entorno objetivo.
Ejemplo de flujo de trabajo de GitHub Actions
Crea .github/workflows/deploy.yml en tu repositorio:
name: Deploy WordPress
on:
push:
branches:
- main
- staging
jobs:
lint-and-test:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up PHP
uses: shivammathur/setup-php@v2
with:
php-versión: '8.3'
tools: composer, cs2pr
- name: Install dependencies
run: composer install --prefer-dist --no-progress
- name: Run PHP CodeSniffer
run: vendor/bin/phpcs --standard=WordPress wp-content/themes/your-theme/ wp-content/plugins/your-custom-plugin/
- name: Run PHPStan
run: vendor/bin/phpstan analyse wp-content/themes/your-theme/ wp-content/plugins/your-custom-plugin/ --level=6
deploy-staging:
needs: lint-and-test
if: github.ref == 'refs/heads/staging'
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Deploy to staging
uses: burnett01/rsync-deployments@7.0.1
with:
switches: -avz --delete --exclude='.git/' --exclude='node_modules/'
path: wp-content/
remote_path: /var/www/staging/wp-content/
remote_host: ${{ secrets.STAGING_HOST }}
remote_user: ${{ secrets.STAGING_USER }}
remote_key: ${{ secrets.SSH_PRIVATE_KEY }}
- name: Flush staging caches
uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.STAGING_HOST }}
username: ${{ secrets.STAGING_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
cd /var/www/staging
wp cache flush
wp rewrite flush
deploy-production:
needs: lint-and-test
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
environment: production
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Deploy to production
uses: burnett01/rsync-deployments@7.0.1
with:
switches: -avz --delete --exclude='.git/' --exclude='node_modules/'
path: wp-content/
remote_path: /var/www/html/wp-content/
remote_host: ${{ secrets.PRODUCTION_HOST }}
remote_user: ${{ secrets.PRODUCTION_USER }}
remote_key: ${{ secrets.SSH_PRIVATE_KEY }}
- name: Flush production caches
uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.PRODUCTION_HOST }}
username: ${{ secrets.PRODUCTION_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
cd /var/www/html
wp cache flush
wp rewrite flush
Qué hace este pipeline
- Linting y pruebas - cada push activa PHP CodeSniffer (para estándares de codificación WordPress) y PHPStan (para análisis estático). Si alguno falla, el despliegue se bloquea.
- Despliegue a staging - los pushes al branch
stagingdespliegan automáticamente en el servidor staging vía rsync sobre SSH. - Despliegue a producción - los pushes a
maindespliegan a producción. La configuraciónenvironment: productionactiva las reglas de protección de entorno de GitHub, para que puedas requerir aprobación manual antes de despliegues en producción.
Configurar secretos
Almacena tus credenciales SSH como secretos del repositorio GitHub:
STAGING_HOSTyPRODUCTION_HOST- direcciones IP o nombres de host de los servidores.STAGING_USERyPRODUCTION_USER- nombres de usuario SSH.SSH_PRIVATE_KEY- la clave privada para autenticación SSH.
Nunca hagas commit de claves privadas o credenciales en tu repositorio.
Prevenir la indexación del staging
Un sitio staging indexado por motores de búsqueda crea problemas de contenido duplicado y puede filtrar trabajo inacabado al público. Múltiples capas de protección aseguran que esto no ocurra.
robots.txt
Crea un archivo robots.txt en el sitio staging que bloquee todos los rastreadores:
User-agent: *
Disallow: /
Esto indica a los rastreadores bien comportados que no indexen ninguna página. Pero no todos los bots respetan robots.txt, así que medidas adicionales son necesarias.
Ajustes de lectura de WordPress
En el admin del sitio staging, navega a Ajustes, luego Lectura, y marca “Disuadir a los motores de búsqueda de indexar este sitio”. Esto añade una meta etiqueta noindex y una cabecera X-Robots-Tag: noindex a cada página.
Cabecera HTTP vía .htaccess o Nginx
Añade una cabecera noindex a nivel de servidor para protección extra. Para Apache:
# .htaccess en staging
Header set X-Robots-Tag "noindex, nofollow, nosnippet"
Para Nginx:
# En el bloque de servidor staging
add_header X-Robots-Tag "noindex, nofollow, nosnippet" always;
Autenticación HTTP basic
La protección más fiable es restringir el acceso por completo. Añade autenticación HTTP basic para que solo personas autorizadas puedan ver el sitio staging:
Para Apache, añade al .htaccess:
AuthType Basic
AuthName "Staging Access"
AuthUserFile /path/to/.htpasswd
Require valid-user
Crea el archivo de contraseñas:
htpasswd -c /path/to/.htpasswd staging_user
Para Nginx, añade al bloque de servidor:
auth_basic "Staging Access";
auth_basic_user_file /etc/nginx/.htpasswd;
Lista de IPs permitidas
Para el nivel más alto de seguridad, restringe el acceso al staging a direcciones IP específicas. Esto es especialmente útil para equipos de agencia que trabajan desde redes de oficina conocidas o VPNs.
Errores comunes y cómo evitarlos
Olvidar excluir wp-config.php
El archivo wp-config.php contiene credenciales de base de datos, sales de seguridad y constantes específicas del entorno. Sobrescribir la configuración de producción con la configuración staging es uno de los errores de despliegue más comunes. Exclúyelo siempre del rsync y nunca hagas commit de él en git.
Corrupción de datos serializados
Nunca uses buscar y reemplazar a nivel SQL (ej.: UPDATE wp_options SET option_value = REPLACE(...)) para cambios de URL. WordPress almacena arrays PHP serializados en la base de datos, y cambiar longitudes de cadenas sin actualizar los metadatos de serialización corrompe los datos. Usa siempre WP-CLI search-replace, que maneja los datos serializados correctamente.
Caché de objetos obsoleta
Después de cualquier despliegue, limpia la caché de objetos. Si usas Redis o Memcached, los objetos en caché obsoletos pueden servir datos antiguos incluso después de que la base de datos ha sido actualizada:
wp cache flush
redis-cli FLUSHDB # si usas Redis
Contenido mixto después de la migración a HTTPS
Si tu sitio staging usa un protocolo diferente al de producción, las advertencias de contenido mixto del navegador pueden romper la carga de CSS y JavaScript. Ejecuta search-replace en URLs relativas al protocolo así como en URLs completas para capturar cada referencia.
Conflictos de cron
Las tareas cron de WordPress programadas en staging (como publicaciónes programadas o correos electrónicos automáticos) pueden dispararse en el dominio staging. Desactiva wp_cron en tu wp-config.php de staging para prevenir efectos secundarios no deseados:
define('DISABLE_WP_CRON', true);
Construir un flujo de trabajo de despliegue profesional
El mejor flujo de trabajo de despliegue para tu proyecto depende de su complejidad:
- Blogs simples y sitios corporativos - staging a nivel de hosting es suficiente. Clon con un clic, probar, transferir a producción.
- Tiendas WooCommerce y sitios de membresía - usa staging manual con WP-CLI con gestión cuidadosa de la base de datos. Las fusiones de bases de datos requieren atención especial porque los datos de producción cambian constantemente.
- Temás y plugins personalizados en desarrollo activo - despliegue basado en git con CI/CD. Revisión de código vía pull requests, pruebas automatizadas y despliegues repetibles.
- Agencia que gestiona múltiples clientes - estandariza en un pipeline CI/CD con configuración específica por entorno. Una plantilla de flujo de trabajo sirve para cada proyecto de clientes.
Empieza con el enfoque más simple que satisfaga tus necesidades y evoluciona tu flujo de trabajo a medida que crecen tus requisitos. El objetivo no es complejidad por sí misma, sino confianza en que cada despliegue es seguro, probado y reversible.
Despliegue y mantenimiento profesional de WordPress
Configurar un flujo de trabajo fiable de staging y despliegue requiere experiencia en administración de servidores, gestión de bases de datos y herramientas CI/CD. En wppoland.com, diseñamos y mantenemos pipelines de despliegue WordPress para agencias y empresas en toda Europa. Desde configuraciónes staging con un clic hasta flujos de trabajo GitHub Actions completamente automatizados, nos encargamos del DevOps para que tu equipo pueda concentrarse en construir sitios web excelentes.
Si necesitas ayuda para configurar entornos staging, automatizar despliegues o migrar entre proveedores de alojamiento, nuestro equipo está listo para ayudar. Los precios de los servicios de mantenimiento y despliegue son individuales y dependen del alcance de tu proyecto, así que contacta para una consulta personalizada.


