April 11, 2019

Programar tareas con el cron de WordPress

El cron de WordPress es un sistema por el cual se lanzan ciertas tareas de un modo programado cada X tiempo. Por ejemplo, esto permite a WordPress revisar las actualizaciones disponibles, la publicación programada de contenidos, o los envíos de correo.

Como WordPress dispone de este sistema, nosotros en nuestros plugins podemos hacer uso del mismo para ejecutar cierto código cada un tiempo establecido, y no de modo constante con cada ejecución de la web que es el modo en que se ejecuta todo el codigo de normal.


WordPress tiene un cron Virtual

Lo malo del cron de WordPress es que si una web no tiene visitas no se activa este cron aunque tenga acciones programadas, ya que para que se ejecute una función cada X tiempo según este cron es necesario que se active el código del cron con una visita a la web.

Esto es debido a que WordPress realmente lo que usa es un cron virtual que como todo el codigo del core se ejecuta al lanzarse una petición de la web. Es en ese momento cuando WordPress revisa si tiene algo programado y sólo lo ejecuta cuando toque, pero si no se llega activar el cron con una visita esto no puede llega a suceder.

Por tanto el cron de WordPress no es como un cron como el que pueda haber en tu servidor que se ejecuta exactamente cada X tiempo programado; salvo que con continuas visitas se esté frecuentemente revisando.

¿cómo mejorar el cron de WP en el caso de una web con pocas visitas o con procesos de cron importantes a ejecutar?

Tan sólo tienes que programar con un verdadero cron en tu servidor el que se ejecute el fichero wp-cron.php con la frecuencia que consideres, y este ya se encargará de lanzar las acciones según cómo estén programadas en WordPress.


Añadir tareas programadas

Una vez visto que es un cron y las peculiaridades del cron de WordPress, podemos pasar a ver el código con el que programar nuestras propias acciones cada X tiempo.

Es importante destacar lo siguiente:

  • Creamos nuestra propia frecuencia sólo una vez, en lo que sería la activación de nuestro plugin personalizado.
  • Definimos un hook propio de activación como en este caso suma_hourly_event ( que en el ejemplo es cada hora), pero podemos poner aquí el nombre que se quiera.
  • Comprobamos antes de añadir la nueva frecuencia y definir un hook propio de activación si este nuevo hook no existe ya.
  • Del mismo modo que la activación tenemos que acordarnos de borrar el nuevo hook definido al desactivar el plugin.
/*
* Do actions in plugin activation
*/
register_activation_hook( __FILE__ , function() {
    if ( ! wp_next_scheduled ( 'suma_hourly_event' ) ) {
        wp_schedule_event( current_time( 'timestamp' ), 'hourly', 'suma_hourly_event' );
    }
} );

/*
* Do actions in plugin deactivation
*/
register_deactivation_hook( __FILE__ , function() {
    wp_clear_scheduled_hook( 'suma_hourly_event' );
} );
  • El codigo presentado tal y como está planteado se ejecuta en la raiz del plugin en el que se encuentre.
  • A partir de este código ya tenemos a nuestra disposición un hook propio que hemos definido en este caso como suma_hourly_event
  • Todas las acciones referenciadas a este hook se ejecutarán cada hora según lo hemos establecido al indicar hourly

Una vez definido nuestro hook solo tenemos que añadir nuestro codigo del siguiente modo:

add_action( 'suma_hourly_event', function(){

    //code to execute every hour

} );

Todo el código insertado en una función que «enganchemos» a nuestro nuevo hook suma_hourly_event se ejecutará en este caso con la frecuencia de cada hora.


Programación intervalos personalizados

Hemos visto como añadir un hook que se ejecute cada hora, al cual «enganchar» el código que queremos que se lance con esta frecuencia, y para ello hemos usado uno de los valores ya reconocidos por WordPress:

hourly – daily – twicedaily

Pero… como te podrás imaginar podemos establecer nuestro propio periodo personalizado fuera de los ya establecidos de modo nativo.

Para hacerlo guiate por el siguiente código de ejemplo en el que se establece un periodo de 60 segundos, y por tanto cada minuto.

add_filter( 'cron_schedules', function( $schedules ) {

    $schedules['minute'] = [
        'interval' => 60,
        'display' =>'60 segundos'
    ];

    return $schedules;
} );
  • Usamos el filtro cron_schedules para recibir el array con todos los intervalos existentes y así poder añadir el nuestro.
  • En el ejemplo se usa como nombre minute según puedes ver en la clave del array, siendo este el valor a usar en vez de hourly en el momento de definir durante la activación la frecuencia.
  • Fijate en interval como indica 60 para hacerlo con la frecuencia de 1 minuto, ya que es requerido el tiempo en segundos.

Por tanto, haciendo uso del cron de WordPress podemos ser capaces de un modo sencillo de lanzar tareas programadas y no en cada ejecución, permitiendo así ejecutar código sólo de modo esporádico con la frecuencia que necesitemos.

Si te ha gustado... ¡Compártelo!