Wordpress

WP-Cron travado: eventos agendados que não rodam no WordPress 6.9

O post agendado para as 8h aparece na lista com “Perdeu o agendamento” e o backup noturno não roda há três dias. Antes de culpar o plugin, olhe a fila: quase sempre o WP-Cron está esperando uma requisição que nunca chega, ou preso numa trava esquecida em wp_options.

Veja a fila e teste o gatilho

cd /var/www/rogertakemiya.com.br/html
sudo -u www-data wp cron event list --fields=hook,next_run_relative,recurrence
sudo -u www-data wp cron test

Se o event list mostra um monte de “now” ou tempo negativo, os eventos venceram e ninguém disparou. O wp cron test faz a mesma requisição de loopback que o WordPress faria para o wp-cron.php e diz se ela voltou. Loopback quebrado é o motivo número um: HTTP básico no staging, regra de nginx bloqueando o arquivo, Cloudflare agressivo.

Solte a trava e rode o que venceu

sudo -u www-data wp transient delete doing_cron
sudo -u www-data wp cron event run --due-now

O transient doing_cron é a trava que o core cria em spawn_cron() para evitar duas execuções ao mesmo tempo. Quando o PHP morre no meio, por timeout ou memória, ela fica lá e segura tudo. Confirme antes que não tem nada rodando de verdade: apagar a trava com um cron ativo libera uma segunda execução em paralelo, e importador ou disparo de e-mail rodando duas vezes dá dor de cabeça.

Pare de depender de visita no site

Site de pouco tráfego não tem quem acione o cron às 3h. Desligue o gatilho por visita no wp-config.php com define(‘DISABLE_WP_CRON’, true); e ponha a linha no crontab do usuário do PHP, com sudo crontab -u www-data -e:

*/5 * * * * cd /var/www/rogertakemiya.com.br/html && /usr/local/bin/wp cron event run --due-now --quiet >/dev/null 2>&1

A pegadinha para fechar: definir DISABLE_WP_CRON sem criar a linha no crontab deixa o site pior, porque aí não roda nada. E o post que perdeu o agendamento não volta sozinho — reagende com wp post update 123 –post_status=future –post_date=”2026-09-02 08:00:00″ ou pela tela de edição.

Post Recentes

Desligar o AMP no WordPress 6.9: redirect do /amp/ sem perder tráfego

Como aposentar o plugin AMP sem transformar centenas de URLs /amp/ indexadas em 404: o rewrite 301 no nginx, a…

23 horas atrás

Redis OOM Magento 2: ajustar a maxmemory-policy e separar os bancos

A loja cai com OOM command not allowed when used memory > maxmemory: ajuste a maxmemory-policy do Redis e separe…

1 dia atrás

Checkbox de privacidade no checkout do WooCommerce: texto e registro do aceite

Adicione a caixa de aceite no checkout do WooCommerce e grave data e versão da política como meta do pedido,…

2 dias atrás

json_validate no PHP 8.3: conferir se o JSON é válido sem decodificar

A função json_validate do PHP 8.3 diz se a string é JSON válido sem montar array nem objeto. Serve para…

2 dias atrás

Chave de API fora do Git: .env, getenv() e o que fazer se ela já vazou

Tire a chave de API do código com variável de ambiente, bloqueie o .env no nginx e entenda por que…

2 dias atrás

HPOS no WooCommerce: ativar as tabelas wc_orders e migrar os pedidos

A opção de armazenamento de pedidos travada em posts e a sincronização que nunca termina: como migrar para as tabelas…

3 dias atrás