X

Cómo configurar tareas programadas en WordPress

WordPress es el constructor de sitios por excelencia, usado por millones de sitios, al día de hoy este representa el 43% de todos los sitios web que hay en el mundo y una de las funciones básicas en cualquier sitio web es la de programar tareas, en un sitio con WordPress sucede igual, se puede necesitar programar publicaciones, actualizaciones, dependiendo del tipo de sitio, también campañas de marketing, activar/desactivar promociones y un largo etc.

¿Qué es WP-Cron?

Para ejecutar este tipo de tareas, WordPress incorpora una herramienta llamada WP Cron que hereda el nombre de Cron de los sistemas UNIX (Linux, Mac, etc), lo que en Windows se denomina el Programador de Tareas y que cumple la misma función, sirve para programar tareas y que estas se ejecuten de manera automática cuando llega la fecha y hora establecida para que ocurra.

Dentro de los sistemas operativos es utilizada para programar diversas tareas, pueden ser desde comprobar actualizaciones, descargar mensajes, ejecutar respaldos, procesar archivos, actualizar datos, reiniciar servicios y casi cualquier tarea que se pueda automatizar o ejecutar de forma desatendida.

Si bien WordPress no es un sistema operativo, tiene la misma necesidad de programar tareas de modo regular y para que se ejecuten en tiempo y forma, aunque sin intervención del usuario y permitiendo planificar a futuro.

Entre las tareas más comunes que se suelen configurar de manera automática dentro de WordPress está la de programar una publicación para que sea publicada a partir de una determinada fecha y hora, aunque también hay otras tareas menos visibles aunque sumamente importante como la de revisar la disponibilidad de actualizaciones o incluso actualizar automáticamente.

WP-Cron es una sumamente importante funcionalidad incorporada directamente en el núcleo de WordPress y que casi siempre pasa desapercibida, sin embargo tiene un objetivo importante y un impacto significativo en el funcionamiento de un sitio y como también puede ser usado en exceso, sobre todo por los plug-ins que se instalen, también tiene un impacto negativo enorme en el rendimiento de WordPress.

En el modo por defecto, cada vez que alguien accede a la página, la herramienta de WP Cron también se carga, comprueba si hay tareas pendientes y de haberlas las ejecuta al mismo momento que se atiende la petición del usuario y se carga el resto de la página, esto trae varios inconvenientes que veremos a continuación.

Defectos de WP-Cron

El primer gran defecto es la imprecisión de cuando se ejecutan las tareas, porque para que una tarea se ejecute alguien debe visitar la página y en sitios de poco tráfico esto puede ser un problema, por ejemplo si se programa algo para ejecutarse a cierta hora, sin embargo si nadie visita la página hasta horas o incluso días después la tarea no se ejecutará hasta entonces.

Este defecto es relativo, siempre hay alguien visitando los sitios, ya sea los buscadores o bots, aunque puede darse en casos que WordPress no es de acceso público, por ejemplo cuando está en una Intranet , si bien son casos particulares y por tanto para la mayoría es una posibilidad remota, es algo hay que tenerlo presente para entender cuando una tarea no se ejecutó cuando se esperaba.

El segundo gran defecto que trae la configuración por defecto de WP Cron es que estas tienen un impacto significativo en los tiempos de carga del sitio, sobre todo cuando se tienen instalados muchos plugins, por cada tarea programada la petición de los usuarios se ven retrasa, habitualmente en milésimas de segundo, sin embargo si dichas tareas implican peticiones https a servicios externos o liberar un cache o tareas por el estilo puede agregar varios segundos a la petición del usuario.

Que se agreguen algunos segundos de repente puede parecer despreciable, sin embargo el principal problema de pérdida de performance tiene un impacto importante en el posicionamiento en los buscadores.

El tercer defecto que podemos describir de WP-Cron es que en algunos casos las tareas directamente no lleguen a ejecutarse nunca jamás en ciertas circunstancias, por ejemplo si el sitio está detrás de un CDN como Cloudflare o utiliza un sistema de caché de algún tipo porque estos interceptan las peticiones y deciden por sí mismos si al usuario se le devuelve contenido cacheado o si reenvían la petición a WordPress para refrescar u obtener nuevos datos.

Si el CDN decide responder con datos cacheados, entonces no se tiene necesidad alguna de llamar a WordPress para refrescar datos, entonces si no hay llamadas directas a WordPress nunca se estaría ejecutado las tareas configuradas en WP Cron.

Solución a los defectos de WP-Cron

Los tres comportamientos descritos son bastante conocidos, aunque la forma en que WP Cron funciona en realidad no es un defecto de WordPress en sí mismo, de hecho son una solución a un problema de falta de configuración.

Esto está implementado de manera que sea funcional sin necesidad realizar una configuración como la que veremos a continuación, en otras palabras, quiere decir está pensado para que funcione aunque el usuario no configure correctamente un cron tradicional de sistema, algo que sobre todo para usuarios principiantes no saben o no pueden hacer por limitaciones de servicio.

Para solucionar estos tres problemas lo primero es editar el archivo wp-config.php y agregar y/o editar la siguiente línea:

define('DISABLE_WP_CRON', true);

Esta configuración hará que la ejecución de las tareas programadas no dependan de que alguien visite el sitio, o mejor dicho deshabilitará la ejecución de las tareas en cada petición, esto tiene la ventaja que cada petición será más rápida, incrementando el tiempo de carga y evitar el retraso de peticiones al no ejecutar allí las tareas.

El segundo paso será configurar un cron para que se ejecute correctamente, puede ser de varias maneras, una puede ser utilizando curl de la siguiente manera:

curl https://www.example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1

Se puede configurar desde cPanel y colocarlo por ejemplo para que se ejecute cada 1 minuto:

* * * * * curl https://www.example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1

El método anterior soluciona dos aspectos importantes, por un lado la puntualidad del cron al no depender de las visitas y por otro la mejora del rendimiento, sin embargo no soluciona el tercer defecto que nombramos que es el tema del uso de un CDN como Cloudflare o un sistema de caché, para solucionar este último punto si es que usamos un CDN claro, es recurrir a una herramienta llamada WP Cli.

Es una herramienta que permite interactuar con WordPress desde una consola, es especialmente útil para automatizar tareas como actualizaciones, instalaciones de plugins, entre otras muchas funciones, la que nos interesa en particular es la que permite sustituir la llamada HTTP con curl que vimos anteriormente a un cron que hace exactamente lo mismo solo que sin pasar por el CDN o el cache.

Lo primero sera descargar WP Cli desde aqui https://wp-cli.org/es/, una vez descargado y colocado en la misma carpeta de WordPress se configura el siguiente cron:

* * * * * cd /home/example/public_html; wp cron event run --due-now >/dev/null 2>&1

Si anteriormente se había configurado con curl debemos quitarlo y sustituirlo por este, no es necesario que queden ambos,

Gestión de crones WP Crontrol

En WordPress no se incluye ninguna herramienta para supervisar y/o agregar tareas más allá de programar publicaciones, sin embargo muchas veces se necesita poder revisar que ocurrió en el sitio, que tareas corrieron además de la posibilidad de agregar nuevas tareas para ser ejecutadas, algo usualmente necesario al momento de desarrollar y/o extender funcionalidades.

Sin embargo, como siempre en WordPress podemos encontrar un plugin para todo, en este caso podemos recurrir a WP Crontrol, nótese que no dice Control, sino Crontrol, un detalle importante al buscarlo.

Este plugin permite realizar varias tareas:

  • Permite visualizar una lista completa de los crones, muestra que acción se ejecutara y que parámetros que utilizan, además agrega su frecuencia y la fecha y hora de su próxima ejecución
  • Otra función interesante es que permite Agregar, editar y/o ejecutar a demanda cualquier tarea programada sin esperar a la fecha y hora
  • Permite agregar al cronograma nuevas tareas a ser ejecutadas.

El manejo de todas estas funciones las podemos hacer desde Herramientas -> Eventos cron en el menú lateral izquierdo.

Conclusiones

La gestión de los crones no es algo que preocupe a la mayoría de los usuarios, sin embargo es valioso tenerlo presente en varias situaciones, por ejemplo cuando algunas cosas no funcionan o no se actualizan cuando deben, por otro lado es algo que se debe prestar atención al querer mejorar el rendimiento del sitio, ya sea porque nos interese mejorar el posicionamiento en los buscadores como ya de por si tenemos un sitio demasiado lento y queremos mejorar la experiencia de usuario haciendo un sitio más rápido.

Otra situación en la que es importante prestar atención a los crones que se ejecutan es al momento de realizar una limpieza de Malware, este es un gran problema en WordPress al ser el CMS más utilizado y ser un blanco de atacantes, una de las formas que tiene el malware para volver a re-infestar un sitio cuando es removido, es justamente esconderse entre los crones, de esa forma se asegura volver a re-infestar el sitio en caso de ser removido, este es una de las grandes dificultades al momento porque a pesar de ser removido este vuelve aparecer.

 

Artículos relacionados