As vezes, precisamos que alguma ação seja executada de tempos em tempos no WordPress. Pode ser uma função que busca conteúdo externo, ou uma rotina de manutenção qualquer.
A forma mais comum de fazer isso, é usando o serviço cron (em ambientes Unix), ou o agendador de tarefas (no Windows). Embora ambos funcionem bem, existe uma alternativa, que é usar o próprio WordPress para isso.
Para agendar uma tarefa, existe uma função chamada wp_schedule_event(). Uma chamada típica dessa função seria da seguinte forma:
<?php wp_schedule_event(time(), 'hourly', 'hook'); add_action('hook', 'funcao_agendada'); ?>
Isso agendaria a função “funcao_agendada()” para ser executada de hora em hora, na hora atual.
O primeiro parâmetro informa a hora de agendamento. Como passamos time(), que se traduz na hora atual, o WordPress usará esse valor como hora. O segundo parâmetro é a frequência, que pode ser hourly, daily ou twicedaily (respectivamente de hora em hora, diariamente, ou duas vezes por dia). E por último, o nome de uma “action”, que indicará a função a ser executada.
Para remover o agendamento, a chamada é feita a wp_clear_schedule_hook(), passando como parâmetro somente o nome do hook utilizado (no caso, “hook”).
Um detalhe é que essa função deve ser chamada uma única vez, por isso, pode ser conveniente colocá-la dentro de um plugin, e executar o agendamento na ativação, e remover o agendamento na desativação.
Uma outra forma de se agendar, sem usar plugins, é usar a função wp_next_scheduled() para checar se o evento já foi agendado, da seguinte forma:
<?php add_action('meu_evento', 'funcao'); function ativacao() { if (!wp_next_scheduled('meu_evento')) { wp_schedule_event(time(), 'hourly', 'meu_evento'); } } add_action('wp', 'ativacao'); function funcao() { // isso executará de hora em hora } ?>
Assim, caso o evento não esteja agendado, o WordPress se encarregará de agendá-lo.
A principal vantagem é que o agendamento fica independente de qualquer coisa externa. Tudo fica gerenciado pelo próprio WordPress, e numa eventual mudança de servidor, não haveria necessidade de se preocupar com as tarefas agendadas.
Como não temos um daemon pra verificar a hora, e chamar as tarefas, dependemos de um visitante (humano ou não) pra executar as tarefas. Em cada acesso ao site, o WordPress checa se existe alguma tarefa que já deveria ter sido executada. Caso exista, ele executa. Simples assim.
Um problema nisso é que não há garantia de que a tarefa será executada precisamente no horário agendado, mas sim, no primeiro acesso após esse horário (que pode ser segundos, num site muito visitado, ou minutos/horas em um site com quase nenhum acesso).Caso a rotina que se queira agendar seja sensível a hora, é melhor usar os métodos convencionais.
Usar a funcionalidade de agendamento do WordPress pode ser uma boa alternativa, principalmente quando não há preocupação com o “quando” a tarefa será executada, ou quando não se tem acesso aos sistemas de agendamento do servidor, o que pode ser comum em ambientes compartilhados.
Feed RSS para os comentários deste artigo.
June 26th, 2011 às 13:28
Parabéns Bruno! Perfeito o site!
Vou divulgar!
Beijos!