Como corrigir o WP-Cron que não executa no WordPress
O que é o WP-Cron que não executa?
O WP-Cron é o agendador interno do WordPress que executa tarefas como publicar posts agendados, enviar e-mails, rodar backups e checar atualizações. Diferente de um cron real do sistema operacional, ele só dispara quando alguém acessa o site: cada visita verifica se há tarefas pendentes. Em sites com pouco tráfego, ou quando a chamada loopback ao wp-cron.php está bloqueada, as tarefas atrasam ou nunca rodam, e aparece o aviso de agendamento perdido.
Como identificar
- Um post agendado fica com o status “Agendamento perdido” (Missed schedule) e não é publicado na hora marcada.
- Em Ferramentas, Saúde do site, aparece o aviso “O WP-Cron não funcionou desde a última verificação”.
- Backups, e-mails transacionais e relatórios de plugins param de ser enviados sem nenhuma mensagem de erro.
- O comando wp cron event list via WP-CLI mostra eventos com a coluna de próxima execução muito atrasada.
Como prevenir
- Configure um cron real do servidor a cada 5 minutos desde a instalação, em vez de confiar no disparo por visita
- Monitore os eventos agendados com WP Crontrol ou WP-CLI e cheque a tela de Saúde do site após cada migração
- Garanta que firewall e Cloudflare nunca bloqueiem a requisição loopback ao wp-cron.php do próprio servidor
Causa
- O site tem pouco ou nenhum tráfego, então não há visitas para disparar o WP-Cron, que só roda quando uma página é carregada.
- A constante DISABLE_WP_CRON está definida como true no wp-config.php, mas nenhum cron real do servidor foi configurado para substituí-la.
- A requisição loopback (o site chamando o próprio wp-cron.php) está bloqueada por firewall, Cloudflare, autenticação HTTP básica ou DNS interno incorreto.
- Um plugin de cache de página inteira serve a home cacheada e o WordPress nunca executa o disparo do cron naquela visita.
- A constante ALTERNATE_WP_CRON foi ativada de forma incorreta e gera um redirecionamento que impede o agendador de concluir.
Como resolver
- Confirme se o cron está travado: instale o plugin WP Crontrol ou rode o comando de listagem do WP-CLI. Se houver eventos com horário no passado acumulados, o agendador não está disparando.
wp cron event list wp cron event run --due-now - Desative o WP-Cron interno: no wp-config.php, acima da linha que pede para parar de editar, adicione a constante que desliga o disparo por visita. Sozinha ela para o agendador; o passo seguinte é obrigatório.
define( 'DISABLE_WP_CRON', true ); - Agende um cron real no servidor: no painel da hospedagem (cPanel, Cron Jobs) ou via crontab, crie uma tarefa que chame o wp-cron.php a cada 5 minutos. Use a versão por linha de comando para não depender de HTTP.
*/5 * * * * cd /home/usuário/public_html && php wp-cron.php >/dev/null 2>&1 - Teste a chamada loopback: abra o endereço seudominio.com/wp-cron.php?doing_wp_cron no navegador. Se a página carregar em branco e retornar 200, o loopback está livre; se travar ou der 403, há um bloqueio de firewall ou autenticação.
- Libere o loopback no firewall: se a chamada falhar, libere o IP do próprio servidor no firewall ou na regra de Cloudflare e remova qualquer autenticação HTTP básica que cubra o wp-cron.php.
// functions.php do tema filho — alerta se um evento do WP-Cron atrasa mais de 1 hora
add_action( 'admin_notices', function () {
if ( ! current_user_can( 'manage_options' ) ) {
return;
}
$proximo = wp_next_scheduled( 'wp_version_check' );
if ( $proximo && ( time() - $proximo ) > HOUR_IN_SECONDS ) {
$atraso = human_time_diff( $proximo, time() );
echo '<div class="notice notice-warning"><p>WP-Cron atrasado em ' . esc_html( $atraso ) . '. Verifique o cron do servidor.</p></div>';
}
} );














