Ви можете створити новий час розкладу за допомогою cron_schedules:
function my_cron_schedules($schedules){
if(!isset($schedules["5min"])){
$schedules["5min"] = array(
'interval' => 5*60,
'display' => __('Once every 5 minutes'));
}
if(!isset($schedules["30min"])){
$schedules["30min"] = array(
'interval' => 30*60,
'display' => __('Once every 30 minutes'));
}
return $schedules;
}
add_filter('cron_schedules','my_cron_schedules');
Тепер ви можете запланувати свою функцію:
wp_schedule_event(time(), '5min', 'my_schedule_hook', $args);
Щоб запланувати його лише один раз, загорніть його у функцію та перевірте перед її запуском:
$args = array(false);
function schedule_my_cron(){
wp_schedule_event(time(), '5min', 'my_schedule_hook', $args);
}
if(!wp_next_scheduled('my_schedule_hook',$args)){
add_action('init', 'schedule_my_cron');
}
Зверніть увагу на параметр $ args! Якщо не вказати параметр $ args у wp_next_scheduled, але мати $ args для wp_schedule_event, це призведе до планування майже нескінченного числа тієї ж події (замість лише однієї).
Нарешті, створіть фактичну функцію, яку ви хочете запустити:
function my_schedule_hook(){
// codes go here
}
Я думаю, що важливо зазначити, що wp-cron перевіряє графік та виконує належні заплановані завдання щоразу при завантаженні сторінки.
Отже, якщо у вас веб-сайт із низьким трафіком, який має лише 1 відвідувача на годину, wp-cron запуститься лише тоді, коли цей відвідувач перегляне ваш сайт (раз на годину). Якщо на вашому сайті з високим трафіком відвідувачі запрошують сторінку щосекунди, wp-cron буде запускатися щосекунди, викликаючи додаткове навантаження на сервер.
Рішення полягає в тому, щоб дезактивувати wp-cron і запустити його через справжнє завдання cron у часовий інтервал, коли ви найшвидше повторюєте заплановану роботу wp-cron (у вашому випадку 5 хв).
Лукас Рольф пояснює проблему та детально дає рішення.
Як альтернатива, ви можете використовувати безкоштовну сторонній сервіс, як UptimeRobot, щоб запитувати ваш сайт (і запускати wp-cron) кожні 5 хвилин, якщо ви не хочете деактивувати wp-cron і запустити його через справжнє завдання cron.