Cronjob en WordPress Programar tareas recurrentes

19 Oct

Tuve la necesidad de actualizar la base de datos de un sitio y sincronizarla con datos de otro servidor mediante un API.

La primer solución que pensé fue crear un bash y agregarlo al crontab del servidor, sencillo y elegante… Pero profundizando en la documentación del API de Worpress descubrí que existe una herramienta llamada wp_schedule_event para programar tareas recurrentes

¿Cual es mejor? No lo se…

Pienso que una de las ventajas al crear un bash es la seguridad que obtenemos por la ejecución mediante consola, otra es librar el tiempo de ejecución de Apache, si nuestra tarea dura 10 minutos el servidor debería procesarla sin problemas

Por otro lado agregar nuestro trabajo al Cronjob de WordPress nos permite utilizar el codex lo cual mejora un montón la administración de la base de datos y optimiza el consumo de los recursos del servidor ya que el administrador de tareas de WordPress solo se ejecuta mediante solicitudes de Apache por http, esta ultima fue la que elegí pos nomas, por aprender un poco mas del codex

1. Registrar nuestra tarea en el sistema

// Registramos una cronjob nuevo
register_activation_hook(__FILE__, 'wp_cronbase_task');

2. Verificar si existe el cronjob o agregarlo

/**
 * wp_cronbase_task
 * @version 0.1
 * Verifica si existe la tarea en la cola de cronjobs de wp o la agrega cada hora
 */
function wp_cronbase_task() {
    if (!wp_next_scheduled('wp_cronbase_task')) {
        wp_schedule_event(current_time('timestamp'), 'hourly', 'wp_cronbase_task');
    }
}

3. Definir el Hook de nuestra tarea

// Hook de la tarea
add_action('wp_cronbase_task', 'task_cronbase');

4. Función de la chamba, lo que se quiere hacer!

/**
 * task_cronbase
 * @version 0.1
 * @todo Eliminar el contenido y sustituir por tu funcionalidad
 * Tarea del cronjob
 */
function task_cronbase() {

  $file = fopen("wp_cronbase.log","a");
  echo fwrite($file, "\n" . date('Y-m-d h:i:s') . " :: Escrito por WP Cronbase");
  fclose($file);
}

Si lo ponemos en un archivo y lo zipeamos tenemos un plugin que ejecuta esta tarea cada hora (si hay un evento de apache que la dispare). Lo pongo en este repositorio de Git.

Recomiendo el plugin WP Control para ver el estado de tus cronjobs.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Eres un robot? * Time limit exceeded. Please complete the captcha once again.