wake-up-neo.net

WP CRON läuft nur beim ersten Mal

Hier ist mein Code

function cron_add_weekly( $schedules ) {

   $schedules['seconds'] = array(
       'interval' => 5,
       'display' => __( '5 Seconds' )
   );
   return $schedules;
 }

add_filter( 'cron_schedules', 'cron_add_weekly' );

register_activation_hook(__FILE__, 'my_activation');
function my_activation() {
    if ( ! wp_next_scheduled( 'my_hook' ) ) {
    wp_schedule_event( time(), 'seconds', 'my_hook' );
    }

}
add_action( 'my_hook', 'my_exec' );

register_deactivation_hook(__FILE__, 'my_deactivation');
    function my_deactivation() {
        wp_clear_scheduled_hook('my_hook');
    }

function my_exec() {
    $value = 91;
    update_user_meta($value + 1, 'from_cron', 'updated');
}

Das Benutzer-Meta sollte nach dem Aktualisieren der Seite alle 5 Sekunden aktualisiert werden. Aber der Cron läuft nur beim ersten Mal

3
johnson

OK, ich habe Ihren Code getestet und bin mir ziemlich sicher, dass er nicht einmal ausgeführt werden kann. Und hier ist der Grund dafür.

Wenn Sie sich wp_schedule_event ansehen, sehen Sie diese Prüfung oben in der Funktion:

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

Dies bedeutet, dass Sie kein Ereignis mit unbekannter Wiederholung planen können.

Kehren wir also zu Ihrem Code zurück ... Was er tut, ist:

  • fügt Ihre benutzerdefinierte Wiederholung hinzu (mit cron_schedules hook),
  • plant ein Ereignis mit dieser Wiederholung während der Plugin-Aktivierung.

Alles sieht gut aus, oder? Nun, nein - das tut es nicht.

Der Aktivierungshook wird während der Plugin-Aktivierung ausgelöst. Das Plugin funktioniert also nicht, bevor die Aktivierung ausgeführt wird. Daher wird Ihre benutzerdefinierte Wiederholung nicht registriert. Also ... dein Haken ist nicht eingeplant. Ich habe das getestet und das Ergebnis von wp_schedule_event in Ihrem Aktivierungs-Hook ist falsch, sodass das Ereignis nicht geplant ist.

Also, was ist zu tun?

Einfach - Planen Sie Ihr Ereignis nicht mit dem Aktivierungs-Hook, wenn Sie eine benutzerdefinierte Wiederholung verwenden möchten.

Also hier ist dein sicherer Code:

register_deactivation_hook(__FILE__, 'my_deactivation');
function my_deactivation() {
    wp_clear_scheduled_hook('cron_every_5_seconds');
}

function add_every_5_seconds_cron_schedule( $schedules ) {
    $schedules['every_5_seconds'] = array(
        'interval'  => 5,
        'display'   => __( 'Every 5 Seconds', 'textdomain' )
    );
    return $schedules;
}
add_filter( 'cron_schedules', 'add_every_5_seconds_cron_schedule' );

function schedule_my_cron_events() {
    if ( ! wp_next_scheduled( 'cron_every_5_seconds') ) {
        wp_schedule_event( time(), 'every_5_seconds', 'cron_every_5_seconds' );
    }
}
add_action( 'init', 'schedule_my_cron_events' );

function cron_every_5_seconds_action() {
    $value = 91;
    update_user_meta( $value + 1, 'from_cron', 'updated' );
}
add_action( 'cron_every_5_seconds', 'cron_every_5_seconds_action' );

PS. (aber es kann wichtig sein) Es gibt noch einen Fehler in Ihrem Code, aber vielleicht liegt es nur an einigen Änderungen, bevor Sie hier posten ...

Sie können nicht überprüfen, ob Ihr Cron nur ein- oder mehrmals ausgeführt wird. Ihre Ereignisaktion aktualisiert das Benutzer-Meta. Der neu eingestellte Wert ist jedoch immer gleich 91. Und da Sie update_user_meta verwenden, wird nur ein solches Meta in der DB gespeichert.

0

Vorausgesetzt, Ihr Code oben ist korrekt (ich habe ihn nicht getestet), ist es wichtig zu beachten, dass wp-cron nur ausgeführt wird, wenn jemand die Site besucht, sodass es nicht alle 5 Sekunden im Hintergrund ausgeführt wird, wie Sie vielleicht denken.

Als Workaround können Sie wp-cron deaktivieren und dann einen echten Cron-Job implementieren.

Hier ist ein guter Artikel zu diesem Thema.

BEARBEITEN: Versuchen Sie es so hinzuzufügen

function cron_every_5_seconds( $schedules ) {
    $schedules['every_5_seconds'] = array(
        'interval'  => 5,
        'display'   => __( 'Every 5 Seconds', 'textdomain' )
    );
    return $schedules;
}

add_filter('cron_schedules', 'cron_every_5_seconds');

if (! wp_next_scheduled( 'cron_every_5_seconds')) {
    wp_schedule_event(time(), 'every_5_seconds', 'cron_every_5_seconds');
}

add_action('cron_every_5_seconds', 'cron_every_5_seconds_action');
    function cron_every_5_seconds_action() {
        $value = 91;
        update_user_meta($value + 1, 'from_cron', 'updated');
    }
?>
1
RiddleMeThis