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_estoqueA 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 --quietConfirme 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.