Rodando o WP Cron em hora local específica

4

O cenário é executar a função insert_post a cada meia-noite (00:00) da hora local. Deve ser executado diariamente no dia da semana.

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'); 
    
por Ivan Slaughter 24.01.2013 / 09:26

3 respostas

4

wp_schedule_event não pode ser usado para medições de tempo PRECISO como você está tentando fazer. Um evento agendado com wp_schedule_event raramente é executado exatamente quando está agendado para ser executado, ele é executado em algum momento após o horário para o qual foi configurado.

Para entender isso, você deve entender que o php não sabe que horas são até que você peça para procurar. Wordpress verifica o tempo sempre que alguém visita seu site. Em seguida, compara a hora atual com a hora de todas as tarefas agendadas. Se o tempo for igual ou maior (após) do que o horário agendado, ele executará a tarefa.

Então, isso significa que, mesmo que você descubra seu problema de agendamento de horário, sua tarefa não será executada até que o tempo que você escolher tenha decorrido E alguém carregue seu website.

Com tudo isso dito, se você ainda quiser tentar fazer isso funcionar, aqui está uma solução possível. Adicione um novo intervalo ao seu functions.php

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

altere sua função para wp_schedule_event(time(), 'weekly', 'add_daily_task_schedule');

Se você colocar isso em vigor exatamente à meia-noite do próximo sábado, o Wordpress tentará executar essa programação toda semana na mesma hora do dia (supondo que alguém vá ao seu site para ativar o agendamento).

    
por Matt Keys 12.06.2013 / 05:42
0

A função:

time()

fornece o timestamp do UNIX no fuso horário GMT.

Então, se você é GMT + 2, você pode usar:

time() + 2*60*60;

ou se você é GMT-4, você pode usar:

time() - 4*60*60;

Tente substituir time () por mytime () no seu código, onde:

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

Não tenho certeza sobre qual é a pergunta, mas o uso de time() está errado, já que na melhor das hipóteses você terá a hora local do servidor e não a hora local do site, que leva em consideração a configuração de fuso horário do WordPress .

A função que você deve usar é current_time .

    
por Mark Kaplun 08.02.2013 / 08:12