WordPress имеет встроенную систему планировщика задач WP-Cron, которая позволяет запускать автоматические действия по расписанию. Однако многие разработчики сталкиваются с проблемами, когда WP-Cron не срабатывает как надо из-за особенностей работы PHP или сервера. В этой статье мы подробно разберём, как создать, настроить и отладить автоматические задачи в WordPress без использования плагинов, чтобы обеспечить стабильную работу и точное выполнение задач.
Что такое WP-Cron и как он работает
WP-Cron — это имитация системного cron, реализованная на уровне PHP в WordPress. По умолчанию планировщик запускается при каждом посещении сайта: при загрузке страницы проверяется, есть ли задачи, которые нужно выполнить. Если есть — запускаются соответствующие функции. Несмотря на удобство, такой подход имеет несколько недостатков:
- Задачи не запускаются, если сайт не посещают (например, низкий трафик).
- Задержки в выполнении задач при больших нагрузках.
- Проблемы с одновременным выполнением и дублированием задач.
Чтобы решить эти вопросы, часто рекомендуется отключить WP-Cron и настроить системный cron на сервере. Но сначала рассмотрим, как создавать задачи в WP-Cron вручную и управлять ими с помощью кода.
Создание и регистрация собственной автоматической задачи в WordPress
Для создания автоматической задачи нужно зарегистрировать событие с помощью функции wp_schedule_event и привязать к нему обработчик. Рассмотрим пример, который выполняет функцию wp_code_clear_expired_cache каждый час.
function wp_code_clear_expired_cache() {
// Логика очистки устаревшего кэша
// Здесь можно подключить очистку кэша плагинов или собственных данных
}
add_action('wp_code_hourly_event', 'wp_code_clear_expired_cache');
function wp_code_schedule_hourly_event() {
if (!wp_next_scheduled('wp_code_hourly_event')) {
wp_schedule_event(time(), 'hourly', 'wp_code_hourly_event');
}
}
add_action('wp', 'wp_code_schedule_hourly_event');Объяснение:
wp_schedule_eventрегистрирует новое событие с интерваломhourly.wp_next_scheduledпроверяет, не запланировано ли оно уже, чтобы не создавать дубликаты.add_actionсвязывает событие с пользовательской функцией.- Хук
wpиспользуется для регистрации события при загрузке сайта.
Как добавить собственный интервал для WP-Cron
Стандартные интервалы — hourly, twicedaily, daily — подходят не всегда. Можно добавить свои. Например, добавим интервал в 10 минут:
function wp_code_custom_cron_schedules($schedules) {
if (!isset($schedules['every_ten_minutes'])) {
$schedules['every_ten_minutes'] = array(
'interval' => 600, // 600 секунд = 10 минут
'display' => __('Каждые 10 минут')
);
}
return $schedules;
}
add_filter('cron_schedules', 'wp_code_custom_cron_schedules');Теперь можно использовать every_ten_minutes в wp_schedule_event.
Как отключить WP-Cron и настроить системный cron на сервере
Чтобы избавиться от проблем с запуском WP-Cron по запросу, рекомендуют отключить его и задать системный cron, который будет вызывать WP-Cron регулярно.
Отключение WP-Cron: добавьте в файл wp-config.php перед строкой /* That's all, stop editing! Happy publishing. */ следующую константу:
define('DISABLE_WP_CRON', true);Настройка системного cron: В панели управления хостингом или через SSH добавьте задачу, например, на выполнение каждые 15 минут:
wget -q -O - https://ваш-сайт.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&1Или через curl:
curl -s https://ваш-сайт.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&1Это гарантирует запуск cron независимо от посещаемости сайта.
Отладка и мониторинг WP-Cron задач
Чтобы убедиться, что задачи выполняются, можно использовать несколько методов:
- Плагин WP Crontrol — позволяет смотреть, редактировать и запускать задачи из админки.
- Логирование выполнения задач через запись в файл или базу данных.
- Добавление в функцию обработчик записи в лог, например:
function wp_code_clear_expired_cache() {
// Очистка кэша
error_log('WP-Code: Очистка кэша выполнена ' . date('Y-m-d H:i:s'));
}Важно проверять, не дублируются ли задачи и корректно ли удаляются устаревшие.
Практический пример: автоматическое удаление старых ревизий записей
Для примера создадим задачу, которая каждую ночь будет удалять ревизии постов старше 30 дней, чтобы не засорять базу данных.
function wp_code_delete_old_revisions() {
global $wpdb;
$days = 30;
$time = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
$deleted = $wpdb->query(
$wpdb->prepare(
"DELETE FROM $wpdb->posts WHERE post_type = 'revision' AND post_modified < %s",
$time
)
);
error_log("WP-Code: Удалено $deleted старых ревизий");
}
add_action('wp_code_daily_event', 'wp_code_delete_old_revisions');
function wp_code_schedule_daily_event() {
if (!wp_next_scheduled('wp_code_daily_event')) {
wp_schedule_event(time(), 'daily', 'wp_code_daily_event');
}
}
add_action('wp', 'wp_code_schedule_daily_event');Этот код создаст задачу, которая ежедневно будет чистить базу от устаревших ревизий, помогая снизить нагрузку и размер базы.
Рекомендации по безопасности и производительности
При работе с WP-Cron учитывайте:
- Не запускайте ресурсоёмкие задачи слишком часто.
- Обрабатывайте ошибки в функциях задач, чтобы не прерывать выполнение.
- Используйте nonce и проверку прав, если задачи связаны с пользовательскими действиями.
- Для критичных задач лучше настроить системный cron с внешним мониторингом.
Если хотите упростить создание и управление cron-задачами, обратите внимание на плагин Expert Review — он содержит инструменты для мониторинга и оптимизации сайта, включая управление задачами.