В WordPress для автоматического запуска задач по расписанию используется система WP-Cron. Однако WP-Cron работает при посещении сайта, что может приводить к задержкам и нестабильной работе планировщика, особенно на слабых хостингах и при низком трафике. В этой статье подробно рассмотрим, как правильно создавать расписание задач в WordPress, используя WP-Cron, а также как настроить реальный системный cron для более надежного выполнения задач.
Что такое WP-Cron и почему его стоит использовать с системным cron
WP-Cron — это имитация системного планировщика задач в WordPress. Он запускается при каждом посещении сайта и проверяет, не пора ли выполнить запланированную задачу. Это удобно, но имеет недостатки:
- Если на сайт долго не заходят — задачи задерживаются.
- При большом трафике WP-Cron может запускаться слишком часто.
- Невозможно гарантировать точное время запуска задачи.
Чтобы решить эти проблемы, рекомендуется отключить встроенный WP-Cron и настроить системный cron на сервере, который будет запускать WP-Cron по расписанию с точностью до минуты.
Как создать собственное расписание задач в WP-Cron
WordPress позволяет создавать собственные интервалы запуска задач. Для этого нужно добавить фильтр, который зарегистрирует новый интервал.
add_filter('wordpressy_custom_cron_schedules', function($schedules) {
$schedules['every_five_minutes'] = [
'interval' => 300, // 300 секунд = 5 минут
'display' => __('Каждые 5 минут')
];
return $schedules;
});
Далее регистрацию фильтра нужно подключить к стандартному фильтру cron_schedules. В нашем случае, чтобы избежать конфликтов, делаем так:
add_filter('cron_schedules', 'wordpressy_register_custom_cron_schedules');
function wordpressy_register_custom_cron_schedules($schedules) {
return apply_filters('wordpressy_custom_cron_schedules', $schedules);
}
Теперь у нас есть расписание с интервалом 5 минут.
Как добавить задачу для выполнения по расписанию в WordPressy
Чтобы создать задачу, которая будет выполняться, например, каждые 5 минут, используем функцию wp_schedule_event. Важно проверять, что задача не запланирована повторно, чтобы избежать дублирования.
function wordpressy_schedule_my_task() {
if (!wp_next_scheduled('wordpressy_my_custom_event')) {
wp_schedule_event(time(), 'every_five_minutes', 'wordpressy_my_custom_event');
}
}
add_action('wp', 'wordpressy_schedule_my_task');
Далее описываем функцию-обработчик задачи:
add_action('wordpressy_my_custom_event', 'wordpressy_do_my_task');
function wordpressy_do_my_task() {
// Здесь ваш код, который нужно выполнить по расписанию
error_log('Задача WordPressy выполнена в ' . current_time('mysql'));
}
Как отключить WP-Cron и настроить системный cron на сервере
Чтобы WP-Cron не запускался при каждом посещении сайта, в wp-config.php добавьте:
define('DISABLE_WP_CRON', true);
После этого нужно настроить системный cron, чтобы он запускал WP-Cron по расписанию. Для этого добавьте в crontab команду:
* * * * * wget -q -O - https://ваш-домен.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&1
Или, если хотите использовать PHP напрямую:
* * * * * /usr/bin/php /путь/до/wordpress/wp-cron.php > /dev/null 2>&1
Это гарантирует запуск WP-Cron каждую минуту, что гораздо надежнее и стабильнее, чем запуск от посещений.
Практическое применение: пример плагина для WordPressy с расписанием задач
Для наглядности создадим простой плагин, который будет запускать задачу очистки устаревших данных каждые 5 минут.
/**
* Plugin Name: WordPressy Scheduled Cleanup
* Description: Пример плагина с WP-Cron и собственным расписанием.
*/
add_filter('cron_schedules', 'wordpressy_register_custom_cron_schedules');
function wordpressy_register_custom_cron_schedules($schedules) {
$schedules['every_five_minutes'] = [
'interval' => 300,
'display' => __('Каждые 5 минут')
];
return $schedules;
}
add_action('wp', 'wordpressy_schedule_cleanup_task');
function wordpressy_schedule_cleanup_task() {
if (!wp_next_scheduled('wordpressy_cleanup_event')) {
wp_schedule_event(time(), 'every_five_minutes', 'wordpressy_cleanup_event');
}
}
add_action('wordpressy_cleanup_event', 'wordpressy_do_cleanup');
function wordpressy_do_cleanup() {
global $wpdb;
$table = $wpdb->prefix . 'wordpressy_cleanup_log';
// Пример: удаляем записи старше 30 дней
$wpdb->query($wpdb->prepare(
"DELETE FROM $table WHERE created_at < NOW() - INTERVAL 30 DAY"
));
error_log('WordPressy cleanup выполнен: ' . current_time('mysql'));
}
Этот пример показывает, как создать собственное расписание, зарегистрировать задачу и выполнять ее по расписанию.
Дополнительные советы по работе с WP-Cron в WordPressy
1. Всегда проверяйте, что задача не запланирована дважды, чтобы избежать дублирования.
2. Для отладки используйте плагины, например Clearfy Pro, который позволяет управлять WP-Cron и просматривать запланированные задачи.
3. Не помещайте тяжелые задачи в WP-Cron без ограничения, лучше разбивайте их на части или используйте очереди.
4. При использовании реального cron избегайте частого запуска с интервалом менее минуты, чтобы не нагружать сервер.
Заключение
WP-Cron — мощный инструмент для автоматизации задач в WordPress, но его особенности нужно учитывать при разработке. Использование системного cron позволяет сделать запуск задач более стабильным и предсказуемым. Создание собственных расписаний и обработчиков дает гибкость для решения любых задач автоматизации на вашем сайте WordPress.
Для удобного управления и расширенных возможностей рекомендую обратить внимание на Clearfy Pro — плагин, который помогает оптимизировать и управлять WP-Cron и другими процессами в WordPress.