В администрировании WordPress часто возникает необходимость запускать задачи по расписанию: обновлять данные, отправлять уведомления, очищать кэш или выполнять другие рутинные операции. Многие используют для этого плагины, но иногда хочется обойтись без них, чтобы не нагружать сайт дополнительным кодом и избежать потенциальных конфликтов. В этой статье мы подробно разберём, как настроить отложенный запуск задач в WordPress с помощью встроенного механизма WP-Cron и системных cron-задач без плагинов.
Что такое WP-Cron и почему его стоит дополнить системным cron
WP-Cron — это встроенный в WordPress механизм, который позволяет запускать задачи по расписанию. Однако он запускается только когда кто-то заходит на сайт, что делает его ненадёжным для важных задач, требующих точного времени выполнения.
Поэтому для стабильной работы отложенных задач рекомендуется настроить системный cron на сервере, который будет вызывать WP-Cron через команду HTTP или WP-CLI с фиксированным интервалом.
Преимущества такого подхода:
- Точные интервалы выполнения задач.
- Снижение нагрузки на посетителей сайта.
- Увеличение стабильности и предсказуемости работы автоматизации.
Как создать собственную отложенную задачу в WordPress
Для начала создадим функцию, которую будем запускать по расписанию. Например, функция очистки устаревших записей из пользовательской таблицы.
function wpnews_clear_old_records() {
global $wpdb;
$table = $wpdb->prefix . 'wpnews_custom_data';
$days = 30; // удалять данные старше 30 дней
$wpdb->query(
$wpdb->prepare("DELETE FROM $table WHERE created_at < NOW() - INTERVAL %d DAY", $days)
);
}
Зарегистрируем событие с помощью WP-Cron:
function wpnews_schedule_clear_old_records() {
if ( ! wp_next_scheduled( 'wpnews_clear_old_records_hook' ) ) {
wp_schedule_event( time(), 'daily', 'wpnews_clear_old_records_hook' );
}
}
add_action( 'wp', 'wpnews_schedule_clear_old_records' );
add_action( 'wpnews_clear_old_records_hook', 'wpnews_clear_old_records' );
Здесь мы запланировали ежедневное выполнение задачи. Хук wpnews_clear_old_records_hook будет вызывать функцию очистки.
Как отключить стандартный WP-Cron и настроить системный cron на сервере
Чтобы избежать запуска WP-Cron при каждом заходе посетителя, отключим его вызов через файл wp-config.php:
define('DISABLE_WP_CRON', true);
Теперь настроим системный cron, чтобы он вызывал WP-Cron в нужное время. Например, для ежедневного вызова:
- Откройте crontab командой
crontab -e. - Добавьте строку:
0 0 * * * wget -q -O - https://ваш-сайт.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&1
Или если у вас есть доступ к WP-CLI, можно использовать команду:
0 0 * * * /usr/bin/wp cron event run --due-now --url=ваш-сайт.ru >/dev/null 2>&1
Это гарантирует, что задачи WP-Cron будут запускаться четко по расписанию без зависимости от посещаемости сайта.
Как проверить и отладить отложенные задачи в WordPress
Для отладки можно использовать следующие методы:
- Просмотр запланированных задач через функцию
wp_get_scheduled_event()или плагины типа WP Crontrol. - Логирование запуска задач — внутри вашей функции добавить запись в файл или использовать error_log:
function wpnews_clear_old_records() {
// ...очистка данных...
error_log('WPNews: Очистка устаревших записей выполнена в ' . current_time('mysql'));
}
Это поможет подтвердить, что задача действительно запускается.
Дополнительные рекомендации и лучшие практики
При работе с отложенными задачами в WordPress важно учитывать несколько моментов:
- Избегайте длительных блокирующих операций в функциях cron, чтобы не создавать нагрузку.
- Используйте WP-CLI, если это возможно, для более надёжного управления задачами.
- При необходимости создавайте несколько задач с разным расписанием для разных видов операций.
- Обязательно тестируйте cron-задачи в тестовом окружении перед запуском на продакшене.
Пример расширения: создание пользовательского интервала для WP-Cron
По умолчанию WP-Cron поддерживает несколько интервалов (hourly, daily, twicedaily). Чтобы добавить свой, например, раз в 15 минут, используйте фильтр:
function wpnews_custom_cron_intervals( $schedules ) {
$schedules['fifteen_minutes'] = array(
'interval' => 900, // 15 * 60 секунд
'display' => __('Каждые 15 минут')
);
return $schedules;
}
add_filter( 'cron_schedules', 'wpnews_custom_cron_intervals' );
Теперь эту новую периодичность можно использовать при планировании событий:
wp_schedule_event( time(), 'fifteen_minutes', 'wpnews_clear_old_records_hook' );
Заключение
Правильная настройка отложенных задач в WordPress без плагинов позволяет повысить стабильность и производительность сайта, сделать управление задачами более прозрачным и гибким. Используя комбинацию системного cron и WP-Cron, вы получаете надёжный инструмент автоматизации. Кодовые примеры в статье помогут быстро внедрить задачи под любые нужды.
Для удобного управления и расширенных возможностей рекомендую обратить внимание на плагин Clearfy Pro, который среди прочего оптимизирует работу WP-Cron и помогает диагностировать задачи.