web-dev-qa-db-fra.com

Fonctionnement WP Cron à une heure locale spécifique

Le scénario consiste à exécuter la fonction insert_post tous les minuit (00:00) heure locale. Doit fonctionner quotidiennement en semaine.

function add_daily_task(){
    if((date('l', time()) != 'Saturday') || (date('l', time()) != 'Sunday')){ 
        // insert post
    }
}

if(!wp_next_scheduled( 'add_daily_task_schedule')){
    wp_schedule_event(time(), 'daily', 'add_daily_task_schedule');
    // how should change time() to meet my local schedule?
}

add_action('add_daily_task_schedule', 'add_daily_task'); 
4
Ivan Slaughter

wp_schedule_event ne peut pas être utilisé pour des mesures de temps PRECISE comme vous essayez de le faire. Un événement planifié avec wp_schedule_event s'exécute rarement exactement quand il est planifié. Il s'exécute parfois après l'heure pour laquelle il a été configuré.

Pour comprendre cela, vous devez comprendre que php ne sait pas quelle heure il est avant que vous ne lui demandiez de regarder. Wordpress vérifie l'heure chaque fois que quelqu'un visite votre site Web. Il compare ensuite l'heure actuelle avec l'heure de toutes les tâches planifiées. Si l'heure est égale ou supérieure (après) à l'heure planifiée, la tâche est exécutée.

Cela signifie donc que même si vous résolvez votre problème de planification du temps, votre tâche ne sera exécutée que lorsque le temps que vous aurez choisi sera écoulé ET que quelqu'un chargera votre site Web.

Cela dit, si vous voulez toujours essayer de faire en sorte que cela fonctionne, voici une solution possible. Ajouter un nouvel intervalle à votre functions.php

function cron_add_weekly( $schedules ) {
    // Adds once weekly to the existing schedules.
    $schedules['weekly'] = array(
            'interval' => 604800,
            'display' => __( 'Once Weekly' )
    );
    return $schedules;
}

changez votre fonction en wp_schedule_event(time(), 'weekly', 'add_daily_task_schedule');

Si vous le mettez en place samedi prochain à minuit, Wordpress essaiera d’exécuter ce programme toutes les semaines à la même heure de la journée (en supposant que quelqu'un se rend sur votre site pour déclencher le programme).

4
Matt Keys

La fonction:

time()

donne l'horodatage UNIX dans le fuseau horaire GMT.

Donc, si vous êtes GMT + 2, vous pouvez utiliser:

time() + 2*60*60;

ou si vous êtes GMT-4, vous pouvez utiliser:

time() - 4*60*60;

Essayez de remplacer time () par mytime () dans votre code, où:

function mytime(){
    $gmt_offset_in_hours=-2; // for GMT-2 (EDIT this value) 
    return time() + $gmt_offset_in_hours*60*60;     
}
0
birgire

Vous ne savez pas quelle est la question, mais l'utilisation de time() est fausse car elle vous donnera au mieux l'heure locale du serveur et non l'heure locale du site qui prend en compte la configuration du fuseau horaire de WordPress.

La fonction que vous devez utiliser est current_time .

0
Mark Kaplun