it-swarm.com.de

WP Cron - Führen Sie Cron für die nächsten drei Stunden alle 15 Minuten zu einer bestimmten Zeit aus

In WordPress möchte ich ein Ereignis einplanen, das meine Funktion (Hook) zu einer bestimmten Zeit ausführt (z. B. um 18:00 Uhr) und dann nach 15 Minuten erneut ausgeführt wird (dh nach 18:15 Uhr) und alle 15 Minuten weiter ausgeführt wird für 3 Stunden (bis 21 Uhr) und dann stirbt es.

// I have the following code which run after every 6 hours
function myprefix_custom_cron_schedule( $schedules ) {
    $schedules['every_six_hours'] = array(
        'interval' => 21600, // Every 6 hours
        'display'  => __( 'Every 6 hours' ),
    );
    return $schedules;
}
add_filter( 'cron_schedules', 'myprefix_custom_cron_schedule' );

// Schedule an action if it's not already scheduled
if ( ! wp_next_scheduled( 'myprefix_cron_hook' ) ) {
    wp_schedule_event( time(), 'every_six_hours', 'myprefix_cron_hook' );
}

// Hook into that action that'll fire every six hours
add_action( 'myprefix_cron_hook', 'myprefix_cron_function' );

// create your function, that runs on cron
function myprefix_cron_function() {
    // your function...
}
3
Thomas

Richten Sie WordPress Cron Events ein

Angenommen, Sie möchten den Cron um 18:00 Uhr starten und ihn alle 15 Minuten bis 21:00 Uhr (für 3 Stunden) weiter ausführen. Dann hört alles auf.

Hinweis: Zur Vereinfachung der Implementierung wird jede Zeitangabe im CODE als GMT/UTC angesehen.

Dazu müssen Sie zwei Cron-Ereignisse einplanen, von denen eines um 18:00 Uhr beginnt und ab 18:00 Uhr alle 15 Minuten ausgeführt wird. Das andere wird ein einmaliges Cron-Event sein, das um 21 Uhr stattfindet. Dieser wird den anderen Cron aufhalten.

Das Plugin CODE sieht ungefähr so ​​aus:

<?php
/*
Plugin Name:  WPSE Custom Cron
Plugin URI:   https://wordpress.stackexchange.com/a/309973/110572
Description:  Custom Cron Plugin
Version:      1.0.0
Author:       Fayaz Ahmed
Author URI:   https://www.fayazmiraz.com/
*/

add_action( 'wpse_custom_cron_event',        'wpse_custom_cron' );
add_action( 'wpse_custom_cron_event_stop',   'wpse_custom_cron_stop' );

function wpse_custom_cron() {
    // Your Custom Cron CODE HERE
}

function wpse_custom_cron_start() {
    // Calculate the start time: e.g. whenever the next 6:00PM (UTC) is.
    $cron_start_time = strtotime( "today 6:00pm" );
    // If 6PM has already passed today, set it to 6PM next day
    if( $cron_start_time < time() ) {
        $cron_start_time = $cron_start_time + 24 * HOUR_IN_SECONDS;
    }

    if ( ! wp_next_scheduled( 'wpse_custom_cron_event' ) ) {
        wp_schedule_event( $cron_start_time, 'fifteen_minutes', 'wpse_custom_cron_event' );
    }

    if ( ! wp_next_scheduled( 'wpse_custom_cron_event_stop' ) ) {
        // this 1 time cron will stop the original cron 'wpse_custom_cron_event' after 3 hours of starting 
        $cron_stop_time = $cron_start_time + 3 * HOUR_IN_SECONDS;
        wp_schedule_single_event( $cron_stop_time, 'wpse_custom_cron_event_stop' );
    }
}

function wpse_custom_cron_stop() {
    // removing all possible custom cron events named 'wpse_custom_cron_event'
    while( false !== wp_unschedule_event( wp_next_scheduled( 'wpse_custom_cron_event' ), 'wpse_custom_cron_event' ) ) {}
}

// Add a 15 minutes custom cron schedule
add_filter( 'cron_schedules', 'wpse_custom_cron_schedule' );
function wpse_custom_cron_schedule( $schedules ) {
    $schedules['fifteen_minutes'] = array(
        'interval' => 15 * 60,
        'display'  => esc_html__( 'Every Fifteen Minutes' ),
    );
    return $schedules;
}

// schedule the cron event on plugin activation
register_activation_hook( __FILE__, 'wpse_custom_cron_plugin_activation' );
function wpse_custom_cron_plugin_activation() {
    wpse_custom_cron_start();
}
// remove the cron event on plugin deactivation
register_deactivation_hook( __FILE__, 'wpse_custom_cron_plugin_deactivation' );
function wpse_custom_cron_plugin_deactivation() {
    wpse_custom_cron_stop();

    // in case the stop event didn't run yet
    while( false !== wp_unschedule_event( wp_next_scheduled( 'wpse_custom_cron_event_stop' ), 'wpse_custom_cron_event_stop' ) ) {}
}

Dieses Beispiel-Plugin startet den Cron bei der Aktivierung des Plugins. Bei Bedarf können Sie den CODE jedoch auch auf andere Weise ändern (z. B. durch Klicken auf eine Schaltfläche im Admin-Bereich), indem Sie die Funktion wpse_custom_cron_start() verwenden.

Wenn Sie jeden Tag um 18:00 Uhr (nicht nur einmal nach der Aktivierung) dasselbe Cron ausführen möchten, ändern Sie einfach den wp_schedule_single_event-Aufruf in der Funktion wpse_custom_cron_start() in:

wp_schedule_event( $cron_stop_time, 'daily', 'wpse_custom_cron_event_stop' );

Anmerkung: Event/Cron erstellt mit Argumenten

Wenn Sie das Ereignis/cron mit einem Argument erstellen, müssen Sie auch das Ereignis mit genau demselben Argument stoppen.

Wenn Sie beispielsweise das Ereignis wie folgt erstellt haben (in der Funktion wpse_custom_cron_start() des obigen CODE):

....
wp_schedule_event( $cron_start_time, 'fifteen_minutes', 'wpse_custom_cron_event', $args1 );
....
wp_schedule_single_event( $cron_stop_time, 'wpse_custom_cron_event_stop', $args2 );

wenn Sie dann die Ereignisse stoppen, müssen Sie das gleiche Argument auch im Funktionsaufruf wp_next_scheduled() verwenden. So wird der Stopp-Code wie folgt aussehen:

....
while( false !== wp_unschedule_event( wp_next_scheduled( 'wpse_custom_cron_event', $args1 ), 'wpse_custom_cron_event' ) ) {}
....
while( false !== wp_unschedule_event( wp_next_scheduled( 'wpse_custom_cron_event_stop', $args2 ), 'wpse_custom_cron_event_stop' ) ) {} 

Denken Sie auch hier daran, dass es sich um das genau gleiche Argument handeln muss, auch wenn andere Datentypen nicht funktionieren. Beispielsweise sind in dem folgenden CODE $args1 und $args2NICHT gleich, aber $args1 und $args3 sind gleich:

$args1 = array( 'key' => 1 );
$args2 = array( 'key' => '1' );
$args3 = array( 'key' => 1 );

weil '1' eine Zeichenfolge und 1 eine Zahl ist.

Dies ist wichtig, da manchmal die Argumente in der Datenbank als Schlüsselwertpaare gespeichert werden und wenn sie später erneut verwendet werden, der Wert aus der Datenbank für Argumente, die Zahlen waren, nicht funktioniert, da die Zahlen in Zeichenfolgen konvertiert werden wenn aus der Datenbank abgerufen. Sie müssen sie also zurück in Zahlen konvertieren, wenn Sie das Argument an die Funktion wp_next_scheduled() übergeben.

weitere Informationen finden Sie in der Dokumentation:

Den Cron laufen lassen:

Der beste Weg, um WordPress cron auszuführen, ist, define('DISABLE_WP_CRON', true); in der wp-config.php-Datei zu setzen und den cron dann von der crontab-Systemoberfläche aus auszuführen, wie in in diesem Beitrag beschrieben.

Verwenden Sie einen externen Cron-Service:

Falls Sie crontab nicht einstellen können, können Sie einen externen cron-Dienst wie cron-job.org verwenden und den cron entsprechend einstellen.

Für die obigen Cron-Ereignisse können Sie dort beispielsweise einen einzelnen Cron-Job mit einer Einstellung wie der folgenden festlegen:

 cron-job.org settings 

Hier werden alle Werte von Days of Month, Days of Week & Months ausgewählt; und Hours ausgewählt zu 18, 19, 20 und Minutes ausgewählt zu 0, 15, 30, 45. Das heißt: Führen Sie cron Everyday von 18:00 bis 21:00 Uhr aus (GTM wird als Zeitzone ab Kontoeinstellung festgelegt), und zwar in der 0., 15., 30. und 45. Minute (d. H. Im 15-Minuten-Intervall).

Cron Check + Manual Cron:

Sie können mit WP Control plugin prüfen, ob Ihr Cron ordnungsgemäß terminiert ist. Dieses Plugin kann auch verwendet werden, um benutzerdefinierte Cron-Ereignisse und -Intervalle einzurichten.

4
Fayaz

um das zu tun, ist es besser, einen Cron zu haben, der alle 15 Minuten abgefeuert wird, und dann zu testen, ob es Zeit ist, die Behandlungen durchzuführen oder zu warten.

sie können so etwas versuchen:

const ACTIVE_PERIOD = 3 * HOUR_IN_SECONDS;
const WAITING_PERIOD = 6 * HOUR_IN_SECONDS;

const TRANSIENT_STATE = "TestCron__state";
const TRANSIENT_TIMEOUT = "TestCron__timeout";


add_action("TestCron/cron/execution", function () {


    $state = get_transient(TRANSIENT_STATE);

    if (FALSE === $state) {
        set_transient(TRANSIENT_STATE, "waiting");
        set_transient(TRANSIENT_TIMEOUT, time() + WAITING_PERIOD);
    }


    if (get_transient(TRANSIENT_TIMEOUT) < time()) { // state change

        if ("waiting" === get_transient(TRANSIENT_STATE)) {
            set_transient(TRANSIENT_STATE, "active");
            set_transient(TRANSIENT_TIMEOUT, time() + ACTIVE_PERIOD);
        } else {
            set_transient(TRANSIENT_STATE, "waiting");
            set_transient(TRANSIENT_TIMEOUT, time() + WAITING_PERIOD);
        }

    }


    if ("waiting" === get_transient(TRANSIENT_STATE)) {
        // continue to sleep
        return;
    }


    // here actions to do
    do_action("myprefix_cron_hook");



});


add_action("wp_loaded", function () {

    if (!wp_next_scheduled("TestCron/cron/execution")) {
        wp_schedule_event(1, "15_minutes", "TestCron/cron/execution");
    }

});


add_filter("cron_schedules", function ($cron_schedules) {

    $cron_schedules["15_minutes"] = [
        "display" => "15 minutes",
        "interval" => 15 * MINUTE_IN_SECONDS,
    ];

    return $cron_schedules;

});
0
Kaperto