it-swarm.com.de

Wie kann ich die Häufigkeit eines geplanten Ereignisses ändern?

Ich habe ein geplantes Ereignis in einem Plugin wie folgt deklariert:

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

Dann wollte ich die Frequenz auf "täglich" ändern, indem ich die ursprüngliche Funktion durch Folgendes ersetzte:

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

Aber es scheint, dass meine Veranstaltung immer noch jede Stunde abgefeuert wird. Ich verwende das Core Control Plugin , um CRON-Aufgaben zu überwachen, und es wird immer noch als "einmal pro Stunde" angezeigt.

2
mike23

Ok, ich könnte das Problem mit wp_clear_scheduled_hook() lösen

Ich habe meine Zeitplanerklärung auskommentiert und am Ende wp_clear_scheduled_hook('send_email_alerts_hook') hinzugefügt. Dann deaktiviere - reaktiviere mein Plugin, wodurch mein geplanter Hook entfernt wurde. Dann wp_clear_scheduled_hook() entfernt und mein Code nicht kommentiert, jetzt wurde der Zeitplan richtig eingestellt.

Fand den Tipp hier .

1
mike23

Es sieht so aus, als würden Sie dieses Ereignis nur dann hinzufügen, wenn noch kein solches Ereignis 'send_email_alerts_hook' geplant ist. Probieren Sie so etwas aus und lassen Sie mich wissen, ob es funktioniert hat.

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');
    } 
}

Die Sache ist, dass Sie dieses Ereignis die ganze Zeit "umschreiben", daher ist es gut, diese Funktion zu deaktivieren, wenn es zum ersten Mal ausgeführt wird.

Die beste Lösung wäre, zu überprüfen, wie diese Jobs gesammelt werden, und zu überprüfen, ob dieses Ereignis bereits hinzugefügt wurde. Wenn ja, dann prüfen Sie, ob die Wiederholung anders ist - wenn ja, neu planen. Sie finden diese Funktion in wp-includes/cron.php, Zeile ~ 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 );
}

Viel Glück!

4
Marek Tuchalski

Versuchen Sie das Debuggen mit diesem Plugin, das ich geschrieben habe: Link zu Github/Gist . Es ist ein bisschen hackig, aber es erfüllt seinen Zweck.

Beachten Sie, dass der Haken wp_footer() in Ihrem Design vorhanden sein muss. Sonst musst du es woanders einhängen.

0
kaiser