WP-Cron no WooCommerce: como diagnosticar e corrigir tarefas agendadas
Sua loja WooCommerce está processando pedidos, mas ações agendadas ficam pendentes — cancelamentos de pedidos antigos não ocorrem, tarefas de integrações ficam acumuladas, e algo claramente não está funcionando nos bastidores. Não aparece nenhum erro no painel, mas o fluxo operacional trava.
O culpado mais comum por trás desses sintomas silenciosos é o WP-Cron — o mecanismo de agendamento de tarefas do WordPress. No WooCommerce, ele coordena operações que acontecem em segundo plano. Quando falha, a loja funciona pela metade sem que você perceba imediatamente.
Se você já enfrentou problemas de loja fora do ar ou conflitos entre plugins, sabe que alguns problemas não geram erros visíveis. O WP-Cron é outro caso assim — silencioso, mas com impacto real na operação.
Neste artigo, você vai entender como o WP-Cron funciona, quais tarefas ele executa no WooCommerce, como diagnosticar problemas e aplicar as correções corretas.
O que é WP-Cron e por que ele importa para lojas WooCommerce
WP-Cron é o sistema de agendamento de tarefas do WordPress. Ele permite que plugins e o core executem ações em horários específicos ou em intervalos regulares. Isso inclui enviar e-mails, verificar atualizações e publicar posts agendados.
No WooCommerce, o WP-Cron assume um papel crítico para tarefas agendadas. Ele é o mecanismo por trás de:
- Cancelamento de pedidos pendentes — pedidos não pagos são cancelados automaticamente após o tempo configurado em “Manter estoque (minutos)”
- E-mails adiados — quando o recurso de e-mails adiados está ativo, o WooCommerce enfileira o envio via Action Scheduler (que depende do WP-Cron como gatilho periódico)
- Action Scheduler — a fila de tarefas de alto volume do WooCommerce (webhooks, assinaturas, sincronização)
Importante: e-mails transacionais padrão, redução/devolução de estoque e validade de cupons não dependem do WP-Cron — esses processos são síncronos ou verificados no momento da aplicação. Veja a seção “O que o WP-Cron faz no WooCommerce” para detalhes.
Quando o WP-Cron falha, as tarefas agendadas podem atrasar ou parar — a menos que outro runner esteja configurado (cron real do servidor, WP-CLI, ou trigger assíncrono do Action Scheduler). A loja continua aceitando pedidos, mas cancelamentos, e-mails adiados e ações de integrações podem ficar sem execução no tempo esperado.
Como o WP-Cron funciona (e por que NÃO é um cron real)
Entender como o WP-Cron funciona é essencial para diagnosticar problemas no WooCommerce. O ponto fundamental é: WP-Cron não é um agendador de tarefas do sistema operacional. Ele é uma simulação em PHP que depende de visitas ao site para funcionar.
A diferença entre WP-Cron e cron real
| Característica | Cron do SO (Linux/Unix) | WP-Cron |
|---|---|---|
| Execução | Contínua, independente de tráfego | Só dispara quando alguém visita o site |
| Precisão | Minuto exato | Depende do próximo carregamento de página |
| Confiabilidade | Depende da configuração do servidor | Variável (depende de tráfego e configuração) |
| Acesso | Crontabs podem ser configurados por diferentes usuários; acesso depende da hospedagem | Funciona no WordPress |
O fluxo de execução
- Um visitante abre qualquer página do site
- WordPress verifica a option
cronna tabelawp_options(get_option('cron')) - Se houver tarefas atrasadas (com
timeno passado), dispara uma requisição HTTP assíncrona parawp-cron.php - No hook
shutdown(desde o WP 5.7),spawn_cron()dispara umwp_remote_post()não bloqueante parawp-cron.php - O
wp-cron.phpprocessa as tarefas devido em segundo plano - A resposta do visitante é retornada sem esperar o término do cron
Isso significa que, se ninguém visitar o site por horas, nenhuma tarefa agendada será executada durante esse período. Em lojas WooCommerce com tráfego baixo em horários específicos (madrugada, por exemplo), isso pode causar atrasos significativos.
Por que o WordPress não usa cron real
A razão é simples: muitas hospedagens compartilhadas não oferecem acesso ao cron do sistema. O WP-Cron foi criado como uma alternativa universal que funciona em qualquer ambiente — mas com limitações inerentes de precisão e confiabilidade.
O que o WP-Cron faz no WooCommerce
Entender o que realmente depende do WP-Cron ajuda a diagnosticar com precisão — e evita investigar o cron quando o defeito está em outro lugar.
E-mails transacionais
Por padrão, os e-mails de pedido — confirmação, atualização de status, reembolso — são enviados no mesmo request via wp_mail(), de forma síncrona. O WP-Cron não é responsável pelo envio padrão. Quando o recurso de e-mails adiados está ativo (ou quando o Action Scheduler enfileira envios), uma falha do WP-Cron pode atrasar esses e-mails — mas isso só se aplica ao modo adiado.
Se os e-mails não chegam, o problema mais comum é o gateway de pagamento, o servidor de e-mail (SMTP) ou a configuração de notificações — não o WP-Cron.
Controle de estoque
A redução de estoque ocorre de forma síncrona, hooks de pagamento e status do pedido: woocommerce_payment_complete, woocommerce_order_status_completed, woocommerce_order_status_processing e woocommerce_order_status_on-hold. Quando o pagamento é concluído, o WooCommerce reduz o estoque imediatamente — sem agendamento.
A reserva de estoque durante o checkout é controlada pela configuração “Manter estoque (minutos)” em WooCommerce → Configurações → Produtos → Estoque. Se o pedido não for pago nesse intervalo, o estoque é liberado automaticamente via Action Scheduler — um processo agendado que depende do WP-Cron como gatilho padrão (ou de um runner alternativo, quando configurado).
Se o estoque não atualiza, verifique se o gateway de pagamento está confirmando corretamente o status do pedido.
Validade de cupons
A verificação de validade de cupons — se expirou, se atingiu o limite de uso, se é válido para os produtos — é feita no momento da aplicação, pela classe WC_Discounts::validate_coupon_expiry_date(). O WP-Cron não desativa cupons. Um cupom expirado é rejeitado no checkout porque a data é verificada contra o timestamp atual.
Se cupons expirados estão sendo aceitos, o problema pode ser fuso horário, configuração do cupom ou conflito com outro plugin — não o WP-Cron.
Pedidos pendentes
Pedidos que ficam no status “pendente” por muito tempo são cancelados automaticamente. O padrão é 60 minutos, mas esse valor é configurável em WooCommerce → Configurações → Produtos → Estoque → “Manter estoque (minutos)”. O cancelamento é processado via Action Scheduler, com fallback para WP-Cron.
Impacto da falha do WP-Cron: pedidos antigos continuam aparecendo como pendentes, ocupando estoque reservado.
Action Scheduler no WP-Cron do WooCommerce
O Action Scheduler é a fila de tarefas de alto volume do WooCommerce. Ele gerencia webhooks, processamento de assinaturas, sincronização de estoque com marketplaces e muito mais.
O WP-Cron é o gatilho periódico padrão do Action Scheduler — o evento action_scheduler_run_queue é agendado a cada minuto via WP-Cron. Porém, o Action Scheduler também pode ser acionado por outras vias: requisições assíncronas no encerramento de requests administrativos (via hook shutdown) e por WP-CLI (wp action-scheduler run). Isso significa que, mesmo com WP-Cron desativado, o Action Scheduler pode ser executado por esses caminhos alternativos.
Impacto da falha do WP-Cron (sem alternativa configurada): fila de ações acumuladas, webhooks não processados, assinaturas com renovação atrasada.
Sinais de que o WP-Cron está falhando
O WP-Cron raramente gera erros visíveis. Os sintomas são sutis e podem ser confundidos com outros problemas.
Sinais observáveis
- Pedidos pendentes acumulados — pedidos antigos sem cancelamento automático
- Webhooks não disparados — integrações externas param de receber dados
- Assinaturas com renovação atrasada — cobranças não processadas no prazo
- Ações agendadas antigas — WooCommerce → Status → Ações agendadas com muitas ações “Pending”
- E-mails adiados atrasados — quando o recurso de e-mails adiados está ativo
Como investigar se o WP-Cron está falhando
A presença de ações antigas com status “Pending” ou “Past-due” é um indício, não uma confirmação definitiva. Outros fatores — como callbacks com erro ou timeout do servidor — também podem causar acumulação. Para avaliar com mais precisão:
- Acesse WooCommerce → Status → Ações agendadas
- Filtre por status “Pending” e examine se há ações com data de execução há horas ou dias
- Verifique também as abas Failed e In-progress — ações com falhas repetidas indicam problema nos callbacks, não necessariamente no WP-Cron
- Aguarde pelo menos um intervalo completo (se o cron do servidor roda a cada 5 minutos, observe por 10-15 minutos) para ver se as ações avançam
- Se tiver acesso SSH, execute
wp cron testpara verificar se o sistema de spawning está funcionando ewp cron event run --due-nowpara executar manualmente as tarefas devidas
Diagnóstico do WP-Cron no WooCommerce: como verificar o status
Antes de aplicar qualquer correção, confirme que o WP-Cron realmente está com problema.
Método 1: WP-CLI (mais confiável)
Se você tem acesso SSH ao servidor:
wp cron event list --format=table
Ou, para ver campos específicos:
wp cron event list --fields=hook,next_run_gmt,next_run_relative,schedule
Isso lista todas as tarefas agendadas. Muitas tarefas com next_run_gmt no passado são um indício de que o WP-Cron não está disparando corretamente — mas são evidências que precisam ser correlacionadas com wp cron test (que verifica o spawning, não os callbacks), logs e ações nos status Failed ou In-progress. Somente falha de spawning ou ausência do runner adequado sustenta melhor o diagnóstico.
Para verificar se o WP-Cron está desativado:
wp config get DISABLE_WP_CRON
Método 2: Plugin WP Crontrol
- Instale e ative o plugin WP Crontrol
- Acesse Ferramentas → Eventos do Cron
- Verifique a coluna “Próxima Execução” — tarefas atrasadas indicam problema
Método 3: Verificação manual via URL
Acesse diretamente no navegador:
https://seusite.com/wp-cron.php?doing_wp_cron
Se retornar uma página em branco com status 200, o wp-cron.php está acessível — isso é necessário mas não garante que o agendamento está correto. Erros (401, 403, 500) ou timeout indicam bloqueio. Para um diagnóstico mais completo, use WP Crontrol ou verifique via terminal:
curl -I https://seusite.com/wp-cron.php?doing_wp_cron
Método 4: Verificar logs
Se o WP_DEBUG_LOG estiver ativo, procure por erros relacionados a wp-cron ou spawn_cron:
grep -i "wp-cron\|spawn_cron" wp-content/debug.log
Nota: esse comando requer que WP_DEBUG_LOG esteja true no wp-config.php e que o caminho seja relativo ao diretório raiz do WordPress.
Causas comuns de falha do WP-Cron no WooCommerce
1. DISABLE_WP_CRON ativado sem alternativa
Muitas hospedagens adicionam define('DISABLE_WP_CRON', true); no wp-config.php para melhorar performance. O problema é que sem um runner alternativo (cron real do servidor, WP-CLI ou outro gatilho), as tarefas dependentes do gatilho baseado em visitas podem atrasar ou parar — enquanto o Action Scheduler e o WP-Cron permanecem registrados, mas sem execução automática.
2. Cache de página completo
Plugins de cache que servem páginas estáticas podem reduzir os gatilhos do WP-Cron por visita, já que o loopback direto para wp-cron.php geralmente bypassa o cache de página. Porém, o risco real ocorre quando wp-cron.php é bloqueado por um CDN, firewall ou configuração de cache que impede o loopback. Confirme que wp-cron.php está excluído do cache e acessível.
Para verificar se o cache está interferindo, teste o endpoint diretamente e examine os logs do servidor:
curl -I https://seusite.com/wp-cron.php?doing_wp_cron
Se retornar 200, o endpoint está acessível. Se retornar erro ou timeout, revise as configurações de cache, CDN e firewall.
3. Tráfego baixo em horários específicos
Lojas com pouco tráfego durante a madrugada acumulam tarefas atrasadas. Quando alguém finalmente visita o site, o WP-Cron tenta processar tudo de uma vez. Isso pode causar timeout.
4. Conflitos com plugins
Alguns plugins podem interferir no WP-Cron, seja registrando tarefas em loop infinito ou bloqueando a execução de wp-cron.php.
5. Servidor com limitação de execução
Hospedagens compartilhadas podem limitar o tempo de execução PHP. Se as tarefas do WP-Cron demoram mais que o limite, elas são cortadas antes de concluídas.
Como corrigir: DISABLE_WP_CRON e cron real do servidor
A solução mais confiável é desativar o WP-Cron do WordPress e substituí-lo por um cron real do servidor. Mas a ordem dos passos importa: primeiro configure e teste o acionador do servidor; só então desative o WP-Cron. Isso evita criar uma janela sem nenhum gatilho ativo.
Passo 1: Configure um cron real no servidor
Opção A: WP-CLI via SSH (recomendada)
crontab -e
Adicione:
*/5 * * * * cd /caminho/do/seu/site && wp cron event run --due-now --quiet >> $HOME/logs/wp-cron.log 2>&1
Nota: crie o diretório logs no seu home (mkdir -p $HOME/logs) antes de usar. Se o WP-CLI estiver em um caminho específico, adicione --path=/caminho/para/o/site ao comando.
Essa configuração executa todas as tarefas devidas a cada 5 minutos, independentemente de visitas ao site.
Opção B: Curl (quando WP-CLI não está disponível)
*/5 * * * * curl -s https://seusite.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1
Opção C: Painel da hospedagem gerenciada
Alguns hosts gerenciados oferecem recurso próprio para substituir o WP-Cron — mas cada provedor funciona de forma diferente. Verifique a documentação do seu provedor para habilitar o recurso específico:
- WP Engine: oferece o “Alternate Cron”, que precisa ser habilitado manualmente no User Portal (Utilities → Alternate Cron). Não é ativado automaticamente ao definir
DISABLE_WP_CRON. - Kinsta: permite adicionar crontabs ao container via SSH. O intervalo mínimo aceito é de 5 minutos. Não há configuração automática — o cron real precisa ser adicionado pelo usuário ou pelo suporte.
- Cloudways: a configuração varia conforme o plano e a stack. Consulte a documentação ou o suporte para confirmar como habilitar crontabs.
Passo 2: Desative o WP-Cron no WordPress
Só após confirmar que o cron do servidor está funcionando, adicione no wp-config.php, acima da linha /* That's all, stop editing! */:
define('DISABLE_WP_CRON', true);
Isso impede que o WP-Cron dispare a cada carregamento de página. Não remove as tarefas agendadas — apenas para o gatilho automático.
Passo 3: Verifique se está funcionando
Após desativar o WP-Cron, aguarde o intervalo do cron do servidor e verifique:
- WooCommerce → Status → Ações agendadas — ações antigas devem mudar para “Complete”
- WP Crontrol — timestamps de “Próxima Execução” devem avançar
- Logs — confirme que o cron está sendo acionado
Definir o intervalo do cron
O intervalo ideal depende dos requisitos das tarefas e extensões da sua loja, dos limites do seu host e da documentação do provedor. Não existe regra universal — considere:
- O Action Scheduler agenda seu runner a cada minuto por padrão, mas isso não significa que seu cron do servidor precise rodar a cada minuto
- Hosts como Kinsta impõem intervalo mínimo de 5 minutos
- Tarefas com janela curta de execução (cancelamento de pedidos pendentes após
hold_stock_minutes, expiração de sessões, renovação de assinaturas) podem exigir intervalos menores — consulte se o provedor permite
Em caso de dúvida, 5 minutos é um ponto de partida razoável; ajuste conforme o comportamento observado nas ações agendadas.
Como corrigir: sobrecarga de tarefas
Se o WP-Cron está funcionando, mas as tarefas acumulam, o problema pode ser volume ou lentidão de processamento.
Limpeza de tarefas antigas
Antes de excluir qualquer tarefa, identifique o plugin proprietário e a causa da acumulação. Excluir sem diagnóstico pode apagar agendamentos funcionais que voltarão a falhar.
Recomendações:
- Não exclua tarefas apenas por idade. Uma ação antiga pode fazer parte de uma recorrência necessária — excluir com
wp cron event delete <hook> --allremove todas as ocorrências futuras, não apenas a pendente. - Faça backup e teste em staging antes de qualquer limpeza em loja ativa.
- WP Crontrol — acesse Ferramentas → Eventos do Cron, identifique o plugin que registrou o evento e analise se é seguro remover. Exclua apenas eventos órfãos (de plugins desativados ou removidos).
- WP-CLI — para excluir um evento específico (não todos):
wp cron event delete <nome-do-hook> --due-now
Separar WP-Cron de Action Scheduler: tarefas da fila do Action Scheduler (visíveis em WooCommerce → Status → Ações agendadas) devem ser gerenciadas por lá — use a coluna “Actions” paraCancelar ou Retry individualmente, ou wp action-scheduler clean via WP-CLI para limpar por status e retenção.
Aumentar o limite de processamento do Action Scheduler
Se o Action Scheduler está acumulando ações, aumentar o tamanho do batch pode ajudar — mas só deve ser feito após avaliar os callbacks, os recursos do servidor e testar em staging. Aumentar o batch sem essas verificações pode sobrecarregar o servidor.
add_filter('action_scheduler_queue_runner_batch_size', function($size) {
return 50; // padrão é 25
});
Antes de aplicar:
- Verifique se os callbacks das ações são rápidos e não fazem chamadas externas pesadas
- Teste em staging e monitore o tempo de execução e o uso de CPU/memória
- Considere usar WP-CLI (
wp action-scheduler run --batch-size=100) para filas grandes — é mais eficiente e não depende de HTTP
Para filas muito grandes, o WP-CLI é preferível ao aumento do batch size via filtro, pois não enfrenta limites de timeout de requests HTTP.
Verificar tarefas em loop
Alguns plugins podem agendar a mesma tarefa múltiplas vezes. No WP Crontrol, verifique se há eventos duplicados com o mesmo hook.
Como corrigir: conflitos com plugins
Identifique o plugin problemático
- Faça backup completo e, se possível, teste em staging antes de qualquer alteração na loja ativa
- Se for na loja ativa, escolha uma janela de baixo movimento e ative o modo de manutenção ou pause as vendas quando aplicável
- Registre quais plugins estão ativos e em que ordem
- Desative todos os plugins exceto WooCommerce
- Verifique se o WP-Cron funciona
- Reative os plugins um por um, testando após cada ativação
- Quando o problema retornar, você encontrou o plugin conflitante
- Restaure a configuração original imediatamente após o diagnóstico
Para um guia completo sobre isolamento de conflitos, veja o artigo Plugin do WooCommerce parou de funcionar? Como identificar conflitos entre plugins.
Verifique tarefas registradas
No WP Crontrol, analise os eventos do cron. Procure por:
- Tarefas com intervalos muito curtos (segundos)
- Muitas tarefas do mesmo hook
- Tarefas que falham repetidamente
Soluções comuns
- Atualize o plugin — conflitos antigamente corrigidos podem estar resolvidos
- Reporte ao desenvolvedor — se o plugin registra tarefas incorretamente
- Substitua o plugin — se não há solução e o conflito persiste
Prevenção: monitore o WP-Cron regularmente
Manter o WP-Cron funcionando faz parte da rotina de manutenção de qualquer loja WooCommerce. Uma verificação mensal pode evitar problemas silenciosos.
Rotina de verificação
Configure uma verificação mensal:
- WooCommerce → Status → Ações agendadas — verifique ações pendentes antigas
- WP Crontrol — confirme que os timestamps avançam normalmente
- Logs — procure erros relacionados a cron
Ferramentas de monitoramento
- WP Crontrol — visualização e gerenciamento de tarefas
- WooCommerce Status — painel de ações agendadas
- Query Monitor — depuração de performance e hooks
Backup da configuração
Mantenha registro da configuração de cron do servidor. Se o problema retornar, você saberá exatamente o que verificar.
Perguntas frequentes
O WP-Cron é obrigatório para o WooCommerce?
O WooCommerce depende do WP-Cron (ou de uma alternativa como cron do servidor) para processar tarefas agendadas: cancelamento de pedidos pendentes, ações do Action Scheduler e e-mails adiados quando habilitados. E-mails transacionais padrão, redução de estoque e validade de cupons são processos síncronos ou verificados no momento da aplicação — não dependem do WP-Cron. Sem um mecanismo de agendamento funcionando, as tarefas agendadas param, mas o checkout e a operação básica continuam.
Definir DISABLE_WP_CRON como true quebra algo?
Desativar o WP-Cron sem configurar um cron real do servidor pode fazer com que as tarefas dependentes do gatilho nativo atrasem ou parem — especialmente em lojas com tráfego baixo em horários específicos. Nunca faça isso sem antes ter o cron do servidor configurado e funcionando.
Qual a diferença entre WP-Cron e Action Scheduler?
WP-Cron é o agendador nativo do WordPress, que dispara tarefas com base em visitas ao site. Action Scheduler é uma fila de tarefas de alto volume criada pelo WooCommerce que usa o WP-Cron como gatilho periódico padrão (evento action_scheduler_run_queue). Porém, o Action Scheduler também pode ser acionado por requisições assíncronas no encerramento de requests administrativos e por WP-CLI — não depende exclusivamente do WP-Cron.
Meu hosting gerenciado já cuida disso?
Alguns hosts gerenciados oferecem recursos próprios para substituir o WP-Cron, mas cada provedor funciona de forma diferente — muitos não habilitam automaticamente. Verifique a documentação do seu provedor ou entre em contato com o suporte para confirmar se há um cron real configurado e como habilitá-lo.
Como sei se o Action Scheduler está funcionando?
Acesse WooCommerce → Status → Ações agendadas. Ações antigas com status “Complete” e intervalos regulares de execução são um bom indício de funcionamento. Muitas ações “Pending” com dias de atraso, ou ações nos status Failed/In-progress, indicam problema — pode ser no WP-Cron, no runner alternativo ou nos callbacks das próprias ações.
Posso usar um serviço externo de cron?
Sim. Serviços como cron-job.org ou EasyCron podem acionar wp-cron.php em intervalos regulares. É uma alternativa válida quando não há acesso SSH ao servidor.
Conclusão
O WP-Cron é uma peça silenciosa da infraestrutura do WooCommerce. Quando funciona, ninguém percebe. Quando para, tarefas agendadas importantes podem ser afetadas sem gerar erros visíveis — cancelamentos de pedidos pendentes, ações de integrações e e-mails adiados podem atrasar ou parar, a menos que um runner alternativo esteja configurado.
Diagnosticar problemas no WP-Cron requer entender o que realmente depende dele (e o que não depende), identificar os sinais sutis de falha e configurar uma alternativa confiável — geralmente um cron real do servidor.
Se sua loja apresenta pedidos pendentes acumulados, webhooks parados ou ações agendadas travadas, o wp-cron woocommerce provavelmente é a causa. A correção é direta, mas exige atenção à configuração — primeiro o acionador do servidor, depois a desativação do WP-Cron.
Se você precisa de ajuda para diagnosticar ou corrigir problemas no WP-Cron da sua loja, a Panacea oferece análise inicial gratuita para identificar o ponto de atenção. Solicitar análise inicial da minha loja
Artigos relacionados
Rotina de manutenção WooCommerce: checklist mensal para evitar problemas
Monte uma rotina de manutenção WooCommerce com checklist mensal. Veja o que conferir, com que frequência e quando chamar um especialista para manter sua loja funcionando.
Como atualizar WordPress e WooCommerce sem quebrar sua loja
Atualizar WordPress e WooCommerce não precisa ser arriscado. Siga o procedimento completo de backup, staging e teste para atualizar sem perder vendas.
Loja WooCommerce fora do ar? Erro 500 e tela branca: como diagnosticar
Sua loja WooCommerce caiu com erro 500 ou tela branca? Aprenda a diagnosticar a causa na ordem certa — mesmo sem acesso ao painel — e coloque a loja no ar.