WP Cron wird nicht ausgeführt, wenn die Zeit verstrichen ist

Das Ziel

Ich möchte wp_schedule_single_event( ) , um ein einzelnes Ereignis auszuführen, das mir 8 Minuten nach der Übermittlung eines Formulars eine E-Mail sendet.

Das Thema

Der folgende Code ist in meiner functions.php :

 function nkapi_send_to_system( $args ) { wp_mail( 'xxx', 'xxx', $args ); } add_action( 'nkapi_send', 'nkapi_send_to_system' ); function schedule_event( $id ) { wp_schedule_single_event( current_time( 'timestamp' ) + 480, 'nkapi_send', array( $id ) ); } 

Und der folgende Code wird verwendet, um ein schedule-event aufzurufen:

 schedule_event( $_SESSION['insert_id'] ); // the $_SESSION var contains an INT 

Nach etwas mehr als 8 Minuten war keine E-Mail in meinem Posteingang.

Was ich versucht habe

Mit dem Plugin Core Control können Sie sehen, welche Cron-Jobs geplant sind.

Hauptsteuerungsbildschirm

Nach ein paar Änderungen habe ich es geschafft, sie richtig zu korrigieren, und besser, wenn ich “Run Now” drücke, bekomme ich tatsächlich eine E-Mail in meinem Posteingang.

Aber warum die Cron’s nicht ausführen, wenn ich nach 8 Minuten meine Seite besuche. Was ist möglicherweise falsch an diesem Code? Ich muss sagen, dass ich zum ersten Mal WP Cron nutze.

Ich habe mehr ausprobiert

Nachdem der Kommentar von vacoder id entschieden hat, ob der Code funktioniert, wenn ich den folgenden Code direkt in die functions.php stelle:

 function schedule_event( $id ) { wp_schedule_single_event( time(), 'nkapi_send', array( $id ) ); } if ( isset( $_SESSION['insert_id'] ) ) { if ( ! array_key_exists( 'insert_scheduled', $_SESSION ) || $_SESSION['insert_scheduled'] != $_SESSION['insert_id'] ) { schedule_event( $_SESSION['insert_id'] ); $_SESSION['insert_scheduled'] = $_SESSION['insert_id']; } } 

Der Nachteil dieses Codes ist, dass der Benutzer zu einer anderen Seite gehen muss, bevor dieser Code ausgeführt wird. Aber auf der anderen Seite funktioniert das auch nicht, das wäre nicht mein erstes Problem …

Solutions Collecting From Web of "WP Cron wird nicht ausgeführt, wenn die Zeit verstrichen ist"

Zuerst können Sie bitte bestätigen, dass Sie keine Caching-Plugins aktiviert haben. Caching-Plugins können Cron-Jobs beeinträchtigen, da Ihre Besucher keine Live-Seite, sondern eine zwischengespeicherte Version Ihrer Seite erhalten.

Wenn Sie ein Caching-Plug-in aktiviert haben, können Sie eine Ihrer Seiten auswählen und den Einstellungen Ihres Caching-Plug-Ins für diese Seite einen Ausschluss hinzufügen, damit es nie zwischengespeichert wird.

Dann müssen Sie manuell einen Cron-Job erstellen (mit cpanel, wenn Sie sich in einer Shared Hosting-Umgebung befinden oder vom Terminal aus, wenn es sich um einen VPS / dedizierten Server handelt), der diese Seite alle paar Minuten besucht.

Ich hoffe das hilft!

Definieren Sie zunächst Ihre benutzerdefinierten Cron-Jobpläne.

add_filter('cron_schedules', array($this, 'cron_schedules'));

 public function cron_schedules($schedules){ $prefix = 'cron_';// Avoid conflict with other crons. Example Reference: cron_30_mins $schedule_options = array( '30_mins' => array( 'display' => '30 Minutes', 'interval' => '1800' ), '1_hours' => array( 'display' => 'Hour', 'interval' => '3600' ), '2_hours' => array( 'display' => '2 Hours', 'interval' => '7200' ) ); /* Add each custom schedule into the cron job system. */ foreach($schedule_options as $schedule_key => $schedule){ $schedules[$prefix.$schedule_key] = array( 'interval' => $schedule['interval'], 'display' => __('Every '.$schedule['display']) ); } return $schedules; } 

Sie müssen entscheiden, wo und wann Sie die Veranstaltung tatsächlich planen.

Hier ist nur ein Beispielcode, der einen Aufruf einer benutzerdefinierten classnmethode aufruft:

 $schedule = $this->schedule_task(array( 'timestamp' => current_time('timestamp'), // Determine when to schedule the task. 'recurrence' => 'cron_30_mins',// Pick one of the schedules set earlier. 'hook' => 'custom_imap_import'// Set the name of your cron task. )); 

Hier ist der Code, der das Ereignis tatsächlich plant:

 private function schedule_task($task){ /* Must have task information. */ if(!$task){ return false; } /* Set list of required task keys. */ $required_keys = array( 'timestamp', 'recurrence', 'hook' ); /* Verify the necessary task information exists. */ $missing_keys = array(); foreach($required_keys as $key){ if(!array_key_exists($key, $task)){ $missing_keys[] = $key; } } /* Check for missing keys. */ if(!empty($missing_keys)){ return false; } /* Task must not already be scheduled. */ if(wp_next_scheduled($task['hook'])){ wp_clear_scheduled_hook($task['hook']); } /* Schedule the task to run. */ wp_schedule_event($task['timestamp'], $task['recurrence'], $task['hook']); return true; } 

Jetzt müssen Sie nur noch den Namen Ihrer benutzerdefinierten Crontask aufrufen. In diesem Beispiel lautet der Name der Cron-Aufgabe ” custom_imap_import .

add_action('custom_imap_import', array($this, 'do_imap_import'));

 public function do_imap_import(){ // .... Do stuff when cron is fired .... } 

Also in diesem Beispiel, $this->do_imap_import(); wird alle 30 Minuten aufgerufen (vorausgesetzt, Sie haben genügend Zugriffe auf Ihre Website).


Anmerkungen

Benötigt einen Seitenbesuch, damit dein Cron zu richtigen Zeiten feuern kann.

Beispiel: Wenn Sie eine Aufgabe in Intervallen von 30 Minuten geplant haben, aber niemand Ihre Site für 4 Stunden besucht, wird Ihr Cron-Job erst ausgetriggers, wenn der Besucher 4 Stunden später auf Ihre Site kommt. Wenn Sie Ihre Aufgabe wirklich alle 30 Minuten ausführen müssen, sollten Sie einen legitimen Cron-Job über Ihren Webhosting-Provider einrichten, um Ihre Website in den gewünschten Intervallen zu besuchen.

WordPress Cron-Jobs machen Ihre Website nicht langsam!

Vielleicht überlegen Sie, was passiert, wenn das Cron-Script lange braucht, bis das Skript ausgeführt wird? Nee! Wie kann das möglich sein? Wenn Sie sich die Datei wp-cron.php , finden Sie eine Zeile

ignore_user_abort(true);

Es ist eine php.ini Konfiguration, die festlegt, dass das Skript nicht aufhört, ausgeführt zu werden, wenn Sie aufhören, die Site / das Skript zu laden.

Wenn Sie sich die Datei wp-includes/cron.php , finden Sie eine Zeile wie diese:

 wp_remote_post( $cron_url, array('timeout' => 0.01, 'blocking' => false, 'sslverify' => apply_filters('https_local_ssl_verify', true)) ); 

Das bedeutet, WordPress wartet nur 0,01 Sekunden, um die Ausführung auszulösen, dann wird es ignore_user_abort , aber wie Sie ignore_user_abort auf true gesetzt ignore_user_abort , wird das Skript ausgeführt. Diese functionalität ist ein großer Vorteil, um große Skripte in WordPress Cron-Jobs auszuführen.

functionen zur Hilfe:

  • wp_schedule_event
  • wp_schedule_single_event
  • wp_clear_scheduled_hook
  • wp_next_scheduled
  • wp_unschedule_event
  • wp_get_schedule

Mit WordPress Cron können Sie Aufgaben planen, sie werden jedoch nur ausgeführt, wenn eine Anfrage an die Site gestellt wird. Für jede Anfrage, die WordPress empfängt, prüft es, ob Cron-Jobs zu verarbeiten sind. Wenn dies der /wp-cron.php?doing_wp_cron , wird eine Anfrage an /wp-cron.php?doing_wp_cron asynchron /wp-cron.php?doing_wp_cron , um den Job zu verarbeiten. Wenn der geplante Start eines Jobs ohne eine Anforderung abläuft, wird der Cron-process nicht gestartet.

Da Sie Ihre geplanten Jobs sehen und ausführen können, ist es möglich, dass keine Anfragen den Cron-Job starten, besonders wenn Sie ein Caching-Plugin verwenden. Die beste Möglichkeit, dies auf einen reguläreren Zeitplan zu verschieben, besteht darin, die Standardprüfung in WordPress zu deaktivieren und crontab .

Zuerst, um die Standardprüfung zu deaktivieren (was ein wenig mit der performance auf der Clientseite helfen kann), fügen Sie Folgendes zu wp-config.php :

 // Disable default check for WordPress cron jobs on page loads define( 'DISABLE_WP_CRON', true ); 

Als Nächstes erstellen Sie eine Aufgabe, um die wp-cron.php Seite einmal pro Minute wp-cron.php , um alle Jobs auf dem Back-End zu verarbeiten. wp-cron.php der Befehlszeile crontab -e und fügen Sie eine Zeile hinzu, die wie folgt aussieht:

 */1 * * * * /usr/bin/curl --silent http://example.com/wp-cron.php?doing_wp_cron=$(date +\%s.\%N) >/dev/null 

Stellen Sie sicher, dass DISABLE_WP_CRON nicht in Ihrer Konfiguration eingestellt ist.

Sollte das nicht funktionieren, deaktivieren Sie alle Plugins (außer Core Control – obwohl ich wp-crontrol verwenden würde) und sehen Sie, ob Ihre corejobs funktionieren. Wenn dies der Fall ist, stößt du irgendwo auf Interferenzen.

Versuchen Sie in ähnlicher Weise, zu einem normalen Twentys-Thema zu wechseln.

Wenn nichts davon einen Unterschied macht, ist es wahrscheinlich ein Hosting-Problem.