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.
Antes de começar: Antes de editar o wp-config.php, faça backup do arquivo. Definir DISABLE_WP_CRON como true sem criar o cron real do servidor deixa todas as tarefas agendadas paradas, inclusive backups e atualizações de segurança.
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.
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>';
}
} );
Perguntas frequentes
Por que o WP-Cron não dispara sozinho?
Porque ele não é um cron de verdade do sistema. O WordPress só verifica tarefas pendentes quando alguém carrega uma página. Em sites com pouco tráfego, sem visitas frequentes, as tarefas atrasam ou nunca rodam até a próxima visita acontecer.
Qual a diferença entre WP-Cron e um cron real do servidor?
O WP-Cron depende de tráfego para disparar; o cron real do servidor roda em intervalos fixos definidos pelo sistema operacional, independente de visitas. O ideal é desativar o WP-Cron e chamar o wp-cron.php por um cron real a cada poucos minutos.
Como saber se meu WP-Cron está travado?
Use o plugin WP Crontrol ou o comando wp cron event list do WP-CLI. Se vários eventos aparecerem com horário no passado acumulado, o agendador parou de disparar. A tela de Saúde do site também avisa quando o WP-Cron falha.
Posts agendados pararam de publicar. É problema de cron?
Quase sempre sim. A publicação agendada depende do WP-Cron. Quando ele não dispara, o post fica com status de agendamento perdido. Configurar um cron real do servidor faz os posts voltarem a publicar no horário marcado.
Desativar o WP-Cron deixa o site mais rápido?
Pode aliviar um pouco, porque cada visita deixa de checar tarefas pendentes. O ganho real, porém, é de confiabilidade: as tarefas passam a rodar em horário fixo. Lembre que desativar sem configurar o cron real para todas as tarefas é arriscado.
O que é a requisição loopback do WP-Cron?
É o WordPress chamando o próprio endereço wp-cron.php por HTTP para executar as tarefas. Se firewall, Cloudflare ou autenticação básica bloquearem essa chamada, o cron falha mesmo com tráfego. Teste abrindo a URL do wp-cron.php direto no navegador.














