¿Cómo puedo cambiar la frecuencia de un evento programado?

2

He declarado un evento programado en un complemento como este:

function shedule_email_alerts() {
    if ( !wp_next_scheduled( 'send_email_alerts_hook' ) ) {
        wp_schedule_event(time(), 'hourly', 'send_email_alerts_hook');
    }
}

Luego quise cambiar la frecuencia a 'diario', al hacerlo, reemplazando la función original con:

function shedule_email_alerts() {
    if ( !wp_next_scheduled( 'send_email_alerts_hook' ) ) {
        wp_schedule_event(time(), 'daily', 'send_email_alerts_hook');
    }
}

Pero parece que mi evento todavía se dispara cada hora. Utilizo el complemento de control de Core para monitorear las tareas de CRON y todavía se muestra como "una vez por hora"

    
pregunta mike23 23.05.2011 - 17:35

3 respuestas

1

Ok, podría resolver el problema usando wp_clear_scheduled_hook()

Comenté mi declaración de programación y agregué wp_clear_scheduled_hook('send_email_alerts_hook') al final. Luego, desactiva - reactiva mi complemento, lo que eliminó mi gancho programado. Luego eliminé wp_clear_scheduled_hook() y descomenté mi código, ahora la programación se estableció correctamente.

Encontró la sugerencia aquí .

    
respondido por el mike23 23.05.2011 - 21:51
4

Me parece que está agregando este evento solo cuando no hay ningún evento programado 'send_email_alerts_hook' todavía. Prueba algo como esto y hazme saber si funcionó.

function shedule_email_alerts() {
    if ( !wp_next_scheduled( 'send_email_alerts_hook' ) ) {
        wp_schedule_event(time(), 'daily', 'send_email_alerts_hook');
    } else {
        wp_reschedule_event(time(), 'daily', 'send_email_alerts_hook');
    } 
}

Lo que pasa es que "reescribirás" este evento todo el tiempo, por lo que sería bueno desactivar esta función cuando se ejecute por primera vez.

La mejor solución sería verificar cómo se recopilan esos trabajos y verificar si este evento ya está agregado. Si es así, compruebe si la recurrencia es diferente, si es así, vuelva a programar. Puede encontrar esta función en wp-includes / cron.php line ~ 63

function wp_schedule_event( $timestamp, $recurrence, $hook, $args = array()) {
    $crons = _get_cron_array();
    $schedules = wp_get_schedules();

    if ( !isset( $schedules[$recurrence] ) )
        return false;

    $event = (object) array( 'hook' => $hook, 'timestamp' => $timestamp, 'schedule' => $recurrence, 'args' => $args, 'interval' => $schedules[$recurrence]['interval'] );
    $event = apply_filters('schedule_event', $event);

    // A plugin disallowed this event
    if ( ! $event )
        return false;

    $key = md5(serialize($event->args));

    $crons[$event->timestamp][$event->hook][$key] = array( 'schedule' => $event->schedule, 'args' => $event->args, 'interval' => $event->interval );
    uksort( $crons, "strnatcasecmp" );
    _set_cron_array( $crons );
}

¡Buena suerte!

    
respondido por el Marek Tuchalski 23.05.2011 - 19:24
0

Pruebe la depuración con este complemento que escribí: Enlace a Github / Gist . Es un pequeño truco, pero cumple su función.

Tenga en cuenta que el gancho wp_footer() debe estar presente en su tema. De lo contrario, tendrás que conectarlo a otro lugar.

    
respondido por el kaiser 23.05.2011 - 19:41

Lea otras preguntas en las etiquetas