Gestionando el cron de WordPress de manera eficiente con WP-CLI

Actualizada:

El tema del Cron en WordPress siempre ha sido controvertido. Funciona de manera transparente, y si eres nuevo en WordPress, probablemente ni te estás preocupando por cómo funciona. Por arte de magia, se publican las entradas programadas, o se realizan las tareas de mantenimiento del sistema o las instalaciones de actualizaciones en temas y complementos o incluso las actualizaciones del core. Todo ello gracias a wp-cron.php.

El problema que tiene este enfoque, es que estas actualizaciones del cron gracias a WP-CRON, solo se producen cuando alguien visita tu página web, o cuando estás accediendo al panel de administración, y esto puede llevar a varios problemas:

  • Si tu blog tiene pocas visitas, se van a acumular eventos del cron, y es posible que se ejecuten todos al mismo tiempos, pudiendo provocar que la página en cuestión tarde más tiempo en cargar a tu visitante si el trabajo es intensivo y requiere mucha CPU o RAM de tu servidor.
  • Si tu blog tiene muchas visitas, todos los eventos dle cron de WP se ejecutarán a tiempo, pero tendremos otro problema: a lo mejor provoca una sobrecarga en el servidor porque se esta ejecutando muchas veces.

¿Solución? Desde hace muchos años se recomienda deshabilitar el CRON de WordPress y crear un cron Linux, directamente en el sistema operativo. El problema con esto, es que muchos planes compartidos en determinados hostings, no te dan acceso al cron. ¿Tienes acceso SSH a tu servidor o tu panel de control ofrece personalizar trabajos cron? Sigue leyendo.

Deshabilitamos el Cron de WordPress

Lo primero que tienes que hacer es ir al archivo wp-config.php de tu instalación de WordPress (carpeta raíz) y poner la siguiente orden:

define('DISABLE_WP_CRON', true);

Recuerda poner esta orden antes la línea: /* That’s all, stop editing! Happy blogging. */.

Con esto, el sistema dejará de lanzar el cron de WP contra https://tudominio.com/wp-cron.php

¿Qué se recomendaba hacer antes? Usar curl o wget para llamar al cron de WordPress

Eso es. Era la opción recomendada. Usar el comando curl o wget en el cron de Linux para llamar al archivo del cron de WordPress con una orden como esta:

curl -s -o /dev/null "https://tusitio.com/wp-cron.php?doing_wp_cron"

o con wget:

wget -q -O /dev/null "https://tusitio.com/wp-cron.php?doing_wp_cron"

Te ibas al cron (en mi caso en Rocky Linux):

sudo crontab -e

Y ponías una línea como esta:

*/5 * * * * /usr/bin/curl -s -o /dev/null "https://tusitio.com/wp-cron.php?doing_wp_cron"

o como esta:

*/5 * * * * wget -q -O /dev/null "https://tusitio.com/wp-cron.php?doing_wp_cron"

Fíjate que el comando cambia frente al que ejecutas en la línea de comandos: especificamos la ruta completa de curl para que no haya confusión en el cron. Este comando ejecuta el cron de WP cada cinco minutos, un tiempo medianamente razonable.

Y ya lo tenías hecho. El problema con esta aproximación con WGET y CURL es que estos comandos pueden fallar debido a problemas de red, lo que podría llevar a tareas de cron fallidas. Ya depende de lo bueno que sea tu servidor.

¿Solución? Pues gestionarlo todo WP-CLI.

Usamos WP-CLI para gestionar el Cron de WordPress mediante el CRON de Linux

Esta es la mejor solución hoy en día, y la única pega que tiene es que hay que instalar WP-CLI, el gestor de línea de comandos creado por WordPress en tu servidor. Pero es muy sencillo.

1.-Instalamos WP-CLI

Muy sencillo. Te vas a una carpeta de usuario y pones lo siguiente (referencia en https://wp-cli.org):

curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
php wp-cli.phar --info
chmod +x wp-cli.phar
sudo mv wp-cli.phar /usr/local/bin/wp 
wp --info

Al poner el comando wp –info, te tiene que salir algo como esto:

Shell:
PHP binary:     /usr/bin/php
PHP version:    8.2.20
php.ini used:   /etc/php.ini
MySQL binary:   /bin/mysql
MySQL version:  MariaDB
SQL modes:
WP-CLI root dir:        phar://wp-cli.phar/vendor/wp-cli/wp-cli
WP-CLI vendor dir:      phar://wp-cli.phar/vendor
WP_CLI phar path:       /root
WP-CLI packages dir:    /root/.wp-cli/packages/
WP-CLI cache dir:       /root/.wp-cli/cache
WP-CLI global config:
WP-CLI project config:
WP-CLI version: 2.10.0

Ya lo tienes bien configurado.

¡Ojo! Si ves que los comandos no te funcionan y te sale un aviso en el que te indican que uses el comando como un usuario no root, o que permitas la ejecución como root con wp –allow-root, te recomiendo que uses los comando de WP-CLI con un usuario que no sea root, utilizando los comandos de esta manera:

sudo -u TUUSUARIOSERVIDOR /RUTA/A/wp <comando>

Para saber la ruta al comando wp, tienes que poner:

which wp

El usuario que tienes que usar es el que ejecuta los procesos de PHP, si estás usando apache con PHP-FPM.

¿Quieres ver cuantos eventos de cron tiene tu instalación de WordPress y ver cuando se han ejecutado y cada cuánto lo van a hacer?

#wp cron event list

+--------------------+--------------------+-----------------------+------------+
| hook               | next_run_gmt       | next_run_relative     | recurrence |
+--------------------+--------------------+-----------------------+------------+
| jetpack_sync_cron  | 2024-06-13 06:19:5 | now                   | 5 minutes  |
|                    | 0                  |                       |            |
| jetpack_display_po | 2024-06-13 06:21:0 | 1 minute 9 seconds    | 10 minutes |
| sts_widget_cron_up | 9                  |                       |            |
| date               |                    |                       |            |
| jetpack_sync_full_ | 2024-06-13 06:22:1 | 2 minutes 19 seconds  | 5 minutes  |
| cron               | 9                  |                       |            |
| wp_privacy_delete_ | 2024-06-13 06:42:2 | 22 minutes 26 seconds | 1 hour     |
| old_export_files   | 6                  |                       |            |
| wp_cache_gc        | 2024-06-13 06:42:2 | 22 minutes 27 seconds | 1 hour     |
|                    | 7                  |                       |            |
| amp_validated_url_ | 2024-06-13 06:42:3 | 22 minutes 31 seconds | 1 hour     |
| stylesheet_gc      | 1                  |                       |            |
| amp_validate_urls  | 2024-06-13 06:42:3 | 22 minutes 33 seconds | 1 hour     |
|                    | 3                  |                       |            |
| wp_cache_gc_watche | 2024-06-13 06:42:3 | 22 minutes 34 seconds | 1 hour     |
| r                  | 4                  |                       |            |
| jetpack_clean_nonc | 2024-06-13 06:42:3 | 22 minutes 36 seconds | 1 hour     |
| es                 | 6                  |                       |            |
| wp_update_plugins  | 2024-06-13 07:41:3 | 1 hour 21 minutes     | 12 hours   |
|                    | 8                  |                       |            |
| wp_scheduled_delet | 2024-06-13 07:41:4 | 1 hour 21 minutes     | 1 day      |
| e                  | 1                  |                       |            |
| wp_version_check   | 2024-06-13 07:42:4 | 1 hour 22 minutes     | 12 hours   |
|                    | 1                  |                       |            |
| wp_update_themes   | 2024-06-13 07:42:4 | 1 hour 22 minutes     | 12 hours   |
|                    | 4                  |                       |            |
| jetpack_waf_rules_ | 2024-06-13 07:42:4 | 1 hour 22 minutes     | 12 hours   |
| update_cron        | 7                  |                       |            |
| wp_scheduled_auto_ | 2024-06-13 07:42:4 | 1 hour 22 minutes     | 1 day      |
| draft_delete       | 9                  |                       |            |
| jetpack_v2_heartbe | 2024-06-13 07:42:5 | 1 hour 22 minutes     | 1 day      |
| at                 | 1                  |                       |            |
| wp_update_user_cou | 2024-06-13 07:42:5 | 1 hour 22 minutes     | 12 hours   |
| nts                | 2                  |                       |            |
| amp_monitor_css_tr | 2024-06-13 07:42:5 | 1 hour 22 minutes     | 1 day      |
| ansient_caching    | 4                  |                       |            |
| jetpack_boost_mini | 2024-06-13 07:42:5 | 1 hour 22 minutes     | 1 day      |
| fy_cron_cache_clea | 5                  |                       |            |
| nup                |                    |                       |            |
| akismet_scheduled_ | 2024-06-13 07:43:0 | 1 hour 23 minutes     | 1 day      |
| delete             | 3                  |                       |            |
| jp_purge_transient | 2024-06-13 07:43:0 | 1 hour 23 minutes     | 1 day      |
| s_cron             | 6                  |                       |            |
| grunion_scheduled_ | 2024-06-13 07:43:0 | 1 hour 23 minutes     | 1 day      |
| delete             | 8                  |                       |            |
| delete_expired_tra | 2024-06-13 07:43:1 | 1 hour 23 minutes     | 1 day      |
| nsients            | 3                  |                       |            |
| recovery_mode_clea | 2024-06-13 07:43:1 | 1 hour 23 minutes     | 1 day      |
| n_expired_keys     | 4                  |                       |            |
| wp_delete_temp_upd | 2024-06-19 07:56:0 | 6 days 1 hour         | 1 week     |
| ater_backups       | 6                  |                       |            |
| wp_site_health_sch | 2024-06-19 08:50:0 | 6 days 2 hours        | 1 week     |
| eduled_check       | 6                  |                       |            |
+--------------------+--------------------+-----------------------+------------+
  • En la columna next_run_relative verás cuanto les toca ejecutarse de nuevo, y hay una cosa interesante. Si te aparece algún evento con el valor now, es que se tiene que ejecutar la próxima vez que se ponga en marcha el cron de WordPress. Suele ser normal que aparezca este valor si tienes el cron ejecutándose cada 5, 10, 15 minutos. Siempre hay eventos programados cada minuto o cada 5, 10 minutos, depende de los plugins que tengas instalados. Muchos plugins utilizan action_scheduler_run_queue para actualizar sus funciones, y este evento suele estar programado cada minuto.

Otro beneficio de usar WP-CLI, es que puede borrar eventos del cron de WP que hayan dejado plugins que has desinstalado con el comando:

#Listas los eventos
wp cron event list 

#Borras el que no te interese
wp cron event delete EVENTOABORRAR

2.-Creamos el trabajo cron con WP-CLI

¿Qué ventajas tiene usar esta aproximación? WP-CLI está integrado con WordPress y permite ejecutar tareas cron directamente. Puede manejar tareas complejas y devolver resultados detallados y permite ejecutar comandos específicos de WordPress.

¿Pegas? Puede usar más recursos del servidor, por ejemplo RAM y tienes que instalar WP-CLI en tu servidor.

Tienes que meter en tu cron Linux un comando como este:

sudo -u TUUSUARIO /RUTA/A/wp --path="/home/USUARIO/public_html/" cron event run --due-now
Eventos ejecutados del cron de WordPress mediante WP-CLI y el cron de Linux

Con este comando vas a conseguir que se ejecuten todos los eventos cron que tengan en este momento la coletilla now en el campo next_run_relative.

Ahora solo tienes que ponerlo en un cron de Linux:

crontab -e

Y ponemos:

*/5 * * * * sudo -u TUUSUARIO /RUTA/A/wp --path="/home/USUARIO/public_html/" cron event run --due-now

Y ya tienes el cron configurado. Puedes comprobarlo poniendo de nuevo dentro de unos minutos el comando wp cron event list e iras viendo cómo van ejecutándose los trabajos.

¿Tienes varios blogs instalados en un mismo servidor? Puedes crear un script bash para ejecutar este mismo comando al mismo tiempo en todos.

Creas el archivo:

sudo vi wp-cron.sh

Y pones:

#!/bin/bash

# Log file
LOGFILE="/TU/RUTA/A/wp-cron-logs.txt"

# Ruta completa a wp-cli
WP_CLI_PATH="/TU/RUTA/A/wp"

# Ejecuta wp-cli para cada sitio
echo "Ejecutando cron para /home/USUARIO1/public_html/ a $(date)" >> "$LOGFILE"
sudo -u USUARIO1 $WP_CLI_PATH --path="/home/USUARIO1/public_html/" cron event run --due-now >> "$LOGFILE" 2>&1

echo "Ejecutando cron para /home/USUARIO2/public_html a $(date)" >> "$LOGFILE"
sudo -u USUARIO@ $WP_CLI_PATH --path="/home/USUARIO2/public_html" cron event run --due-now >> "$LOGFILE" 2>&1
  • Puedes poner tantos blogs como quieras. Tienes que indicar la ruta a wp (lo averiguas con el comando which wp). Sustituye USUARIO1 y USUARIO2 con tus usuarios y rutas a tu instalación de WordPress.
  • El resultado del comando se va a guardar en un archivo log wp-cron-logs.txt, que puede meter en logrotate para que no se llene demasiado.

Le das permiso de ejecución:

chmod +x wp-cron.sh

Y creas el trabajo en el cron Linux:

crontab -e

Poniendo:

*/5 * * * * /RUTA/A/wp-cron.sh >> /RUTA/A/cron.log 2>&1
  • Si hay algún error en la ejecución del cron, va a mandar la salida un archivo llamado cron.log. Se ejecuta cada 5 minutos.

¿Cada cuánto tiempo se debe ejecutar el cron de WordPress?

IntervaloBeneficiosDesventajas
1 minuto– Ejecución casi en tiempo real de tareas.
– Para sitios con muchas tareas cron críticas.
– Manejo rápido de transients y tareas de mantenimiento.
– Alta carga en el servidor.
– Puede ser un desperdicio de recursos para la mayoría de los sitios.
– No necesario para sitios con tráfico bajo.
5 minutos– Demora mínima en tareas programadas.
– Menos carga en el servidor comparado con 1 minuto.
– Para sitios de tamaño medio.
– Puede ser demasiado frecuente para sitios con poco tráfico o pocas tareas cron.
– Aún puede generar carga significativa en el servidor.
15 minutos– Buena relación entre frecuencia y carga del servidor.
– Adecuado para la mayoría de los sitios web.
– Reduce la carga en comparación con frecuencias más altas.
– Pequeña demora en la ejecución de algunas tareas programadas.
– No ideal para tareas cron críticas que necesitan ejecutarse más frecuentemente.
30 minutos– Minimiza la carga en el servidor.
– Ideal para sitios con tráfico bajo.
– Adecuado para blogs o sitios web sin dependencia de tareas cron en tiempo real.
– Demora considerable en la ejecución de tareas programadas.
– No es para sitios con muchas tareas cron que necesitan ejecutarse frecuentemente.

Conclusión

La aproximación con WP-CLI es mucho más limpia y efectiva que usar WGET o CURL. Y solo tienes que instalar WP-CLI en tu servidor. Lo bueno que tiene esta herramienta, es que te va a permitir hacer, no solo esto, también gestionar de forma eficiente tu WordPress. Esto es especialmente útil si tienes varias instalaciones de WordPress en tu servidor.

Al usar el comando wp cron event run –due-now, cada 5 minutos, solo se van a ejecutar los trabajos de cron que estén en el estado now, y los demás se quedan tan panchos, lo que evita que el servidor se sobrecargue. Lo puedes comprobar en la salida del log para este cron que he creado. Verás algo como esto:

Ejecutando cron para /home/usuario1/public_html/wordpress a Sat Jun 15 11:26:01 AM CEST 2024
Executed the cron event 'jetpack_display_posts_widget_cron_update' in 0.113s.
Executed the cron event 'jetpack_sync_full_cron' in 0.119s.
Executed the cron event 'jetpack_sync_cron' in 0.118s.
Success: Executed a total of 3 cron events.
Ejecutando cron para /home/usuario2/public_html a Sat Jun 15 11:26:02 AM CEST 2024
Executed the cron event 'jetpack_sync_full_cron' in 0.116s.
Executed the cron event 'jetpack_sync_cron' in 0.119s.
Executed the cron event 'jetpack_display_posts_widget_cron_update' in 0.382s.
Executed the cron event 'jetpack_clean_nonces' in 0.117s.

En la primera instalación se han ejecutado únicamente 3 trabajos, en la segunda 4. Y ya no dependes de las visitas a tu página, un sistema bastante ineficiente. ¿Preguntas? ¿Algo que mejorar?


Descubre más desde algoentremanos.com

Suscríbete y recibe las últimas entradas en tu correo electrónico.

Foto del autor

Ivan Benito

Apasionado de la lectura y los viajes, experto en tecnología e informática y fan de la privacidad online. Desde el año 2007 me he dedicado al SEO, a escribir y a crear páginas web con WordPress sobre todo tipo de temáticas. Si tienes alguna duda y necesitas ayuda... ¡Pregúntame!

Si tienes preguntas, quieres que hagamos una review de una app, programa o producto, simplemente mándanos un e-mail mediante nuestro formulario de contacto. Te contestaremos en el menor tiempo posible. ¡Muchas gracias y salU2! Algoentremanos realiza reviews de manera profesional y en muchas ocasiones recibimos compensación de las compañías cuyos productos revisamos. Probamos cada producto a fondo y otorgamos altas calificaciones solo a los mejores. La propiedad de Algoentremanos.com es independiente y las opiniones expresadas aquí son solo nuestras. Algunos enlaces del artículo son afiliados: pueden generar un beneficio a algoentremanos.com. Saber más.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.