WP-Cron (wp-cron.php): desativar e configurar o cron do sistema | Otimização de desempenho do WordPress

Aviso de afiliados v3.1
Aviso de afiliados v3.2 (somente celular)

No WordPress, os cron jobs são um recurso que executa automaticamente tarefas agendadas para um horário ou data específicos. Eles rodam pelo arquivo wp-cron.php, e o WordPress chama esse arquivo a cada carregamento de página para processar as tarefas agendadas. Esse método é simples, mas em sites com muito tráfego pode prejudicar o desempenho.

Ⅰ. Como o WP-Cron roda e seus problemas de desempenho

Em vez do sistema cron tradicional dos servidores Linux, o WordPress oferece um recurso de cron próprio, WP-Cron. O WP-Cron funciona pelo arquivo wp-cron.php: ⓐ a cada visita de um usuário ao site, verifica se há tarefas agendadas e as executa, e ⓑ plugins como Rank Math e WP Rocket executam suas próprias tarefas periódicas agendadas.

Por outro lado, em sites com muito tráfego, o wp-cron.php pode ser chamado com frequência excessiva, sobrecarregando o servidor. Principalmente quando muitos usuários se conectam ao mesmo tempo, rodam cron jobs duplicados, o que pode levar a maior uso de CPU, respostas mais lentas, carregamento de página mais lento e problemas parecidos.

Esses limites estruturais do WP-Cron podem reduzir o desempenho do WordPress, e principalmente em sites que precisam de alto desempenho, lojas virtuais e portais de notícias podem causar gargalos graves.

🔄 Como o WP-Cron funciona e é estruturado

WP-Cron
WP-Cron(wp-cron.php)
ⓐ Verifica tarefas agendadas a cada visita
ⓑ Tarefas recorrentes dos plugins(Rank Math, WP Rocket e outros)
Problemas de desempenho do WP-Cron
Dependência do tráfego
Sobrecarga do servidor por chamadas excessivas
Execuções duplicadas e gargalos
Como o WP-Cron roda
Agendador virtual baseado em tráfego
Como as tarefas agendadas são executadas
Roda nas visitas, não por horário

Ⅱ. Otimização de desempenho do WordPress

  • ↳ Otimizando com as configurações do WP-Cron

Há muitas formas de otimizar o desempenho do WordPress. Depois de otimizar cache, front-end e banco de dados, dá para melhorar ainda mais pelas configurações do WP-Cron.

WordPress
Otimização de desempenho
Cache do navegador
Cache de página
Plugins de cache(WP Rocket, W3 Total Cache e outros)
Otimização do front-end
Plugins relacionados(Autoptimize, ShortPixel etc.)
Limpeza do Banco de Dados
Remover revisões, spam e tabelas temporárias
Plugins de otimização do banco de dados(WP-Optimize e outros)
Configurações do WP-Cron
WP-Cron(wp-cron.php)
ⓐ Verifica tarefas agendadas a cada visita
ⓑ Tarefas recorrentes dos plugins(Rank Math, WP Rocket etc.)
Problemas de desempenho do WP-Cron
Dependência do tráfego
Sobrecarga do servidor por chamadas excessivas
Execuções duplicadas e gargalos
Como o WP-Cron roda
Agendador virtual baseado em tráfego
Como as tarefas agendadas são executadas
Roda nas visitas, não por horário

A cada carregamento de página do WordPress os eventos agendados são verificados, e por causa das tarefas periódicas dos plugins é preciso usar o ineficiente WP-Cron de forma mais eficiente.

1️⃣ Testar o WP-Cron

Conferindo os cron jobs com o WP-CLI, você vê os eventos de cron ativos rodando. Dá para ver plugins como Rank Math e WP Rocket executando tarefas agendadas diariamente ou a cada poucos minutos.

WP CLI- conferir eventos de cron agendados com o comando wp-cron event list_

2️⃣ Como configurar o WP-Cron

O WP-Cron é um agendador virtual que cuida das tarefas agendadas do WordPress; o wp-cron.php roda quando os usuários visitam o site. Mas a execução baseada em tráfego não é confiável e chamadas excessivas podem sobrecarregar o servidor, por isso costuma ser complementado por um cron do sistema.
Se necessário, o recomendado é definir DISABLE_WP_CRON no wp-config.php para desligar o WP-Cron e executá-lo regularmente com um cron do Linux.

Item

Desativar o WP-Cron + rodar só o cron do sistema

Configurações

Desligar o WP-Cron e executar o wp-cron.php pelo cron do sistema

Prós

Sem execuções duplicadas, execução precisa por horário e pouca carga no servidor

Contras

Alguns recursos de plugins podem parar, e um erro de configuração pode fazer tarefas serem perdidas

Recomendado · Situação

Indicado para sites com muito tráfego e muitas tarefas agendadas

Mas o método ① tem uma desvantagem: desativa o recurso de preload de plugins de cache como o WP Rocket, que a cada minuto monta o cache antes de os visitantes chegarem.

⚙️ Editar o arquivo wp-config.php

Você pode configurar desativando o WP_CRON.

# Desativar o WP_CRON
define( 'DISABLE_WP_CRON', true );

Enquanto o WP-Cron está rodando, o WP_CRON_LOCK_TIMEOUT funciona como uma [trava baseada em tempo] que bloqueia outras tentativas de execução.

# 5 minutos = 300, a cada 60 minutos = 3600
define('WP_CRON_LOCK_TIMEOUT', 300);

Por esses motivos, em vez de só desativar o WP-Cron no arquivo wp-config.php, recomendo desativá-lo e depois adicionar uma tarefa de System Cron , e o servidor que administro hoje também está configurado assim.

⚙️ Ativar o cron do sistema num servidor Linux [básico]

Você pode ativá-lo por domínio.

# Executar a cada 5 minutos
*/5 * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1
# Executar a cada 30 minutos
*/30 * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1
# Executar a cada hora
0 * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1
# Executar uma vez por dia
0 3 * * * curl -s https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1

As quatro linhas acima são exemplos por intervalo que você adiciona ao crontab; a cada horário definido, o curl chama a URL [wp-cron.php], então as tarefas agendadas rodam mesmo sem visitantes.

# Se o servidor for local
*/5 * * * * php /path/to/wordpress/wp-cron.php > /dev/null 2>&1

# Executar a cada 30 minutos
*/30 * * * * php /path/to/wordpress/wp-cron.php > /dev/null 2>&1

# Executar a cada hora
0 * * * * php /path/to/wordpress/wp-cron.php > /dev/null 2>&1

# Executar uma vez por dia
0 3 * * * php /path/to/wordpress/wp-cron.php > /dev/null 2>&1

Com o WP-CLI instalado, você pode definir uma única linha para o intervalo que quiser. ▼

# Executar a cada 5 minutos
*/5 * * * * cd /sites/example.com/files/ && flock -n ~/.wp_cron.lock /usr/local/bin/wp cron event run --due-now --quiet

# Executar a cada 30 minutos
*/30 * * * * cd /sites/example.com/files/ && flock -n ~/.wp_cron.lock /usr/local/bin/wp cron event run --due-now --quiet

# Executar a cada hora
0 * * * * cd /sites/example.com/files/ && flock -n ~/.wp_cron.lock /usr/local/bin/wp cron event run --due-now --quiet

# Executar uma vez por dia
0 3 * * * cd /sites/example.com/files/ && flock -n ~/.wp_cron.lock /usr/local/bin/wp cron event run --due-now --quiet

Com essa configuração, o WP-CLI roda dentro do servidor só as tarefas agendadas que estão vencidas, com a opção [--due-now], e o [flock -n] pula uma nova execução se a anterior ainda não terminou.

⚙️ WP-CLI e cron do sistema de 1 minuto, além de evitar cron jobs duplicados

Por padrão, o WP_CRON simplesmente ignora (pula) tarefas quando há muito trabalho e as roda depois. Desligue o WP-Cron padrão e configure as tarefas agendadas para manter uma trava de 5 minutos, o que impede o cron do sistema e o WP-Cron de rodarem ao mesmo tempo.

define('DISABLE_WP_CRON', true);         // desliga a execução automática do WP-Cron
define('WP_CRON_LOCK_TIMEOUT', 300);     // sem espera → pulado; mantém trava de 5 minutos enquanto uma tarefa agendada roda

/* That's all, stop editing! Happy publishing. */

Adicione a opção flock -n ao cron do sistema para que, no lado do cron do sistema, uma execução que encontre a trava termine na hora.

# configuração do wp cron: flock -n → sem espera → sai na hora
*/1 * * * * cd /sites/example.com/files/ && flock -n ~/.wp_cron.lock /usr/local/bin/wp cron event run --due-now --quiet

O resultado dessa combinação de configurações é:

  • A execução automática interna do WordPress fica desligada → as tarefas agendadas rodam independentemente do número de visitantes
  • O cron do sistema tenta rodar a cada minuto → as tarefas agendadas rodam se houver
  • Com a trava, nada roda de novo por 5 minutos → evita execuções duplicadas (na prática, com o flock -n, o WP_CRON_LOCK_TIMEOUT nem é necessário.)

Com a prevenção de execução duplicada, o fluxo real é:

  1. 08:00 → o cron do sistema chama o wp-cron.php
    • A tarefa agendada A roda → trava de 5 minutos definida
  2. 08:01 → o cron do sistema chama de novo
    • A tarefa A está travada → não roda
  3. 08:02–08:04 → igual
    • 08:05 → trava liberada → a próxima tarefa agendada roda, se houver

Em vez de o WordPress rodar as tarefas sozinho, o sistema assume a execução. E o WP_CRON_LOCK_TIMEOUT funciona como proteção extra contra execuções duplicadas.

Item

WP_CRON_LOCK_TIMEOUT

flock -n

Tipo de trava

Dentro do WordPress

Nível do sistema

Local da trava

Baseada no banco: doing_cron em wp_options

Baseada em arquivo do sistema: ~/.wp_cron.lock

Espera?

❌ Não espera → pula

❌ Não espera → sai na hora

Prevenção de execução duplicada

✅ Evita execuções duplicadas

✅ Evita execuções duplicadas

Ao terminar, você pode conferir com um comando do WP-CLI se o cron continua funcionando como antes.

wp cron event list
+-------------------------------------------+---------------------+-----------------------+---------------+
| hook                                      | next_run_gmt        | next_run_relative     | recurrence    |
+-------------------------------------------+---------------------+-----------------------+---------------+
| rocket_saas_pending_jobs                  | 2026-10-17 12:00:57 | now                   | 1 minute      |
| action_scheduler_run_queue                | 2026-10-17 12:00:57 | now                   | 1 minute      |
| action_scheduler_run_queue_rucss          | 2026-10-17 12:00:58 | now                   | 1 minute      |
| rocket_saas_on_submit_jobs                | 2026-10-17 12:00:58 | now                   | 1 minute      |
| rocket_preload_process_pending            | 2026-10-17 12:00:59 | now                   | 1 minute      |
| rocket_purge_time_event                   | 2026-10-17 12:16:59 | 15 minutes 8 seconds  | 1 hour        |
| wp_privacy_delete_old_export_files        | 2026-10-17 12:28:46 | 26 minutes 55 seconds | 1 hour        |
| wp_update_user_counts                     | 2026-10-17 20:15:52 | 8 hours 14 minutes    | 12 hours      |
| rocket_preload_revert_old_failed_rows     | 2026-10-17 20:17:59 | 8 hours 16 minutes    | 12 hours      |
| wp_version_check                          | 2026-10-17 20:28:34 | 8 hours 26 minutes    | 12 hours      |
| wp_update_plugins                         | 2026-10-17 20:58:34 | 8 hours 56 minutes    | 12 hours      |
| wp_update_themes                          | 2026-10-17 21:28:34 | 9 hours 26 minutes    | 12 hours      |
| recovery_mode_clean_expired_keys          | 2026-10-18 07:28:46 | 19 hours 26 minutes   | 1 day         |
| wp_privacy_personal_data_cleanup_requests | 2026-10-18 07:28:46 | 19 hours 26 minutes   | 1 day         |
| wp_scheduled_delete                       | 2026-10-18 08:15:52 | 20 hours 14 minutes   | 1 day         |
| delete_expired_transients                 | 2026-10-18 08:15:52 | 20 hours 14 minutes   | 1 day         |
| wp_scheduled_auto_draft_delete            | 2026-10-18 08:15:54 | 20 hours 14 minutes   | 1 day         |
| wp_delete_temp_updater_backups            | 2026-10-18 08:16:17 | 20 hours 14 minutes   | 1 week        |
| rocket_update_dynamic_lists               | 2026-10-18 08:16:57 | 20 hours 15 minutes   | 1 week        |
| rocket_saas_clean_rows_time_event         | 2026-10-18 08:16:57 | 20 hours 15 minutes   | 1 week        |
| rocket_performance_hints_cleanup          | 2026-10-18 08:16:58 | 20 hours 15 minutes   | 1 day         |
| rocket_preload_clean_rows_time_event      | 2026-10-18 08:26:57 | 20 hours 25 minutes   | 1 week        |
| rocket_database_optimization_time_event   | 2026-10-18 09:34:25 | 21 hours 32 minutes   | 1 day         |
| wp_site_health_scheduled_check            | 2026-10-19 07:28:46 | 1 day 19 hours        | 1 week        |
| rocket_remove_saas_failed_jobs            | 2026-10-19 08:16:58 | 1 day 20 hours        | 3 days        |
+-------------------------------------------+---------------------+-----------------------+---------------+

A saída mostra os nomes dos hooks registrados, o próximo horário de execução e a recorrência, e as tarefas cuja coluna [next_run_relative] diz [now] são processadas logo na próxima execução do cron.

Ⅲ. Quando as tarefas agendadas do WP-Cron não rodam

É fácil achar que uma tarefa roda sozinha quando chega o horário, mas o WP-Cron verifica o que fazer quando chega uma requisição de página, não num horário fixo. Uma tarefa agendada para as 14h roda na primeira requisição das 17h, se não chegar nenhuma antes.

Quando as execuções atrasam, os posts agendados aparecem como [Agendamento perdido] na lista de posts. Em [Melhorias recomendadas], na aba Status de [Ferramentas › Saúde do site], aparece [Um evento agendado falhou]. Tarefas registradas por plugins, como o pré-carregamento do cache, ficam esperando pelo mesmo motivo.

As tarefas agendadas rodam no [wp-cron.php] depois de passar por uma requisição de página, uma verificação do que fazer e uma requisição de loopback; se um desses elos quebrar, não rodam nem depois do horário.

🧭 Até uma tarefa agendada rodar
Diagrama explicativo
🔍 Situação
🌐
Requisição de página
Uma visita que faz o WordPress rodar
✕ Não roda
→
🔎
Verificação do que fazer
Se há alguma tarefa atrasada
✕ Não verifica
→
🔁
Requisição de loopback
Servidor → o próprio [wp-cron.php]
✕ 403
→
⚙️
Executar a tarefa
[wp-cron.php] processa as tarefas agendadas
✓ Roda
Quando chega uma requisição que faz o WordPress rodar, ele verifica as tarefas atrasadas, e o servidor chama o [wp-cron.php] no próprio endereço para processá-las.
Se não há visitas, ou a resposta vem de um arquivo de cache de página, o WordPress não roda, e as tarefas atrasadas esperam a próxima requisição.
Se [DISABLE_WP_CRON] for true, nada verifica o que fazer mesmo com requisições chegando, e sem cron do sistema não sobra nada para executar as tarefas.
Se uma regra de segurança bloqueia o [wp-cron.php], a requisição de loopback volta com 403 e as tarefas não rodam.

1️⃣ Quando não há visitas ou o cache de página responde

O WP-Cron só verifica o que fazer em requisições que fazem o WordPress rodar, então nas horas sem visitas as tarefas atrasadas simplesmente se acumulam. Mesmo com visitas, o resultado é o mesmo se um arquivo de cache de página responde, porque o WordPress não roda.

Num WordPress com o cache de página do WP Rocket ligado, abrir a home em cache não registrou chamada ao [wp-cron.php]. Abrir uma URL sem cache registrou uma chamada no mesmo segundo, e as cinco tarefas atrasadas rodaram.

Você pode conferir as tarefas atrasadas filtrando a lista do WP-CLI pelas linhas em que [next_run_relative] é [now].

wp cron event list --next_run_relative=now --fields=hook,next_run_gmt,next_run_relative
+----------------------------------+---------------------+-------------------+
| hook                             | next_run_gmt        | next_run_relative |
+----------------------------------+---------------------+-------------------+
| rocket_saas_pending_jobs         | 2026-10-17 14:49:57 | now               |
| action_scheduler_run_queue       | 2026-10-17 14:49:57 | now               |
| action_scheduler_run_queue_rucss | 2026-10-17 14:49:58 | now               |
| rocket_saas_on_submit_jobs       | 2026-10-17 14:49:58 | now               |
| rocket_preload_process_pending   | 2026-10-17 14:49:59 | now               |
+----------------------------------+---------------------+-------------------+

[now] quer dizer que o horário previsto já passou. Esse comando de lista também carrega o WordPress, então, se houver tarefas atrasadas, ele chama o [wp-cron.php] assim que termina. Rodando o mesmo comando de novo logo em seguida, as tarefas que você acabou de ver somem da lista.

Para resolver as tarefas atrasadas antes de corrigir a causa, rode na hora com o WP-CLI só as tarefas vencidas.

wp cron event run --due-now
Executed the cron event 'rocket_saas_pending_jobs' in 0.005s.
Executed the cron event 'action_scheduler_run_queue' in 0.006s.
Executed the cron event 'action_scheduler_run_queue_rucss' in 0.006s.
Executed the cron event 'rocket_saas_on_submit_jobs' in 0.005s.
Executed the cron event 'rocket_preload_process_pending' in 0.007s.
Success: Executed a total of 5 cron events.

Esse comando roda as tarefas dentro do servidor sem requisição HTTP; para processá-las em intervalos fixos, independentemente de visitas, registre o mesmo comando no cron do sistema.

2️⃣ Quando só o DISABLE_WP_CRON está ligado e não há cron do sistema

Com o [DISABLE_WP_CRON] em true, o WP-Cron não verifica o que fazer mesmo com requisições de página chegando. A documentação oficial também orienta registrar primeiro no agendador do sistema e só depois adicionar a constante; adicionar só a constante, sem registro, deixa sem nada para executar as tarefas agendadas.

Com a constante ativa, um post agendado para pouco mais de um minuto depois continuou como [Agendado] após o horário, e a coluna de data da lista de posts mostrou [Agendamento perdido]. Nesse tempo não foi registrada nenhuma chamada ao [wp-cron.php].

Você confere se a constante está ligada com [wp cron test].

wp cron test
Error: The DISABLE_WP_CRON constant is set to true. WP-Cron spawning is disabled.

Se aparecer esse erro, verifique se o cron do sistema tem uma linha que chama o [wp-cron.php] ou roda [wp cron event run]. Se o crontab da conta do site estiver vazio, aparece o seguinte.

crontab -l
no crontab for example

Se não houver essa linha, registre um cron do sistema; se o seu ambiente não permitir, apague a linha [DISABLE_WP_CRON] e volte a usar o WP-Cron.

3️⃣ Quando a requisição de loopback do servidor está bloqueada

Quando há trabalho, o WP-Cron faz o servidor enviar uma requisição ao [wp-cron.php] no próprio endereço do site para executar as tarefas; essa é a requisição de loopback. Se uma regra de segurança bloqueia o [wp-cron.php], o loopback volta com 403 e as tarefas não rodam.

Num servidor com Nginx e Apache, restringir o [wp-cron.php] para abrir só a partir de 127.0.0.1 bloqueou o loopback com 403. Isso porque a requisição que o servidor manda ao próprio domínio entra pelo IP público, e o [wp cron test] devolve o mesmo código de status.

wp cron test
Error: WP-Cron spawn returned HTTP status code: 403 Forbidden

Com as tarefas mais de cinco minutos atrasadas, abrir a tela [Saúde do site] mostrou juntos, em [Melhorias recomendadas], um aviso de loopback e um evento agendado com falha.

Aba Status da Saúde do site mostrando um evento agendado com falha e um aviso de requisição de loopback depois que o loopback do WP-Cron foi bloqueado com 403

Com a regra removida, o [wp cron test] voltou a passar. Se precisar manter a regra, rode as tarefas com o WP-CLI pelo cron do sistema. A execução pelo WP-CLI não passa por requisição HTTP, então as tarefas atrasadas foram processadas mesmo com a regra.

🔢 FAQ & conteúdo recomendado

As verificações de atualização [wp_version_check], [wp_update_plugins] e [wp_update_themes] rodavam a cada 12 horas no site de teste. Esvaziar a lixeira ([wp_scheduled_delete]) e apagar transients expirados estavam agendados diariamente, e a verificação de Saúde do site semanalmente. Esvaziar a lixeira exclui de vez posts e comentários que estão lá há mais de 30 dias (padrão), e se o WP-Cron não roda, essas tarefas também não rodam no horário previsto.

É o hook com que o Action Scheduler, uma biblioteca de fila de tarefas que vem com plugins, processa as tarefas pendentes; no site de teste estava agendado a cada minuto. O FAQ oficial do Action Scheduler diz que a fila inicia por padrão pelo WP-Cron e no fim das requisições do painel (hook [shutdown]). No site de teste com só [DISABLE_WP_CRON] ligado e sem cron do sistema, essa linha também ficou em [now] junto com o post agendado.

Segundo a documentação oficial, há uma alternativa: definir a constante [ALTERNATE_WP_CRON] como true no [wp-config.php]. Quando há tarefas, ele redireciona a requisição GET do visitante para a mesma URL com um valor [doing_wp_cron] acrescentado. O [wp-cron.php] então roda dentro da requisição original, sem passar por loopback. A mesma documentação avisa que esse não é o comportamento padrão do WordPress e tem riscos, então, se puder registrar um cron do sistema, use-o primeiro.

🧭 Conteúdo recomendado: tarefas agendadas do WordPress 6 posts · 4 referências
🗂️ Tarefas agendadas do WordPress
📄 WP-Cron(wp-cron.php) 📄 Configurações básicas do wp-config.php ⏳ Saúde do site no WP
📋 Configuração do crontab 📄 Comando nice do Linux
📋 WP CLI: instalação e configuração 📄 Encontrar padrões sincronizados: WP-CLI
📡 About Cron 📡 Eventos do WP Cron 📡 Entendendo o agendamento do cron 📡 Ligar o WP-Cron ao agendador de tarefas do sistema
Nenhum resultado encontrado.

ℹ️ Aviso de afiliados
O conteúdo deste site contém links de afiliados. Quando um visitante compra um produto ou serviço por meio de um desses links, o site recebe uma comissão do vendedor. O valor que o comprador paga (em promoções, ele diminui ↓) não aumenta por causa disso. Preços, descontos e informações de estoque valem para o momento em que o texto foi escrito e podem ter mudado, por isso confirme com o vendedor antes de comprar. Os produtos são escolhidos e avaliados por critérios próprios, e o recebimento de comissão não influencia a ordem de apresentação nem o conteúdo das avaliações.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Demonstre sua humanidade: 4   +   2   =