
Índice
- 1 Qué son los cron jobs y por qué WordPress los necesita
- 2 Cómo funciona WP-Cron y sus limitaciones
- 3 Paso 1: Desactivar WP-Cron en wp-config.php
- 4 Paso 2: Crear el cron job en el servidor Linux
- 5 Ejemplos de cron jobs útiles para WordPress
- 6 Comprobación y depuración de cron jobs
- 7 Buenas prácticas para cron jobs en WordPress
- 8 Errores comunes al configurar cron jobs WordPress
- 9 Preguntas frecuentes
- 10 Conclusión
Qué son los cron jobs y por qué WordPress los necesita
Un cron job en WordPress es, en esencia, una tarea que el servidor ejecuta solo y a las horas que tú decidas. Publicar una entrada programada, buscar actualizaciones de plugins, mandar los correos de WooCommerce, hacer una copia de seguridad, vaciar cachés… cosas así. WordPress trae de serie su propio sistema para esto, WP-Cron, y funciona, sí. Pero tiene limitaciones serias que conviene conocer antes de ponerse a configurar nada.
El problema es sencillo: WP-Cron no es un cron de verdad. Se dispara cuando alguien visita tu web. Sin visitas, no hay tareas (o llegan tarde). Con muchas visitas, se dispara demasiado, y eso consume recursos que no hacen falta. La solución que usan los sitios serios pasa por desactivar WP-Cron y crear un cron job real en Linux, mediante el daemon cron del sistema.
Cómo funciona WP-Cron y sus limitaciones
WP-Cron (wp-cron.php) se lanza en cada carga de página mediante una llamada HTTP loopback al propio sitio. Y de ahí salen tres problemas bastante habituales:
- Retrasos en tareas: una entrada programada puede publicarse tarde si nadie visita el sitio a la hora prevista.
- Rendimiento degradado: en sitios con tráfico alto, wp-cron.php puede invocarse cientos de veces por minuto.
- Fallos silenciosos: si la llamada loopback falla (un firewall que la bloquea, problemas de DNS), las tareas simplemente dejan de ejecutarse. Sin aviso. Eso es lo peor.
Paso 1: Desactivar WP-Cron en wp-config.php
Lo primero es cortar el disparo por visitas. Abre el archivo wp-config.php, que está en la raíz de tu instalación, y añade esta línea justo antes del comentario que dice «eso es todo, deja de editar»:
define( ‘DISABLE_WP_CRON’, true );
Guardas y listo. A partir de ahora WordPress ya no lanzará wp-cron.php en cada visita. Ojo: el sistema de tareas programadas sigue funcionando igual. Lo único que cambia es quién lo invoca.
Paso 2: Crear el cron job en el servidor Linux
Acceder al crontab
Conéctate al servidor por SSH y abre el crontab del usuario que ejecuta la web (por ejemplo, www-data en Debian/Ubuntu):
sudo crontab -u www-data -e
Si gestionas el sitio con tu propio usuario, con crontab -e vale. Se abrirá el editor por defecto, y ahí añades la línea de programación.
Sintaxis de un cron job
Cada línea del crontab sigue este formato:
- Minuto: 0-59
- Hora: 0-23
- Día del mes: 1-31
- Mes: 1-12
- Día de la semana: 0-7 (0 y 7 son domingo)
Así, */15 * * * * quiere decir «cada 15 minutos, todos los días». Nada más.
La línea recomendada para WordPress
La forma más limpia de invocar wp-cron.php es mediante WP-CLI, que evita la sobrecarga de HTTP:
*/5 * * * * cd /var/www/tusitio/htdocs && wp cron event run –due-now >> /var/log/wp-cron.log 2>&1
¿No tienes WP-CLI instalado? (Deberías, la verdad.) Entonces puedes usar PHP directamente:
*/5 * * * * /usr/bin/php /var/www/tusitio/htdocs/wp-cron.php >/dev/null 2>&1
Ejemplos de cron jobs útiles para WordPress
Copia de seguridad nocturna de la base de datos
0 3 * * * mysqldump -u usuario -p’CONTRASEÑA’ nombre_bd | gzip > /backups/db-$(date +\%F).sql.gz
La copia a las 3:00 AM, cuando el tráfico está en su mínimo. No olvides escapar el símbolo de porcentaje con barra invertida dentro de crontab, o el comando se cortará a mitad.
Backup completo semanal de archivos
0 4 * * 0 tar -czf /backups/files-$(date +\%F).tar.gz /var/www/tusitio/htdocs/wp-content
Verificación de actualizaciones con WP-CLI
0 6 * * * cd /var/www/tusitio/htdocs && wp core check-update –quiet
Comprobación y depuración de cron jobs
Verificar que el cron se ejecuta
Los logs del sistema te dirán si cron está procesando tus tareas:
- En Debian/Ubuntu: grep CRON /var/log/syslog
- En sistemas con systemd: journalctl -u cron -f
Comprobar eventos programados desde WordPress
Con WP-CLI puedes listar las tareas programadas y las pendientes:
- wp cron event list: muestra todos los eventos programados.
- wp cron event run –due-now: ejecuta solo los vencidos.
- wp cron schedule list: lista los intervalos registrados.
Si un evento aparece con fecha del pasado, no se está ejecutando. Revisa los permisos del usuario, la ruta de PHP y el registro de errores. Suele ser una de esas tres cosas.
Buenas prácticas para cron jobs en WordPress
- Evita frecuencias excesivas: cada 5 minutos sobra para la mayoría de sitios. Cada minuto solo si tienes colas de correos o sincronizaciones críticas.
- Usa rutas absolutas siempre: cron tiene un entorno mínimo, sin las variables de tu shell habitual.
- Redirige la salida: >/dev/null 2>&1 evita correos del sistema; un log te permite auditar errores después.
- Escapa los % en crontab: deben ir como \% o el comando se cortará sin más.
- Protege wp-cron.php: con DISABLE_WP_CRON activo, puedes bloquear el acceso directo por HTTP desde .htaccess o nginx. Un extra de seguridad barato.
- Documenta cada tarea: añade comentarios en el crontab explicando qué hace cada línea. Tu yo del futuro lo agradecerá, créeme.
Errores comunes al configurar cron jobs WordPress
Permisos incorrectos
Si ejecutas el cron como root, los archivos que genere (logs, backups, cachés) pertenecerán a root y WordPress no podrá escribirlos. Ejecuta siempre el cron con el mismo usuario propietario de los archivos del sitio.
PATH inexistente en el entorno cron
Cron no carga tu .bashrc. Por eso comandos como wp o php pueden no encontrarse. Usa rutas absolutas (/usr/local/bin/wp) o define PATH al inicio del crontab: PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Sobrecarga por duplicación
Este me ha pasado a mí más de una vez: DISABLE_WP_CRON en false y, encima, el cron job activo. Resultado, wp-cron se ejecuta por partida doble. Verifica que solo un mecanismo esté operativo.
Preguntas frecuentes
¿Cada cuánto tiempo debo ejecutar el cron de WordPress?
Cada 5 minutos es el estándar recomendado. Sitios con WooCommerce o boletines pueden necesitar intervalos menores, pero rara vez hace falta bajar al minuto.
¿Puedo configurar cron jobs en hosting compartido?
Sí, casi todos los paneles (cPanel, Plesk) lo permiten. Ahí usa el método HTTP con wget o curl: */5 * * * * wget -q -O – https://tusitio.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1
¿Desactivar WP-Cron rompe los plugins?
No. Los plugins siguen programando tareas igual de siempre; lo único que cambia es quién dispara la ejecución. Los retrasos desaparecen y la fiabilidad mejora.
Conclusión
Sustituir WP-Cron por cron jobs reales en Linux es, quizá, una de las optimizaciones con mejor relación esfuerzo/beneficio para cualquier WordPress con cierta seriedad. Todo se reduce a tres pasos: desactivar el disparo por visitas con DISABLE_WP_CRON, crear una entrada en el crontab con la frecuencia adecuada y verificar que funciona mediante logs y WP-CLI. Con eso tienes publicaciones, backups y tareas de mantenimiento ejecutándose cuando toca, y una carga de servidor bastante menor si tu sitio tiene tráfico.
Y si prefieres no tocar el crontab de tu servidor, o si tras la configuración las tareas siguen sin ejecutarse bien, en RedServicio (redservicio.net) tenemos especialistas en administración de sistemas y WordPress que pueden auditar y configurar tus cron jobs de forma profesional, garantizando que cada tarea se ejecute exactamente cuando debe.

