De wp-cron a crontab + wp-control

por | enero 7, 2018

WordPress automatiza la ejecución de tareas repetitivas con wp-cron.php. Este fichero se ejecuta cada vez que un usuario visita el blog, comprobando tareas del core de WordPress (si existen actualizaciones de plugings, temas o del propio core, por ejemplo) como tareas añadidas por plugins (ping a buscadores, limpieza de logs, etc…)

Personalmente me gusta tener más control tanto de la frecuencia con la que se lanza como de las tareas que se ejecutan. Para ello deshabilito la ejecución por defecto de wp-cron.php y lo ejecuto mediante un crontab.

En nuestro fichero wp-config.php añadimos:

                                                                                                                                                                               
define('DISABLE_WP_CRON', true);

Creamos después una tarea en el crontab del usuario de sistema propietario de los ficheros de WordPress. Con frecuencia suele ser www-data o apache, no debería tener privilegios administrativos y tampoco shell por razones de seguridad. Desde root o usuario con permisos sudo editamos el crontab de dicho usuario:

crontab -u apache -e

Introducimos y guardamos:

# Lanzar wp-cron.php cada 10 minutos
*/10 * * * * php -q /var/www/example/public_html/wp-cron.php

Después podemos comprobar que el crontab del usuario en cuestión tiene la tarea planificada con crontab -u apache -l

Podríamos haberlo añadido también en el crontab de root, pero debemos asegurarnos de que no se lanza el script con el usuario root sino con el que tiene permisos restringidos:

# Lanzar wp-cron.php cada 10 minutos
*/10 * * * * su - apache -s /bin/bash -c "php -q /var/www/example/public_html/wp-cron.php"

Si todo va bien, deberíamos ver las llamadas a cron en /var/log/syslog por ejemplo:

Jan  7 09:00:01 jota-example-server CRON[17661]: (apache) CMD (php -q /var/www/example/public_html/wp-cron.php)
Jan  7 09:10:01 jota-example-server CRON[17806]: (apache) CMD (php -q /var/www/example/public_html/wp-cron.php)
Jan  7 09:20:01 jota-example-server CRON[17821]: (apache) CMD (php -q /var/www/example/public_html/wp-cron.php)
Jan  7 09:30:01 jota-example-server CRON[17832]: (apache) CMD (php -q /var/www/example/public_html/wp-cron.php)
Jan  7 09:40:01 jota-example-server CRON[17977]: (apache) CMD (php -q /var/www/example/public_html/wp-cron.php)
Jan  7 09:50:01 jota-example-server CRON[17983]: (apache) CMD (php -q /var/www/example/public_html/wp-cron.php)

Donde jota-example-server es el hostname de la máquina, apache el nombre de usuario que invoca a cron y php -q /var/www/example/public_html/wp-cron.php el comando que se lanza por CMD.

Posteriormente el plugin wp-control nos puede ser de gran ayuda para revisar las tareas automáticas que se lanzan desde el core de WordPress y los plugins que tengamos instalados. Si la instalamos, podemos encontrarla en Herramientas -> Cron Events. Si hemos deshabilitado correctamente wp-cron anteriormente, debe aparecer la línea The DISABLE_WP_CRON constant is set to true. WP-Cron spawning is disabled como vemos:

Desde aquí podemos lanzar, editar o eliminar dichas tareas programadas (salvo las del core). También podremos añadir tareas personalizadas, incluso ejecutar código PHP como vemos. En cualquier caso, wp-control no se encarga de lanzar por sí mismo las tareas programadas. Las fechas de ocurrencia que podemos ver (dos veces al día, cada 15 minutos, etc…) reflejan cada cuánto una tarea debe ejecutarse. Una vez se ejecute wp-cron.php desde el crontab correspondiente, evaluará si dicha tarea debe lanzarse en ese momento.