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

Criar swapfile no Ubuntu: parar o OOM killer de matar o MySQL

VPS de 2 GB onde o mysqld morre de madrugada e o site volta com erro de conexão. Como confirmar…

7 horas atrás

Grupos nomeados no preg_match: pare de contar índice de $matches

Regex com cinco parênteses e ninguém lembra se a data é $matches[2] ou $matches[3]. Nomeie os grupos e leia o…

21 horas atrás

Token de integração da API do Magento 2: gerar e usar no header Bearer

Erro The consumer isn't authorized to access resources ao chamar a REST do Magento 2.4.8? Ative a integração, libere os…

1 dia atrás

Rate limit no wp-login.php com nginx: barrar força bruta antes do PHP

Bots batendo centenas de POST por minuto no login derrubam a CPU. Configure limit_req_zone no nginx e devolva 429 antes…

2 dias atrás

Anonimizar IP no nginx: mascarar o último octeto do log para a LGPD

Seu access.log guarda o IP inteiro dos visitantes há meses sem necessidade. Mascare o último octeto com map e log_format…

3 dias atrás

Prompt injection em campo de usuário: isole a observação do pedido

A observação do pedido chegou com ordem embutida para gerar cupom. Delimite o texto do cliente e trate a resposta…

3 dias atrás