Mudando um pouco o foco deste blog, a partir de hoje publicarei, esporadicamente, algumas dicas e notícias relevantes para os usuários e desenvolvedores de WordPress interessados em conhecer um pouco mais sobre este excelente CMS.
Para começo de conversa, vamos falar um pouco sobre o cron, um excelente porém pouco conhecido recurso do WordPress.
O que é o WordPress cron?
O WordPress cron é o sistema de eventos agendados – também conhecidos como scheduled events – do WordPress. Mas o que é um evento agendado?
Um evento agendado é uma ação programada para ser executada automaticamente pelo WordPress em um determinado dia e/ou horário.
Essa ação pode ser:
- a publicação de um post
- o envio de um ou vários e-mails
- a exclusão de transients expirados da wp_options
- dentre outras
Quem é usuário de sistemas Linux/UNIX possivelmente já ouviu falar do Crontab. O WordPress cron tem um conceito bem similar a ele.
Como o WordPress cron funciona?
Antes de explicar como o WordPress cron funciona, vale lembrar que ele já vem habilitado por padrão em qualquer instalação WordPress.
O WordPress verifica se algo precisa ser executado no cron a cada requisição nele feita. Assim, se houver algum scheduled event para ser executado, uma requisição HTTP chamará o wp-cron.php, que por sua vez irá executar os eventos agendados pendentes.
Muitos plugins utilizam os eventos agendados para executar determinadas ações. Por exemplo, um dos scheduled events presentes no W3 Total Cache é configurado para dar um flush automaticamente no Database Caching — falaremos mais sobre o W3 Total Cache em um futuro post.
Devo confiar cegamente no WordPress cron?
Depende. Por padrão, os scheduled events do WordPress são executados via wp-cron.php, que por sua vez é chamado por uma requisição HTTP. Ou seja, se você tem um evento agendado para executar diariamente às 10h, ele será executado efetivamente no primeiro acesso a sua página feito nesse horário ou após ele.
Entretanto, qualquer problema que acontecer durante uma das requisições HTTP poderá resultar em um ou mais scheduled events não sendo executados completamente. É muito comum ver usuários perdendo seus eventos agendados via WordPress cron.
Outro problema comum do WordPress cron: se um site WordPress tem muitos acessos simultâneos, e um determinado evento estiver agendado para ser executado a cada acesso, o servidor poderá ser sobrecarregado devido ao grande número de requisições HTTP chamando o wp-cron.php.
Também existe um outro método para executar eventos agendados no WordPress, chamado Alternative Cron. Assim, ao invés do WordPress executar os scheduled events ao mesmo tempo em que a página está sendo carregada, o usuário será redirecionado para wp-cron.php quando acessar qualquer post e, depois que os eventos terminarem de ser executados, ele será redirecionado de volta para post que acessou. Particularmente considero este método ridículo.
Em resumo, ambos métodos não são totalmente confiáveis.
Felizmente, existe uma alternativa confiável para que os scheduled events do WordPress sejam executados adequadamente: uma tarefa no Crontab.
Qual é a melhor forma de executar os scheduled events no meu site?
Antes de mais nada, para determinar qual a melhor forma para executar os scheduled events do WordPress, responda duas perguntas: os eventos agendados são primordiais para seu site? Quantas vezes o wp-cron.php é executado diariamente em seu site?
Se a resposta da primeira pergunta for sim, você pode ignorar a segunda pergunta e seguir os passos para implementação da tarefa no Crontab.
Se você não sabe responder a segunda pergunta, você pode executar o comando abaixo para verificar o número de chamadas ao wp-cron.php:
$ [ -d /var/log/nginx ] && servidor="nginx" || servidor="apache2"; grep "wp-cron.php" /var/log/$servidor/*access.log | wc -l
Se o número de chamadas ao wp-cron.php for maior do que 144, você deve implementar a tarefa no Crontab.
No entanto, se os eventos agendados não são primordiais e o número de chamadas ao wp-cron.php é menor ou igual 144, o comportamento padrão do WordPress cron atenderá suas demandas perfeitamente. Portanto, a implementação da tarefa no Crontab não é necessária.
Se você não se sente confortável com a linha de comando, em algumas empresas especializadas em hospedagem gerenciada WordPress, como a Synthesis, basta enviar um ticket solicitando e a tarefa no Crontab será implementada por um dos especialistas da empresa.
Implementando a tarefa para executar os scheduled events via Crontab
Primeiramente, antes de adicionar a tarefa para ser executada no Crontab, devemos desativar o cron padrão do WordPress. Para fazer isso, adicione a seguinte linha ao seu wp-config.php:
/** Desabilita o WordPress cron. */ define('DISABLE_WP_CRON', 'true');
Feito isso, podemos partir para implementação da tarefa no Crontab. Para isso, execute o seguinte comando substituindo dominio.com pelo domínio do seu site:
# echo "*/10 * * * * www-data wget -o /dev/null -O /dev/null http://dominio.com/wp-cron.php" > /etc/cron.d/wordpress
Pronto, agora os scheduled events do WordPress serão executados automaticamente pelo Crontab a cada dez minutos.
Após dez minutos, use este comando para verificar se o Crontab está executando a tarefa adequadamente:
# grep "wp-cron" /var/log/syslog
Jan 23 00:14:01 CRON[32401]: (www-data) CMD (wget -o /dev/null -O /dev/null https://tiagohillebrandt.eti.br/wp-cron.php)
Se a saída for parecida com a mensagem acima, a tarefa está sendo executada corretamente pelo Crontab. You da man!
Feedback
Dediquei algumas horas para entender como o WordPress cron funciona e então escrever este post. Assim, ficaria grato se pudesse contar com seu feedback. O que achou do texto? Na sua opinião, existe algo que deveria ser acrescentado? Deixe seu comentário!
Além disso, sugestões sobre tópicos para abordar em novos posts também são bem vindas.
Até a próxima galera!
Confira algumas dicas de segurança para sua instalação WordPress!
Enoque says
Ótima Dica! Parabéns e Obrigado por compartilhar.
Agora, uma dúvida: eu não tenho acesso SSH ao site que gerencio, apenas via FTP, então é possível executar o comando que verifica o número de chamadas ao wp-cron.php passando o domínio do site? ou via FTP, logado no terminal?
Tiago Hillebrandt says
Olá Enoque,
Obrigado pelo comentário 🙂
Se você não tem acesso SSH ao servidor, minha sugestão seria entrar em contato com o suporte técnico da sua hospedagem pedindo para executarem o comando e então lhe enviarem a saída.
Outra possibilidade seria pedir uma cópia do access.log do seu site e então executar o comando em sua própria máquina:
grep “wp-cron.php” nome_do_arquivo | wc -l
Abraços
Lucas Santana says
Cara, você salvou minha vida, estava precisando disso, muito obrigado!
Leonardo says
Trabalhei muito com WordPress a alguns anos. Ta Show o post! O que acha de um post sobre Ruby on Rails?
Tiago Hillebrandt says
Fala Leonardo,
Agradeço pelo comentário 😀
Infelizmente não tenho muito experiência com Ruby on Rails. Conheço a linguagem, mas não trabalho com ela frequentemente.
Se tiver alguma sugestão relacionada a WordPress ou PHP em geral, sinta-se a vontade para mandá-la 🙂
Abraços!
Kake says
Obrigado pelo artigo. Se você não tem o privilégio de configuração do trabalho cron, um terceiro webcron Easycron.com pode ser uma boa opção para você.
Tiago Hillebrandt says
Valeu Kake, muito boa dica para quem não tem permissão para adicionar tarefas ao Crontab no servidor 🙂
Fernando says
Tiago, boa noite!
Tive problemas sucessivos de travamentos em meu servidor e imagino que o problema seja o wp-cron que está rodando dezenas de vezes seguidas. Vou fazer um teste tentando colocar na cron do servidor e se der certo vai ser um alívio!
Abraços e obrigado
Tiago Hillebrandt says
Olá Fernando,
Sim, trabalho em uma estrutura com mais de 12 mil instalações WordPress e devo dizer que este problema é bastante frequente. Espero que habilitar o cron job tenha resolvido seu problema 🙂
Um abraço!
Leandro dos Santos says
Boa parte das pessoas usa cPanel, que tal dar o caminho das pedras via cPanel ao invés de via terminal? De resto, parabéns pela dica… abraço 😉
Tiago Hillebrandt says
Olá Leandro,
Infelizmente não sou grande fã da ferramenta cPanel. Mas caso tenha interesse em escrever ficarei feliz em ajudar, seja divulgando ou esclarecendo alguma dúvida 🙂
Abraços
Leandro dos Santos says
Via SSH como root, o comando “[ -d /var/log/nginx ] && servidor=”nginx” || servidor=”apache2″; grep “wp-cron.php” /var/log/$servidor/*access.log | wc -l” retornou “grep: /var/log/nginx/*access.log: No such file or directory 0”. E aí, o que fazer?
Leo says
Olá.
Mt útil a dica.
Me diga, em um site WP de notícias, qtas vezes vc acha o ideal para o cron ser executado?
Estou usando a cada 12h nos de notícias, com mts atualizações e visitas; e a cada 8h nos sites institucionais..
Pergunto pq andei tendo problema de sobrecarga da CPU no servidor (Hostgator) e o procedimento recomendado é a desabilitação do wp-cron.php como vc mencionou e, no meu caso, configurar as tarefas cron via CPanel.
Vlw!
Tiago Hillebrandt says
Olá Leo,
Você tem noção de quantas vezes por dia o wp-cron.php está sendo executado hoje no seu site? Se você usar aquela “fórmula” que expliquei no post ela deve atender sua demanda 🙂
Um abraço!
Alan says
Tiago tenho um site em wordpress gostaria de saber se consigo usar essa ferramenta para ele postar automaticamente no instagram por exemplo, é possível?
Rafael says
Vlw, consegui tirar minhas dúvidas. Tu acha que vale a pena implementar um código que cria crontab por algum plugin sem precisar acessar via ssh ou cpanel utilizando o exec do php?
Romario Huebra says
Muito bom o post, me ajudou aqui com meu trabalho.
Leonardo Crispim says
Muito bom, me ajudou bastante mas cheguei aqui com a intenção de aprender como se faz o cron do lado do WP. Senti falta desse conteúdo ou de um link para onde se aprende a fazer.
Marcos Nakamine says
Muito bom!
Obrigado
Aqui Receitas says
Estava tentando resolver esse problema por quase uma semana.
Obrigado pelo artigo, ajudou a resolver o meu problema.
danillo leite says
bacana fiz isso… ficou legal.
mas obvio que tem um porém… o backupbuddy começo a não realizar mais o backup… ele tá um erro de cron loopback
sabe o q pode ser e como resolver???
desde já obrigado
Adriano says
Olá, bom post!!
Tenho uma dúvida, quando o usuário acessa a página o wp-cron é executado, certo?! A página não terminará de carregar até todas as tarefas serem executadas?? E caso o usuário feche o navegador as tarefas serão interrompidas??
Obrigado.
Rafael says
Muito bom, me ajudou. Estou fazendo uns testes aqui e espero que dê certo. O cron rolava solto no meu site.
Felipe says
Oi Tiago,
excelente post. Agora te pergunto se é possível executar esse arquivo por PHP Cli e travar o acesso do mesmo no Apache. Mantenho um site que a pouco sofreu um ataque de XMLRPC e tive a ideia de travar esse script também via Apache pra evitar que alguém tente sobrecarregar o wp-cron para tirar meu site do ar.
Abraço,
Felipe
Andre Mesquita says
Felipe, dá uma olhada no Wordfence que ajuda a prevenir um bocado de tentativas. Mesmo no plano básico a ferramenta é muito boa e bem customizável.
Marco Santos says
Desculpe a ignorancia mas, quando vc diz “você pode executar o comando abaixo para verificar o número de chamadas ao wp-cron.php”, executar isso onde?
Obrigado… rs
Compra Perfeita says
Seu artigo me ajudou bastante.
Estava tentando aprender a mexer com isso para configurar corretamente o Mautic.
Filipe Vieira Marcolino says
Belo post! Deu pra ter um geral das possibilidades.
Seria possível criar um sistema de alertas usando wp_cron?
Por onde devo começar?
Rodrigo Vieira Eufrasio da Silva says
Parabéns Tiago pelo seu Post.
Mais eu tenho uma dúvida, agora em Outubro estamos na campanha do Outubro Rosa, eu fiz um Tema filho nas cores rosas para campanha, como eu faço para que quando for dia 01/11/2016 às 00:00 ele faça a troca do tema filho para o troca do tema pai.
Pode me ajudar nisso?
Andre Mesquita says
Show de bola! Ótima dica!
Só pra constar, onde deveria ser no máximo 144 era 3626 e consumia 31,7% do processamento. Se tiver o artigo do WP Total Cache a mão, vai ajudar ainda mais. rs!
Muito obrigado por partilhar conosco sua pesquisa.
Henrique Félix says
Ótimo post Tiago, valeu por compartilhar seu conhecimento. Forte abraço!
hercules souza says
Olá Tiago :-). Belo artigo. WordPress cron é muito importante. Man… Eu tenho um VPS com nginx + ubuntu16-64 + php7-fpm
e tenho 9 dominios/vhosts que possuem um pluin que usa cron,
inexplicavelmente, esse plugin, o tempo recresivo de 60 min com segundos exibidos, para disparar uma ação, não corre em um dominio, sempre esse dominio, ano passasdo ele ficou parado por 6 meses, eu removi o plugin, limpei cache, reiniciei o niginx, php7-0-fpm, mysql, fiz o diacho, mas esse plugin sempre trava e só com esse dominio! cara que macumba é essa man? ele trvou agora dia 2 de fev 2017, nunca mais, já fiz de tudo, reinicio até o coitado do vps, e nada. Ele é own hosted, sou eu e o terminal, não há suporte nessas hospedagens, uso webmin tambem as vezes.
Obrigado pelo artigo.
David - Cupomterra says
Muito bom, me ajudou. Estou fazendo uns testes aqui e espero que dê certo. O cron rolava solto no meu site…..
Alexandre says
Para mim foi o melhor tutorial do assunto. Obrigado mesmo! Vou passar a te seguir
Helleine says
Olá, Tiago, ótimo post. Estou tendo um problema muito chato de posts sendo publicados antes da hora (já verifiquei o fuso e está tudo certo), já notei diferença de 30 minutos a 3 horas antes, é devido a esse fato que isso está ocorrendo? Se sim, seguindo esses passos o problema deve cessar?
Att!
Tiago Hillebrandt says
Olá Helleine!
Pode ser relacionado ao WP Cron sim. Outra possibilidade é que a hora do servidor ou a hora do seu site WordPress estão em um fuso horário diferente do que deveria.
Quaisquer dúvidas estou a disposição!
Abraços
Jonas says
Cara, maravilha de post me ajudou bastante! Obrigado!
Edinaldo H Vieira says
Eu gostei do artigo. Pra mim, foi bastante esclarecedor. So pra constar, eu cheguei aqui via pesquisa no google.
Léo Muniz says
Excelente post, Tiago.
Você foi o primeiro resultado do Google para mim no serp de “wp cron”. E, pelos comentários, já ajudou muita gente! Muito legal. Parabéns 🙂
ps.: nunca utilizei o wp cron, somente crontab mesmo (em diversos projetos php). Realmente não faz muito sentido uma tarefa “agendada” que depende de uma interação no site para ser executada.
grande abraço.
Edinaldo H Vieira says
Muito bom.
Estou construindo um site que tem a função de ficar recolhendo as noticias de outros sites regionais. Essa dica vai ajudar a startar o wordpress para disparar o recolhimento de novos feed proveniente de outros sites. A ideia é também disparar um e-mail para mim informando quais as novas postagens, mas para isso eu teria de ficar acessando o site recolhedor. Sua dica resolve isso.
obrigado.
Luis Felipe says
Muito obrigado pela dica!! eu tenho uma loja virtual e quando segui esses passos eu consegui minimizar bastante o uso da CPU da minha hospedagem…
Daniel says
Tiago,
Tenho um site de desenvolvimento em um subdomínio e os Cron Jobs não estão rodando… Sabe o que pode ser isto?
Daniel