web-dev-qa-db-fra.com

wp_schedule_event () à une heure précise, tous les jours

Je ne suis pas très familier avec WP Cron, mais je les ai utilisés dans l'un de mes sites en toute connaissance de cause. Je définis une requête personnalisée pour chaque heure:

add_action( 'init', function () {
    if( ! wp_next_scheduled( 'expire_cpt' ) ) {
        wp_schedule_event( time(), 'hourly', 'expire_cpt' );
    }
    add_action( 'expire_cpt', 'pre_expire_the_offers' );
});
function pre_expire_the_offers() {
 //...
}

Maintenant, notre procédure à la fonction a changé, et nous avons pensé opter pour un horaire quotidien. J'ai donc configuré les choses de cette façon:

add_action( 'init', function () {

    //Used once to delete all the schedule
    //wp_clear_scheduled_hook('expire_cpt');

    //I assumed, by clearing, I no-longer need this
    //$timestamp = wp_next_scheduled( 'expire_cpt' );
    //wp_unschedule_event( $timestamp, 'expire_cpt' );

    if( ! wp_next_scheduled( 'expire_cpt' ) ) {
        //Need to run this at 24:00:00 everyday, not 24 hours from now
        wp_schedule_event( time('00:00:00'), 'daily', 'expire_cpt' );
    }
    add_action( 'expire_cpt', 'pre_expire_the_offers' );
});

Je le fais sur un serveur WAMP local sur une machine Windows. L’heure de mon ordinateur local, qui correspond à echo date( 'Y-m-d H:i:s', current_time( 'timestamp' ) ), est 2016-04-11 17:18:58.

Une différence de six heures peut correspondre à l’heure GMT et à mon fuseau horaire (+6) - c’est raisonnable.

Mais le problème est avec la prochaine heure programmée.

J'utilise:

pour le débogage des travaux Cron.

Debug Bar Cron affiche l'heure actuelle: 11:52:54, tandis que l'horodatage indique: 17:52:52. Le problème est que l'heure de la prochaine occurrence n'est pas 00:00:00, mais

2016-04-12 11:33:56
1460460836
24 hours

ACM montre:

In 24 hours
12.04.2016 17:33:56

Comment puis-je reprogrammer ma requête/fonction à une heure précise , tous les jours (modification de mon planning actuel)?

4
Mayeenul Islam

time() ne renvoie que l'heure actuelle, il n'accepte aucune entrée.

$time = time(); // works out to 2016-04-11T12:11:34+00:00

Ce que tu veux c'est minuit demain:

$tomorrow = strtotime( 'tomorrow' ); // works out to 2016-04-12T00:00:00+00:00

Notez qu'il s'agit de PHP fonctions et qu'elles ignorent le fuseau horaire WP, car il réinitialise le fuseau horaire PHP au format UTC. Donc, si vous les utilisez, vous le réglez à minuit dans le fuseau horaire UTC.

Pour que tout se passe bien dans WP est un désordre (cela pourrait ne pas fonctionner dans certaines configurations non définies par timezone_string, voir mon message sur DateTime dans WP pour plus de détails) :

$date = new DateTime( 'tomorrow', new DateTimeZone( get_option( 'timezone_string' ) ) );
// works out to 2016-04-12T00:00:00+03:00
$timestamp = $date->getTimestamp();

Remarque: WP Cron n'est pas garanti de s'exécuter à une heure précise, car il est déclenché par des visites sur le site. Je ne suis pas sûr que si les courses récurrentes "collent" à minuit ou s'en échappent lentement, il vous faudra peut-être effectuer un réajustement périodique.

11
Rarst