cron_schedules WordPress: intervalo de 5 minutos no WP-Cron

Você precisa sincronizar estoque de 5 em 5 minutos e o WordPress 6.9 só entrega hourly, twicedaily, daily e weekly. Passar 300 direto no wp_schedule_event() não funciona: o segundo parâmetro é o nome de um agendamento registrado, não segundos. Registre o seu com o filtro cron_schedules.

Registrar o intervalo e agendar uma vez só

add_filter('cron_schedules', function (array $schedules): array {
    $schedules['rt_cinco_min'] = [
        'interval' => 300,
        'display'  => 'A cada 5 minutos',
    ];
    return $schedules;
});

add_action('init', function () {
    if (! wp_next_scheduled('rt_sincroniza_estoque')) {
        wp_schedule_event(time() + 60, 'rt_cinco_min', 'rt_sincroniza_estoque');
    }
});

add_action('rt_sincroniza_estoque', 'rt_roda_sincronizacao');

O wp_next_scheduled() é obrigatório. Sem ele, cada carregamento de página empilha um evento novo e em uma tarde você tem centenas de execuções na tabela de opções. Detalhe do core: wp_get_schedules() faz array_merge colocando os agendamentos padrão por último, então dá para acrescentar chave nova, mas não para redefinir o hourly por esse filtro.

Conferindo pelo WP-CLI

sudo -u www-data wp cron schedule list
sudo -u www-data wp cron event list --fields=hook,next_run_relative,recurrence
sudo -u www-data wp cron event run rt_sincroniza_estoque

A armadilha que pega todo mundo vem agora: o WP-Cron não é cron de verdade, ele depende de alguém visitar o site. Em loja com pouco tráfego de madrugada, os 5 minutos viram 40. Se o intervalo importa, desligue o disparo por visita com define('DISABLE_WP_CRON', true); no wp-config e chame pelo crontab do sistema:

# crontab -u www-data -e
*/5 * * * * cd /var/www/seusite/html && /usr/local/bin/wp cron event run --due-now --quiet

Confirme o caminho do binário com which wp antes de colar a linha. E, no register_deactivation_hook do plugin, chame wp_clear_scheduled_hook('rt_sincroniza_estoque'): senão o evento continua agendado com o hook morto, tentando rodar a cada 5 minutos para sempre.

Dúvidas? Faça um comentário logo abaixo ou envie uma mensagem clicando aqui.

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *