Das Ziel
Ich möchte wp_schedule_single_event( )
ein einzelnes Ereignis ausführen, das mir 8 Minuten nach dem Absenden eines Formulars durch den Benutzer eine E-Mail sendet.
Die Angelegenheit
Der folgende Code ist in meinem 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 zum Aufrufen verwendet schedule-event
:
schedule_event( $_SESSION['insert_id'] ); // the $_SESSION var contains an INT
Nach einer Wartezeit von mehr als 8 Minuten befand sich keine E-Mail in meinem Posteingang.
Was ich versucht habe
Mit dem Plugin Core Control ist es möglich zu sehen, welche Cronjobs geplant sind.
Nach ein paar Änderungen habe ich es geschafft, sie richtig zu machen, und besser, wenn ich auf "Jetzt ausführen" drücke, bekomme ich tatsächlich eine E-Mail in meinem Posteingang.
Aber warum werden die Crons nicht ausgeführt, wenn ich meine Site nach 8 Minuten besuche? Was ist möglicherweise falsch an diesem Code? Ich muss sagen, dass ich WP Cron zum ersten Mal benutze.
Ich habe mehr versucht
Nach dem Kommentar von Vancoder ID beschlossen, zu testen, ob der Code funktioniert, wenn ich den folgenden Code direkt in das functions.php
:
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 eine andere Seite aufrufen muss, bevor dieser Code ausgeführt wird. Aber auf der anderen Seite funktioniert das auch nicht, das wäre nicht meine erste Ausgabe ...
schedule_event( $_SESSION['insert_id'] );
gefeuert?schedule_event( )
Datei aus, beispielsweise über der vom Shortcode geladenen enthaltenen Datei.Antworten:
Kannst du bitte zuerst bestätigen, dass keine Caching-Plugins aktiviert sind? Caching-Plugins können Cron-Jobs stören, da Ihren Besuchern keine Live-Seite, sondern eine zwischengespeicherte Version Ihrer Seite bereitgestellt wird.
Wenn Sie ein Caching-Plugin aktiviert haben, können Sie eine Ihrer Seiten auswählen und den Einstellungen Ihres Caching-Plugins für diese Seite einen Ausschluss hinzufügen, damit es niemals zwischengespeichert wird.
Dann müssen Sie manuell einen Cron-Job erstellen (mit cpanel, wenn Sie sich in einer gemeinsam genutzten Hosting-Umgebung befinden, oder vom Terminal aus, wenn es sich um einen VPS / dedizierten Server handelt), der diese Seite alle paar Minuten aufruft.
Ich hoffe das hilft!
quelle
Definieren Sie zunächst Ihre benutzerdefinierten Zeitpläne für Cron-Jobs.
add_filter('cron_schedules', array($this, 'cron_schedules'));
Sie müssen entscheiden, wo und wann die Veranstaltung stattfinden soll.
Hier ist nur ein Codebeispiel, mit dem eine benutzerdefinierte Klassenmethode aufgerufen wird:
Hier ist der Code, der das Ereignis tatsächlich plant:
Jetzt müssen Sie nur noch den Namen Ihrer benutzerdefinierten Cron-Aufgabe aufrufen. In diesem Beispiel lautet der Name der Cron-Aufgabe
custom_imap_import
.add_action('custom_imap_import', array($this, 'do_imap_import'));
In diesem Beispiel wird
$this->do_imap_import();
also alle 30 Minuten aufgerufen (vorausgesetzt, Sie haben genügend Zugriffe auf Ihre Website).Anmerkungen
Erfordert einen Seitenbesuch, damit Ihr Cron zum richtigen Zeitpunkt ausgelöst wird.
Beispiel: Wenn Sie eine Aufgabe in 30-Minuten-Intervallen geplant haben, aber 4 Stunden lang niemand Ihre Site besucht, wird Ihr Cron-Job erst dann ausgelöst, wenn dieser Besucher 4 Stunden später zu Ihrer Site kommt. Wenn Ihre Aufgabe wirklich alle 30 Minuten ausgeführt werden muss, wird empfohlen, einen legitimen Cron-Job über Ihren Webhosting-Anbieter einzurichten, um Ihre Website in den gewünschten Abständen zu besuchen.
WordPress-Cron-Jobs machen Ihre Website nicht langsam!
Vielleicht überlegen Sie, was, wenn die Ausführung des Cron-Skripts lange dauert, die Besucher warten müssen, bis das Skript ausgeführt wird. Nee! Wie kann das möglich sein? Wenn Sie sich die
wp-cron.php
Datei ansehen , finden Sie eine Zeileignore_user_abort(true);
In dieser
php.ini
Konfiguration wird festgelegt, dass das Skript nicht mehr ausgeführt wird, wenn Sie das Laden der Site / des Skripts beenden.Wenn Sie sich die
wp-includes/cron.php
Datei ansehen, finden Sie eine Zeile wie diese:Das bedeutet, dass WordPress nur 0,01 Sekunden auf das Auslösen der Ausführung wartet und dann abgebrochen wird, aber wie Sie es eingestellt haben
ignore_user_abort
, wirdtrue
das Skript ausgeführt. Diese Funktionalität ist ein großer Vorteil, um große Skripte in WordPress-Cron-Jobs auszuführen.Für die Hilfe verfügbare Funktionen:
wp_schedule_event
wp_schedule_single_event
wp_clear_scheduled_hook
wp_next_scheduled
wp_unschedule_event
wp_get_schedule
quelle
WP_Cron
wird GMT unter der Haube verwendet, so wie der Rest des WP, also ist es besser, das erste Event zu planen,time()
anstattcurrent_time()
.Mit WordPress Cron können Sie Aufgaben planen, die jedoch nur ausgeführt werden, wenn eine Anfrage an die Site gestellt wird. Bei jeder Anfrage, die WordPress erhält, wird geprüft, ob Cron-Jobs zu verarbeiten sind. In diesem Fall wird eine Anfrage zur
/wp-cron.php?doing_wp_cron
asynchronen Verarbeitung des Jobs ausgelöst. Wenn der geplante Start eines Jobs ohne Anforderung verstrichen ist, wird der Cron-Prozess nicht gestartet.Da Sie Ihre geplanten Jobs anzeigen und ausführen können, gibt es möglicherweise keine Anforderungen, die den Start des Cron-Jobs auslösen, insbesondere wenn Sie ein Caching-Plugin verwenden. Die beste Möglichkeit, dies in einen regelmäßigeren Zeitplan zu verschieben, besteht darin, die Standardprüfung in WordPress zu deaktivieren und zu verwenden
crontab
.Fügen Sie Folgendes hinzu, um die Standardprüfung zu deaktivieren (was die Leistung auf der Clientseite etwas verbessern kann)
wp-config.php
:Als Nächstes erstellen Sie eine Aufgabe, um die
wp-cron.php
Seite einmal pro Minute abzurufen und alle Jobs im Back-End zu verarbeiten. Geben Sie dazu über die Befehlszeilecrontab -e
Folgendes ein und fügen Sie eine Zeile hinzu, die wie folgt aussieht:quelle
doing_wp_cron=$(date +\%s.\%N)
, um das zu verhindern.Stellen Sie sicher, dass DISABLE_WP_CRON nicht in Ihrer Konfiguration festgelegt ist.
Andernfalls deaktivieren Sie alle Plugins (außer der Kernsteuerung - obwohl ich wp-crontrol verwenden würde) und prüfen Sie, ob Ihre Kernaufträge funktionieren. In diesem Fall tritt irgendwo eine Plug-in-Störung auf.
Versuchen Sie in ähnlicher Weise, zu einem Standardthema für 20-Jährige zu wechseln.
Wenn keines davon einen Unterschied macht, ist es wahrscheinlich ein Hosting-Problem.
quelle
DISABLE_WP_CRON
in meinem festgelegtwp-config.php
, ich werde mehr Dinge versuchen und später wiederkommenÜberprüfen Sie alle Plugins, die Wordpress verbergen.
Wie kann man sehen, ob dies das Problem ist?
+1. Glauben Sie keinen Plugins, die "prüfen, ob cron funktioniert" - zB das WP Cron Status Checker Plugin hat gezeigt, dass cron funktioniert. Tatsächlich aber nicht.
Fazit: Wenn es sich um einen 404-Fehler handelt, deaktivieren Sie a) nicht nur das Zwischenspeichern von Plugins, wie von anderen empfohlen, sondern auch alle Plugins, die Wordpress verbergen.
quelle