O WordPress tem um sistema interno de agendamento de tarefas chamado WP-Cron. Ele é responsável por publicar posts agendados, verificar atualizações, enviar e-mails programados, limpar transients do banco de dados e executar rotinas de plugins como backups e verificações de segurança.
O problema é que o WP-Cron não é um cron de verdade. Ele tem limitações importantes que podem causar tarefas perdidas, posts que não publicam no horário certo e rotinas de backup que simplesmente não executam.
Neste guia técnico, vamos explicar como o WP-Cron funciona, quais são suas limitações, como substituí-lo por um cron real do servidor e como criar tarefas agendadas personalizadas.
O Que é o WP-Cron
O WP-Cron é o sistema de agendamento nativo do WordPress. Ele permite que o core, plugins e temas registrem tarefas para serem executadas em horários específicos ou em intervalos regulares.
Tarefas Padrão do WP-Cron
O WordPress registra várias tarefas por padrão:
- wp version check : verifica se há atualizações do WordPress
- wp update plugins : verifica atualizações de plugins
- wp update themes : verifica atualizações de temas
- wp scheduled delete : limpa itens na lixeira com mais de 30 dias
- wp scheduled auto draft delete : remove rascunhos automáticos antigos
- delete expired transients : limpa transients expirados do banco de dados
Plugins adicionam suas próprias tarefas:
- Backups agendados (UpdraftPlus, BackWPup)
- Verificações de segurança (Wordfence, Sucuri)
- Envio de newsletters (Mailchimp integration)
- Sincronização de estoque (WooCommerce)
- Limpeza de logs
Como o WP-Cron Funciona (e Por Que é Problemático)
Aqui está o ponto crucial: o WP-Cron não é um cron real. Ele é acionado por visitas ao site.
O Mecanismo
- Um visitante acessa qualquer página do site
- O WordPress verifica se há tarefas agendadas com horário no passado
- Se houver, dispara uma requisição HTTP assíncrona para wp-cron.php
- O wp-cron.php executa as tarefas pendentes
O Problema
Se ninguém visitar o site, as tarefas não executam. Simples assim.
Isso significa que:
- Posts agendados para as 6h da manhã podem não ser publicados se ninguém acessar o site até as 10h
- Backups programados para as 3h simplesmente não acontecem se o site não receber visitas de madrugada
- E-mails agendados podem atrasar horas ou até dias em sites com pouco tráfego
Outro Problema: Performance
Em sites com muito tráfego, o WP-Cron cria outro tipo de problema. A cada requisição, o WordPress verifica se há tarefas pendentes. Isso adiciona processamento extra a cada pageview. Em sites com milhares de acessos por hora, essa verificação constante desperdiça recursos do servidor.
Pior ainda: se várias requisições chegam ao mesmo tempo e identificam tarefas pendentes, podem tentar executar a mesma tarefa simultaneamente, causando duplicação ou conflitos.
Desabilitando o WP-Cron
O primeiro passo para resolver esses problemas é desabilitar o WP-Cron nativo e substituí-lo por um cron real do servidor.
Adicionar Constante no wp-config.php
Abra o arquivo wp-config.php e adicione a seguinte linha antes de "That's all, stop editing ! ":
define('DISABLE_WP_CRON', true);
Isso impede que o WordPress verifique tarefas agendadas a cada pageview. As tarefas continuam registradas, mas não são disparadas automaticamente.
Importante: Não Confunda com WP CRON LOCK _ TIMEOUT
A constante WP_CRON_LOCK_TIMEOUT define o tempo mínimo entre execuções do cron (em segundos), mas não desabilita o WP-Cron. Ela é útil para evitar execuções simultâneas, mas não resolve o problema fundamental.
// Isso NÃO desabilita o WP-Cron, apenas limita a frequência
define('WP_CRON_LOCK_TIMEOUT', 60);
Configurando um Cron Real no Servidor
Com o WP-Cron desabilitado, você precisa de algo para disparar as tarefas. A solução é usar o cron do sistema operacional (crontab no Linux).
Usando o Crontab
Acesse o servidor via SSH e edite o crontab:
crontab -e
Adicione a seguinte linha para executar o wp-cron.php a cada 5 minutos:
*/5 * * * * wget -q -O /dev/null https://seusite.com.br/wp-cron.php?doing_wp_cron >/dev/null 2>&1
Ou usando curl:
*/5 * * * * curl -s https://seusite.com.br/wp-cron.php?doing_wp_cron >/dev/null 2>&1
Usando WP-CLI (Recomendado)
Se o WP-CLI estiver instalado no servidor, use-o em vez de requisições HTTP. Isso é mais eficiente porque não passa pelo servidor web:
*/5 * * * * cd /caminho/para/wordpress && wp cron event run --due-now --quiet >/dev/null 2>&1
Vantagens do WP-CLI:
- Não depende do servidor web (funciona mesmo se o Nginx/Apache estiver fora)
- Não gera requisição HTTP (menos overhead)
- Não é afetado por autenticação HTTP ou restrições de IP
Frequência Recomendada
- A cada 1 minuto : para sites que precisam de precisão (posts agendados, e-commerce com pedidos)
- A cada 5 minutos : para a maioria dos sites (bom equilíbrio entre precisão e recursos)
- A cada 15 minutos : para sites simples com poucas tarefas agendadas
Em Painéis de Hospedagem
Se você não tem acesso SSH, muitos painéis de hospedagem (cPanel, Plesk, DirectAdmin) oferecem interface para configurar cron jobs:
- Acesse o painel de controle da hospedagem
- Procure por "Cron Jobs" ou "Tarefas Agendadas"
- Configure o comando e a frequência
Criando Tarefas Agendadas Personalizadas
Além de corrigir o WP-Cron, você pode criar suas próprias tarefas agendadas usando as funções nativas do WordPress.
wp schedule event() - Tarefas Recorrentes
Para agendar uma tarefa que se repete em intervalos regulares:
// Registra o hook
add_action('minha_tarefa_diaria', 'executar_minha_tarefa');
function executar_minha_tarefa() {
// Código que será executado diariamente
// Exemplo: limpar logs, enviar relatório, sincronizar dados
error_log('Tarefa diária executada em: ' . date('Y-m-d H:i:s'));
}
// Agenda o evento (executar apenas uma vez, geralmente na ativação do plugin)
if (!wp_next_scheduled('minha_tarefa_diaria')) {
wp_schedule_event(time(), 'daily', 'minha_tarefa_diaria');
}
Intervalos Padrão
O WordPress oferece três intervalos padrão:
- hourly : a cada hora
- twicedaily : duas vezes por dia (a cada 12 horas)
- daily : uma vez por dia (a cada 24 horas)
- weekly : uma vez por semana (adicionado no WordPress 5.4)
Criando Intervalos Personalizados
Se os intervalos padrão não atendem, crie os seus:
add_filter('cron_schedules', 'adicionar_intervalos_cron');
function adicionar_intervalos_cron($schedules) {
// A cada 5 minutos
$schedules['every_five_minutes'] = array(
'interval' => 300,
'display' => 'A cada 5 minutos'
);
// A cada 30 minutos
$schedules['every_thirty_minutes'] = array(
'interval' => 1800,
'display' => 'A cada 30 minutos'
);
// A cada 6 horas
$schedules['every_six_hours'] = array(
'interval' => 21600,
'display' => 'A cada 6 horas'
);
return $schedules;
}
wp schedule single _ event() - Tarefa Única
Para agendar uma tarefa que executa apenas uma vez em um horário específico:
// Agenda para daqui a 1 hora
wp_schedule_single_event(time() + 3600, 'minha_tarefa_unica');
add_action('minha_tarefa_unica', 'executar_tarefa_unica');
function executar_tarefa_unica() {
// Código executado uma única vez
// Exemplo: processar importação, gerar relatório
}
Removendo Tarefas Agendadas
Para remover uma tarefa agendada (geralmente na desativação de um plugin):
// Na desativação do plugin
register_deactivation_hook(__FILE__, 'desativar_meu_plugin');
function desativar_meu_plugin() {
$timestamp = wp_next_scheduled('minha_tarefa_diaria');
if ($timestamp) {
wp_unschedule_event($timestamp, 'minha_tarefa_diaria');
}
}
Visualizando e Gerenciando Eventos Agendados
Plugin WP Crontrol
O WP Crontrol é o melhor plugin para visualizar e gerenciar eventos do cron no WordPress. Ele mostra:
- Todos os eventos agendados com próxima execução
- O hook associado a cada evento
- O intervalo de recorrência
- A possibilidade de executar manualmente qualquer evento
- Adicionar, editar e remover eventos pelo painel
Instale o plugin e acesse Ferramentas > Cron Events para ver todos os eventos agendados.
O Que Procurar
Ao analisar os eventos agendados, observe:
- Eventos duplicados : o mesmo hook agendado várias vezes (indica bug em plugin)
- Eventos atrasados : horário de execução no passado (WP-Cron não está executando)
- Eventos de plugins desativados : tarefas órfãs que consomem recursos sem necessidade
- Frequência excessiva : tarefas rodando a cada minuto sem necessidade
Debugging de Eventos Perdidos
Quando tarefas agendadas não executam, siga este roteiro de diagnóstico:
1. Verifique se o DISABLE WP CRON está Ativo sem Cron Real
O erro mais comum: alguém adiciona DISABLE_WP_CRON ao wp-config.php mas esquece de configurar o cron real no servidor. Resultado: nenhuma tarefa executa.
2. Verifique o Cron Real
Se você configurou um cron real, confirme que está funcionando:
# Verifique o crontab crontab -l # Teste manualmente curl -s https://seusite.com.br/wp-cron.php?doing_wp_cron # Ou com WP-CLI wp cron event list wp cron event run --due-now
3. Verifique Bloqueios
Alguns servidores ou plugins de segurança bloqueiam requisições ao wp-cron.php . Verifique:
- Regras de firewall que bloqueiam o IP do próprio servidor
- Plugins de segurança que restringem acesso ao wp-cron.php
- Proteção por autenticação HTTP (.htpasswd) que impede o acesso
4. Verifique o Banco de Dados
Os eventos cron ficam armazenados na option cron no banco de dados. Use o WP-CLI para inspecionar:
wp cron event list --format=table
5. Logs de Execução
Adicione log temporário para verificar se as tarefas estão sendo chamadas:
add_action('minha_tarefa_diaria', function() {
error_log('[CRON] Tarefa diária executada: ' . date('Y-m-d H:i:s'));
});
Verifique o log de erros do PHP ( error_log ) para confirmar a execução.
WP-CLI e Cron
O WP-CLI oferece comandos específicos para gerenciar o cron:
Listar Eventos Agendados
wp cron event list
Saída:
+----------------------------+---------------------+-----------------------+------------+ | hook | next_run_gmt | next_run_relative | recurrence | +----------------------------+---------------------+-----------------------+------------+ | wp_version_check | 2026-04-09 15:00:00 | 2 hours 30 minutes | 12 hours | | wp_update_plugins | 2026-04-09 15:00:00 | 2 hours 30 minutes | 12 hours | | wp_scheduled_delete | 2026-04-09 18:00:00 | 5 hours 30 minutes | 1 day | +----------------------------+---------------------+-----------------------+------------+
Executar Eventos Pendentes
# Executa todos os eventos que já deveriam ter rodado wp cron event run --due-now # Executa um evento específico wp cron event run wp_version_check
Agendar Novo Evento
# Evento recorrente wp cron event schedule meu_evento hourly # Evento único wp cron event schedule meu_evento_unico now --raw
Deletar Evento
wp cron event delete meu_evento
Testar o Sistema de Cron
wp cron test
Esse comando verifica se o sistema de cron está funcional e reporta problemas.
Impacto na Performance
O WP-Cron tem impacto direto na performance do site:
Com WP-Cron Ativo (padrão)
- Cada pageview inclui uma verificação de tarefas pendentes
- Se houver tarefas pendentes, uma requisição HTTP adicional é disparada
- Em sites com muitos plugins, a lista de eventos pode ser grande, tornando a verificação lenta
- Múltiplas execuções simultâneas podem sobrecarregar o servidor
Com Cron Real do Servidor
- Zero impacto nas pageviews (a verificação não acontece durante requisições de visitantes)
- Execução previsível e pontual
- Sem requisições HTTP extras (especialmente se usar WP-CLI)
- Controle total sobre quando e com que frequência as tarefas executam
A diferença de performance pode ser significativa em sites com alto tráfego. Em nossos testes com sites WordPress sob gestão, a remoção do WP-Cron e configuração de cron real reduziu o tempo médio de resposta em 50 a 150 milissegundos por requisição.
Cron Jobs do WooCommerce
O WooCommerce registra vários eventos no cron que são essenciais para o funcionamento da loja:
- woocommerce scheduled sales : ativa e desativa preços promocionais
- woocommerce cancel unpaid _ orders : cancela pedidos não pagos após o tempo limite
- woocommerce cleanup sessions : limpa sessões expiradas
- woocommerce tracker send _ event : envia dados de uso (pode ser desabilitado)
- woocommerce cleanup personal _ data : limpa dados pessoais de pedidos antigos (LGPD)
Se esses eventos não executam corretamente:
- Promoções não iniciam ou não terminam no horário certo
- Pedidos pendentes acumulam indefinidamente
- Sessões no banco de dados crescem sem controle (performance)
- Dados pessoais não são limpos (conformidade com LGPD)
Para lojas WooCommerce, configurar um cron real com execução a cada 1 minuto é fortemente recomendado.
Boas Práticas
- Sempre desabilite o WP-Cron nativo e configure um cron real no servidor. Não existe motivo para manter o WP-Cron ativo em ambiente de produção.
- Use WP-CLI para executar o cron sempre que possível. É mais eficiente que requisições HTTP.
- Monitore os eventos agendados regularmente com WP Crontrol. Plugins mal desenvolvidos podem registrar eventos duplicados ou com frequência excessiva.
- Limpe eventos órfãos de plugins desativados. Eles continuam no banco de dados consumindo recursos.
- Não agende tarefas pesadas com frequência alta . Um relatório que leva 30 segundos para gerar não deve rodar a cada minuto.
- Use wp schedule single _ event() para tarefas únicas em vez de criar eventos recorrentes que se auto-desagendam após a primeira execução.
- Teste em staging antes de modificar a configuração de cron em produção. Uma configuração errada pode impedir a publicação de posts agendados ou a execução de backups.
- Documente suas tarefas personalizadas com comentários claros no código. Meses depois, você vai querer saber por que criou determinado evento.
Conclusão
O WP-Cron nativo do WordPress é uma solução simples para um problema complexo, e essa simplicidade vem com limitações sérias. Para qualquer site WordPress em produção, especialmente e-commerces e sites com tráfego variável, substituir o WP-Cron por um cron real do servidor é uma das otimizações mais impactantes que você pode fazer.
A configuração não é difícil, mas requer acesso ao servidor e conhecimento técnico. Se você não tem familiaridade com SSH, crontab e WP-CLI, a HOSTWP faz essa configuração como parte da gestão do site. Com 143 sites sob gestão, cada um com cron real configurado e monitorado, garantimos que suas tarefas agendadas executem no horário certo, sempre.
Fale com a HOSTWP no WhatsApp e tenha um time técnico cuidando da infraestrutura do seu WordPress.