Wordpress

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.

Post Recentes

E-mails do WooCommerce não chegam: como testar o envio de um pedido real

Dispare pela linha de comando o e-mail de um pedido que já existe na loja e descubra se a falha…

10 horas atrás

CodeIgniter 4 tela branca: CI_ENVIRONMENT e o erro que sumiu

Página em branco no CodeIgniter 4, sem nenhuma mensagem? O ambiente está em production e escondeu o erro. Troque o…

24 horas atrás

Google Consent Mode v2 no WordPress: default denied antes do gtag rodar

O Google Ads acusa consentimento ausente porque o gtag sobe antes do banner. Veja como injetar o default denied do…

2 dias atrás

Módulos PHP 8.3 faltando na Saúde do site do WordPress: como instalar

A tela Saúde do site avisa que faltam extensões como intl, imagick ou zip: instale no PHP 8.3, reinicie o…

2 dias atrás

Caso de teste PHPUnit a partir do bug: do relato solto para o teste que falha

Chegou um chamado sem passo a passo e sem exemplo. Veja como virar esse relato em um caso de teste…

3 dias atrás

Bloquear .env e .git no nginx: as regras que ainda deixam o arquivo vazar

Negar /.env no nginx parece resolvido até alguém pedir /wp-content/uploads/.env ou backup.sql. As regras que testei e os furos que…

5 dias atrás