Programar tareas en WordPress con WP cron
Programar tareas en WordPress es bastante sencillo y existen varios plugin que pueden facilitar el trabajo de hacerlo. Pero a veces, no nos conviene tener que instalar un plugin para esto. Veamos como podemos programar tareas.
¿Qué es WP cron?
WP cron es el programa de WordPress que se encarga de ejecutar tareas programadas una sola vez, o de manera recursiva.
De manera predeterminada, se ejecuta cada vez que alguien accede a una página de nuestra web, por lo que conviene no tenerlo sobrecargado de tareas para que sea lo más liviano posible. De hecho, es por este motivo que muchos recomiendan desactivar WP cron de la configuración de WordPress y lanzarlo regularmente desde el planificador de tareas del sistema que, además, lo hará más confiable.
Como solo se ejecuta cuando alguien visita una página WP cron tiene la desventaja de no ser demasiado fiable a la hora de lanzar ciertas tareas si la web no tiene tráfico de manera regular. Pero, el que nuestra web tenga mucho tráfico, hará que se ejecute el cron de WordPress demasiado a menudo, sobrecargando el servidor.
Por otro lado, tiene la ventaja de poder lanzar tareas que se tenían que haber lanzado en el pasado de modo que, sí o sí, en cuanto se ejecute, se realizarán todas las tareas pendientes hasta ese momento.
Añadir intervalos personalizados en WP Cron
WordPress ofrece tres intervalos de tiempo pre-programados: una vez cada hora (hourly), una vez al día (daily) y dos veces a día (twicedaily). Podríamos querer programar otros intervalos para usar en alguna de nuestras tareas, por ejemplo, que se ejecute una vez por semana (weekly).
Para disponer de este nuevo intervalo, añadimos este código a nuestro functions.php o, mejor aún, al código de nuestro plugin.
/*
* Modificamos la lista de intervalos de WP_cron,
* ejecutando la funcion add_cron_weekly_interval.
*/
add_filter( 'cron_schedules', 'add_cron_weekly_interval' );
/*
* $schedules, contiene la lista de intervalos.
* con esta función, cogemos esa lista, añadimos nuestro intervalo,
* y la devolvemos a cron con el nuevo intervalo.
*/
function add_cron_weekly_interval( $schedules ) {
$seconds_in_a_week = 60 * 60 * 24 * 7;
$schedules['weekly'] = array(
'interval' => $seconds_in_a_week,
'display' => esc_html__( 'Every weeks' );
);
return $schedules;
}
Lenguaje del código: PHP (php)
Añadir una tarea a WP Cron
Para añadir una tarea al cron de WordPress, lo primero que tenemos que hacer es crear un hook que ejecute la tarea. A continuación, añadimos en hook a las tareas programadas de cron.
add_action( 'task_hook_name', 'function_to_execute' );
Lenguaje del código: JavaScript (javascript)
wp_schedule_event()
añade un hook en la lista de cron. Lo hace con independencia de si ya existe otro evento con el mismo nombre añadido. Por lo que si no tenemos un control, en cada ejecución del código que contiene la función, añadirá una nueva ejecución a la lista de cron. Pudiendo encontrarnos de que nuestra tarea programada se ejecuta miles de veces.
wp_next_scheduled()
recibe como parámetro el nombre del hook, consulta la lista de cron y devuelve el la fecha y hora (timestamp) de la próxima ejecución. Si no encuentra el hook en la lista, devuelve false. Podemos usar wp_next_scheduled()
para comprobar si un hook ya ha sido añadido a cron antes de añadirlo otra vez.
if ( ! wp_next_scheduled( 'task_hook_name' ) ) {
wp_schedule_event( time(), 'weekly', 'task_hook_name' );
}
Lenguaje del código: JavaScript (javascript)
Desprogramar una tarea de cron
Cuando ya no necesitas que la tarea esté programada, debes quitarla de la lista de cron para que no se vuelva a ejecutar. Para esto, usa la función wp_unschedule_event()
. Esta función recibe dos parámetros: el timestamp y el nombre del hook a desactivar. Es seguro que no vas a recordar el timestamp de la próxima ejecución del evento, por lo que volveremos a hacer uso de wp_next_scheduled()
para que nos asista en esta tarea.
$timestamp = wp_next_scheduled( 'task_hook_name' );
wp_unschedule_event( $timestamp, 'task_hook_name' );
Lenguaje del código: PHP (php)
Desprogramar eventos de cron al desactivar el plugin
Cuando un plugin se desactiva se llama a un hook de desactivación que debería ejecutar una función que deje WordPress sin rastro del plugin. La función register_deactivation_hook()
permite correr una función cuando el plugin es desactivado. Vamos a hacer uso de ella para desprogramar los hooks del cron de WordPress cuando deshabilitemos nuestro plugin.
register_deactivation_hook( __FILE__, 'task_hook_name_deactivate');
function task_hook_name_deactivate( 'task_hook_name') {
$timestamp = wp_next_scheduled( 'task_hook_name' );
wp_unschedule_event( $timestamp, 'task_hook_name' );
}
Lenguaje del código: PHP (php)