web-dev-qa-db-fra.com

WP Cron - Exécutez Cron toutes les 15 minutes à une heure précise pendant les trois prochaines heures.

Dans WordPress, je souhaite planifier un événement qui exécutera ma fonction (hook) à une heure précise (par exemple, à 18 heures), puis il s'exécutera à nouveau après 15 minutes (signifie à 18h15) et continuera après toutes les 15 minutes. pendant 3 heures (jusqu'à 21 heures) et puis il meurt.

// 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

Configurer les événements WordPress Cron

Supposons que vous vouliez démarrer le cron à 18h et continuer à l'exécuter toutes les 15 minutes jusqu'à 21h (pendant 3 heures). Puis tout cron s'arrête.

Remarque: pour la simplicité de mise en œuvre, toute entrée de temps dans le CODE est considérée comme étant GMT/UTC.

Pour cela, vous devez planifier deux événements cron, l'un débutera à 18 heures et continuera toutes les 15 minutes à partir de 18 heures. L'autre sera un événement cron qui se déroulera à 21h. Celui-ci arrêtera l'autre cron.

Le plugin CODE ressemblera à ceci:

<?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' ) ) {}
}

Cet exemple de plug-in démarrera cron lors de l'activation du plug-in, mais si nécessaire, vous pouvez éditer le code pour le démarrer par d'autres moyens également (par exemple, en cliquant sur un bouton dans le panneau d'administration) à l'aide de la fonction wpse_custom_cron_start().

De même, si vous souhaitez exécuter le même cron tous les jours à 18h (et non pas une fois après l'activation), modifiez simplement l'appel wp_schedule_single_event dans la fonction wpse_custom_cron_start() en:

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

Note: Event/Cron créé avec des arguments

Si vous créez l'événement/cron avec un argument, vous devez également arrêter l'événement avec exactement le même argument.

Par exemple, si vous avez créé l'événement comme ceci (dans la fonction wpse_custom_cron_start() du code ci-dessus):

....
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 );

puis, lors de l’arrêt des événements, vous devez également utiliser le même argument exact dans l’appel de la fonction wp_next_scheduled(). Donc, l'arrêt CODE deviendra comme:

....
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' ) ) {} 

Encore une fois, rappelez-vous, il doit s'agir du exactement le même argument , même un type de données différent ne fonctionnera pas. Par exemple, dans le code suivant, $args1 et $args2 sontPASidentiques, mais $args1 et $args3 sont identiques:

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

parce que '1' est une chaîne et 1 est un nombre.

Ceci est important car, parfois les gens sauvegardent les arguments dans la base de données sous forme de paires clé-valeur , & lorsqu'ils l'utilisent plus tard, la valeur de la base de données ne fonctionne pas pour les arguments qui étaient des nombres, car les nombres sont convertis aux chaînes lors de l'extraction de la base de données. Vous devez donc les reconvertir en nombres lorsque vous passez l'argument à la fonction wp_next_scheduled().

pour plus d'informations, consultez la documentation:

Lancer le cron:

La meilleure façon d’exécuter WordPress cron consiste à définir define('DISABLE_WP_CRON', true); dans le fichier wp-config.php, puis à exécuter le cron à partir de la crontab système comme décrit dans cet article .

Utilisez le service cron externe:

Si vous ne pouvez pas définir crontab, vous pouvez utiliser un service externe cron tel que cron-job.org et définir le cron en conséquence.

Par exemple, pour les événements cron ci-dessus, vous pouvez définir un seul travail cron avec un paramètre tel que:

 cron-job.org settings 

Ici, toutes les valeurs de Days of Month, Days of Week & Months sont sélectionnées; et Hours sélectionné à 18, 19, 20 et Minutes sélectionné à 0, 15, 30, 45. Ce qui signifie: lancez cron tous les jours de 18h à 21h (le GTM est défini comme fuseau horaire à partir du paramétrage du compte) les 0e, 15e, 30e et 45e minutes (c'est-à-dire toutes les 15 minutes).

Vérification Cron + Cron manuel:

Vous pouvez vérifier si votre cron planifie correctement en utilisant WP Control plugin. Ce plugin peut également être utilisé pour configurer des événements et des intervalles cron personnalisés.

4
Fayaz

pour ce faire, il est préférable d’avoir un cron licencié toutes les 15 minutes, puis de vérifier si le moment est venu de faire les traitements ou d’attendre.

vous pouvez essayer quelque chose comme ça:

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