Registrar y disparar un WP-Cron personalizado

Php marzo 10, 2026

WP-Cron es el sistema de tareas programadas de WordPress. A diferencia del cron del servidor, WP-Cron se activa con las visitas al sitio — si nadie visita el sitio, las tareas no se ejecutan. Para tareas críticas en producción se recomienda desactivar WP-Cron y configurar un cron real del servidor. Aun así, es perfectamente válido para la mayoría de sitios.

Casos de uso: sincronización diaria con una API externa, envío de emails periódicos, limpieza automática de logs o datos temporales, generación programada de informes.

<?php
register_activation_hook( __FILE__, 'mi_plugin_activar_cron' );
function mi_plugin_activar_cron() {
    if ( ! wp_next_scheduled( 'mi_tarea_diaria' ) ) {
        wp_schedule_event( time(), 'daily', 'mi_tarea_diaria' );
    }
}

register_deactivation_hook( __FILE__, 'mi_plugin_desactivar_cron' );
function mi_plugin_desactivar_cron() {
    wp_clear_scheduled_hook( 'mi_tarea_diaria' );
}

add_action( 'mi_tarea_diaria', 'ejecutar_tarea_diaria' );
function ejecutar_tarea_diaria() {
    update_option( 'mi_ultima_ejecucion', current_time( 'mysql' ) );
}

¿Qué hace cada parte?

  • register_activation_hook(): ejecuta la función solo cuando el usuario activa el plugin en el admin. Es el momento correcto para programar eventos.
  • wp_next_scheduled(): comprueba si el evento ya está programado antes de añadirlo. Sin esto, cada activación crearía un duplicado.
  • wp_schedule_event(): programa el evento. Parámetros: timestamp de primera ejecución, frecuencia (hourly, twicedaily, daily o una personalizada), nombre del hook.
  • register_deactivation_hook(): se ejecuta al desactivar el plugin. Imprescindible para no dejar eventos huérfanos en la base de datos que nunca se ejecutarán.
  • wp_clear_scheduled_hook(): elimina todos los eventos programados con ese nombre del hook.
  • add_action( ‘mi_tarea_diaria’ ): conecta el hook personalizado con la función que ejecuta el trabajo real. Sin este add_action, el evento se dispararía pero no haría nada.