Primeiramente, defina seus agendamentos de trabalho personalizados do cron.
add_filter('cron_schedules', array($this, 'cron_schedules'));
public function cron_schedules($schedules){
$prefix = 'cron_';// Avoid conflict with other crons. Example Reference: cron_30_mins
$schedule_options = array(
'30_mins' => array(
'display' => '30 Minutes',
'interval' => '1800'
),
'1_hours' => array(
'display' => 'Hour',
'interval' => '3600'
),
'2_hours' => array(
'display' => '2 Hours',
'interval' => '7200'
)
);
/* Add each custom schedule into the cron job system. */
foreach($schedule_options as $schedule_key => $schedule){
$schedules[$prefix.$schedule_key] = array(
'interval' => $schedule['interval'],
'display' => __('Every '.$schedule['display'])
);
}
return $schedules;
}
Você precisa decidir onde e quando realmente agendar o evento.
Aqui está apenas um trecho de código, que faz uma chamada para um método de classe personalizado:
$schedule = $this->schedule_task(array(
'timestamp' => current_time('timestamp'), // Determine when to schedule the task.
'recurrence' => 'cron_30_mins',// Pick one of the schedules set earlier.
'hook' => 'custom_imap_import'// Set the name of your cron task.
));
Aqui está o código que realmente agenda o evento:
private function schedule_task($task){
/* Must have task information. */
if(!$task){
return false;
}
/* Set list of required task keys. */
$required_keys = array(
'timestamp',
'recurrence',
'hook'
);
/* Verify the necessary task information exists. */
$missing_keys = array();
foreach($required_keys as $key){
if(!array_key_exists($key, $task)){
$missing_keys[] = $key;
}
}
/* Check for missing keys. */
if(!empty($missing_keys)){
return false;
}
/* Task must not already be scheduled. */
if(wp_next_scheduled($task['hook'])){
wp_clear_scheduled_hook($task['hook']);
}
/* Schedule the task to run. */
wp_schedule_event($task['timestamp'], $task['recurrence'], $task['hook']);
return true;
}
Agora, tudo o que você precisa fazer é fazer uma chamada para o nome de sua tarefa Cron personalizada. Neste exemplo, o nome da tarefa cron é custom_imap_import
.
add_action('custom_imap_import', array($this, 'do_imap_import'));
public function do_imap_import(){
// .... Do stuff when cron is fired ....
}
Portanto, neste exemplo, $this->do_imap_import();
é chamado a cada 30 minutos (supondo que você tenha tráfego suficiente no seu site).
Notas
Requer uma visita a uma página para que seu cron seja acionado nos horários corretos.
Exemplo: Se você agendou uma tarefa em intervalos de 30 minutos, mas ninguém visita seu site por 4 horas, seu trabalho no cron não será acionado até que o visitante acesse seu site quatro horas depois . Se você realmente precisa que sua tarefa seja disparada a cada 30 minutos, é aconselhável configurar um cron job legítimo através do seu provedor de hospedagem na web para visitar seu site nos intervalos desejados.
O cron do WordPress não faz seu site ficar lento!
Talvez você esteja pensando e se o script cron demorar muito para ser executado, os visitantes terão que esperar até que o script seja executado. Não! Como isso pode ser possível? Se você olhar para o arquivo wp-cron.php
, encontrará uma linha
ignore_user_abort(true);
É uma configuração de php.ini
que define que, se você parar de carregar o site / script, o script não parará de ser executado.
Se você olhar para o arquivo wp-includes/cron.php
, encontrará uma linha como esta:
wp_remote_post( $cron_url,
array('timeout' => 0.01,
'blocking' => false,
'sslverify' => apply_filters('https_local_ssl_verify', true)) );
Isso significa que o WordPress irá esperar apenas 0.01 segundos para acionar a execução e, em seguida, será cancelado, mas como você definiu ignore_user_abort
para true
, o script estará sendo executado. Essa funcionalidade é uma grande vantagem para executar scripts grandes em tarefas agendadas do WordPress.
Funções disponíveis para ajuda: