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

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
Ⅱ. Otimização de desempenho do WordPress
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.
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.

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>&1As 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>&1Com 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 --quietCom 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 --quietO 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 é:
- 08:00 → o cron do sistema chama o wp-cron.php
- A tarefa agendada A roda → trava de 5 minutos definida
- 08:01 → o cron do sistema chama de novo
- A tarefa A está travada → não roda
- 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.
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-nowExecuted 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 testError: 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 -lno crontab for exampleSe 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 testError: WP-Cron spawn returned HTTP status code: 403 ForbiddenCom 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.

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





ℹ️ 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.