Las tareas cron de WordPress

Mosh crontab

En esta entrada voy a contaros a un nivel muy de usuario que son las tareas cron, como funcionan en WordPress y como mejorar algunos aspectos, todo esto sin código.

¿Qué es una tarea cron?

La definición que tenemos de cron en la Wikipedia es:

En el sistema operativo Unix, cron es un administrador regular de procesos en segundo plano (demonio) que ejecuta procesos o guiones a intervalos regulares (por ejemplo, cada minuto, día, semana o mes). Los procesos que deben ejecutarse y la hora a la que deben hacerlo se especifican en el archivo crontab. El nombre cron proviene del griego chronos (χρόνος) que significa «tiempo».
Cron se puede definir como el equivalente a Tareas Programadas de Windows.

Wikipedia: cron (Unix)

En resumidas cuentas y con mi definición de andar por casa «una tarea que se ejecuta a intervalos regulares», estos intervalos pueden ser los segundos viernes de cada mes, cada dos años, todos los viernes 13 o martes y 13, cada mes, cada lunes, cada hora, cada minuto… podemos definirlo totalmente a nuestro gusto y como queramos.

La tarea a realizar puede ser cualquiera que pueda ejecutar la máquina sobre la que definimos el cron, como por ejemplo optimizar una base de datos, borrar archivos más antiguos de un mes, optimizar imágenes, enviar un mail, o lo que deseemos.

Además podemos decirle al sistema cron que nos envíe un mail con los resultados de la tarea, siempre que la misma devuelva un texto o algún resultado.

Cron Mail

¿Hay cron en WordPress?

Bueno, podríamos decir que si, aunque en realidad es un pseudo cron. Hay otros programas que para funcionar nos obligan a crear determinadas tareas cron el servidor, como por ejemplo Invoice Ninja, el programa que utilizo yo para la facturación, para que realice tareas como enviar las facturas recurrentes de mantenimiento a principios de mes.

Si el cron no se ejecuta, los clientes no reciben las facturas y a lo mejor se creen que este mes corre por cuenta mía, así que cron, no me falles.

Esto viene a cuento porque WordPress es más amigable con el usuario final, que no tiene por qué saber lo que es un cron y menos como configurarlo en un servidor. Debido a esto, lo que hace es que cada vez que recibe una visita, el sistema comprueba si hay tareas a realizar y en caso afirmativo, se encarga de ejecutarlas.

Esto tiene dos posibles inconvenientes. Si tenemos muchas visitas, por ejemplo mil por hora, estará ejecutando las comprobaciones «mil veces cada hora», el cálculo lo dejo para otro post 😄 cuando podríamos haber ejecutado esa tarea por ejemplo 60 veces por hora si es una tarea a comprobar cada minuto.

Y el extremo opuesto, si nuestra web no tiene visitas, pues no se ejecutan las tareas. Por ejemplo, enviar un mail a nuestro compradores de WooCommerce 24 horas después de la adquisición, si no tenemos visitas en la web, el mail no se enviará hasta que entre alguien, quizás dos días después.

¿Cron real con WordPress?

Pero como siempre, WordPress se adapta a todo tipo de circunstancias y lo que podemos hacer es desactivar el cron nativo de WordPress, que es un poco gallego y se ejecuta unas veces si y otras no, depende.

Aquí os he engañado un poco diciendo que no había que utilizar código, pero es sólo una línea que podéis copiar y pegar desde aquí o directamente desde la extensión de navegador Best WordPress Tools (que en breve tendré que actualizar con nuevas funcionalidades) .

define( 'DISABLE_WP_CRON', true );

Con escribir esta línea en el archivo de configuración de vuestro WordPress, recordad que es wp-config.php en la carpeta principal de vuestro WordPress, sólo con eso, ya desactivamos el cron interno de nuestro WordPress. Pero ahora ya no se ejecutarán las tareas programadas, ni mil veces cada hora ni una vez cada dos días… tenemos un problema mayor, no hay tareas programadas y WordPress las necesita para muchas cosas.

La solución es tan fácil como crear un cron en vuestro servidor y apuntarlo a la dirección de vuestra web añadiéndole al final /wp-cron.php?doing_wp_cron&cron=true y comprobar que se ejecuta correctamente y todo funciona bien. Podéis seguir esta guía de SiteGround de como crear trabajos cron en su hosting o comprobar el del vuestro.

De esta manera se está ejecutando el archivo wp-cron.php de vuestra instalación de WordPress a intervalos regulares, por ejemplo cada 30 minutos, y tenemos la seguridad de que se ejecutará siempre tanto si tenemos una vista diaria como si tenemos un millón.

Cron real desde servicios externos

Este artículo surgió de un cliente mío de los Países Bajos en Codeable que no recibía los mails de LearnDash, aparte de un problema de configuración SMTP, el problema principal por el que los recibían fuera de la hora programada era la ausencia de visitas en esa web con el cron interno de WordPress.

En este caso su plan del hosting advierte que no debe programar los cron en períodos de menos de media hora. Podría cambiarlo desde su cPanel sin problema, pero no sé si lo limitarían igual internamente. Por eso aquí opté por una solución diferente y que yo utilizo personalmente desde hace un tiempo.

cron-jobs-hosting

La solución es utilizar un servicio externo para la ejecución de las tareas cron. Hay muchos disponibles, desde soluciones como las de AWS, Azure, Google Cloud u otros servicios especializados en dicha tarea. Pero a mi el que más me gusta es Open Source y gratuito, por lo que os animo a soportar el proyecto, se trata de cron-job.org

Podéis crearos una cuenta gratuita desde https://cron-job.org/en/signup/ y crear desde ahí todos los cron que queráis y ejecutarlos cada minuto, cada hora, cada lunes, cada… infinidad de opciones. Pero además podéis guardar el resultado del cron, que os envíe un mail si falla, otro si vuelve a funcionar, configurar el tipo de petición (GET, POST, HEAD, etc), poner autenticación para tener tareas privadas y que sólo se puedan ejecutar con usuario y clave, añadir cabeceras a la petición, definir zona horaria por tarea, etc…

Yo estoy utilizando el servicio desde hace algo más de año y medio y merece realmente la pena. En la web de DNG Photo Magazine ejecuto diversas tareas automatizadas como generar un html diario estático de las descargas de cada número, XML de estadísticas, descargar las fotos del grupo de Flickr cada tres horas, optimizar la base de datos, hacer copia de la misma, generar diferentes json con datos o subir archivos a un repo Git.

Consola cron-job.org

Y además podemos ir viendo un histórico de ejecuciones, lo que ha tardado en ejecutarse, entre otros datos:

Detalles consola cron-job.org

Y en cada ejecución la respuesta de las cabeceras y si hemos devuelto algo como resultado de la tarea, el cuerpo de la respuesta:

Detalles respuesta tarea cron-job.org

Como podéis ver, una gran sistema independiente del hosting. No podemos hacer todo lo que se hace desde la líneas de comandos, pero si todo lo que podamos publicar en una url, que puede ser privada con autenticación y sólo accesible con determinadas cabeceras. En mi caso, las urls «públicas» son archivos PHP que realizan directamente las acciones necesarias o en algunos casos ejecutan scripts bash en el servidor, como algunas optimizaciones de la base de datos. Recordad que «un gran poder conlleva una gran responsabilidad», segurizar todo, dos veces, tres veces y después otras tres veces más y otra vez más 😉

¿Hay más información sobre los cron en WordPress?

Desde luego, esto no es nada más que una gota en el océano. Para gestionar los cron programados en WordPress podéis utilizar algún plugin como el excelente WP Crontrol que os recomiendo.

Tenéis artículos sobre este plugin en los magníficos tutoriales de Kinsta: ¿Cómo Crear y Modificar WordPress Cron Jobs?

Podéis saber todo lo que se debe saber sobre las tareas cron en la web de referencia en español en todo lo que se trate de WordPress: WP-Cron – Todo lo que querías saber sobre el cron de WordPress y su importancia en la optimización web

O por último, aunque quizás debería ser la primera, la entrada en el Plugin Handbook de WordPress sobre Cron.

6 comentarios en «Las tareas cron de WordPress»

    • Gracias por el aporte Israel, muy bueno.

      Efectivamente, los cron también se pueden manejar desde wp-cli, de hecho el plugin mencionado (WP Control) incluía comandos para cli que se han incorparado directamente a wp-cli:

      «The cron commands which were previously included in WP Crontrol are now part of WP-CLI (since 0.16), so this plugin no longer provides any WP-CLI commands. See wp help cron for more info.»

      Saludos.

      Responder
  1. Qué gran artículo Carlos. Muchas gracias por compartir esta información tan chula.

    No conocía muchos detalles y recursos que compartes 😉

    Me meo de risa con la parte de: «el cron nativo de WordPress, que es un poco gallego».

    Un abrazo amigo, saludos

    Responder
    • Gracias Wajari, me alegra que te guste y si te puede aportar algo, mucho mejor.

      Algo de nuestra tierra había que poner en el cron 😁

      Abrazos.

      Responder

Deja un comentario