Como Configurar WordPress Cron Jobs: Guia Técnico

Como configurar WordPress Cron Jobs: entenda o WP-Cron, configure cron real no servidor, agende tarefas personalizadas e resolva problemas de eventos perdidos.

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

  1. Um visitante acessa qualquer página do site
  2. O WordPress verifica se há tarefas agendadas com horário no passado
  3. Se houver, dispara uma requisição HTTP assíncrona para wp-cron.php
  4. 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:

  1. Acesse o painel de controle da hospedagem
  2. Procure por "Cron Jobs" ou "Tarefas Agendadas"
  3. 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

  1. 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.
  2. Use WP-CLI para executar o cron sempre que possível. É mais eficiente que requisições HTTP.
  3. Monitore os eventos agendados regularmente com WP Crontrol. Plugins mal desenvolvidos podem registrar eventos duplicados ou com frequência excessiva.
  4. Limpe eventos órfãos de plugins desativados. Eles continuam no banco de dados consumindo recursos.
  5. 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.
  6. Use wp schedule single _ event() para tarefas únicas em vez de criar eventos recorrentes que se auto-desagendam após a primeira execução.
  7. 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.
  8. 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.


Leia Também

Artigos relacionados