В WordPress для выполнения отложенных задач по расписанию традиционно используется встроенный механизм WP-Cron. Однако WP-Cron запускается только при посещении сайта, что может привести к задержкам или пропуску важных задач, особенно на сайтах с низкой посещаемостью. В этой статье мы разберем, как настроить надежный и точный отложенный запуск задач в WordPress без использования стандартного WP-Cron.
Почему стандартный WP-Cron не всегда подходит для отложенных задач
WP-Cron — это имитация системного cron, которая запускается при каждом запросе к сайту. Если на сайте мало посетителей, cron-задачи могут запускаться с задержками. Кроме того, при большом количестве задач это может негативно сказаться на производительности сайта.
Основные проблемы WP-Cron:
- Зависимость от посещаемости сайта;
- Риск задержек в выполнении задач;
- Отсутствие контроля над точным временем запуска;
- Проблемы с нагрузкой при частом запуске задач.
Поэтому для надежной работы отложенных задач рекомендуется использовать системный cron и отключить WP-Cron.
Как отключить WP-Cron и настроить системный cron
Первый шаг — отключить автоматический запуск WP-Cron. Для этого в файл wp-config.php добавьте следующую строку:
define('DISABLE_WP_CRON', true);
Теперь WP-Cron не будет запускаться при каждом запросе.
Далее необходимо настроить системную задачу cron на сервере, чтобы она запускала обработку задач WordPress с нужной периодичностью. Для этого добавьте в crontab команду:
* * * * * wget -q -O - https://your-site.ru/wp-cron.php?doing_wp_cron > /dev/null 2>&1
Или, если есть доступ к PHP из командной строки:
* * * * * php /path/to/wordpress/wp-cron.php > /dev/null 2>&1
Это обеспечит запуск cron-задач каждый раз в начале минуты. Периодичность можно изменить по потребностям.
Реализация собственных задач с использованием системного cron
После отключения WP-Cron и настройки системного cron, вы можете создавать свои задачи на основе стандартных хуков WordPress.
Например, создадим задачу, которая будет запускаться каждые 5 минут и выполнять очистку устаревших данных.
Регистрация задачи и интервала
Добавьте в файл функций темы или плагина следующий код:
function wp_pro_add_custom_cron_interval($schedules) {
if (!isset($schedules['every_five_minutes'])) {
$schedules['every_five_minutes'] = array(
'interval' => 300, // 300 секунд = 5 минут
'display' => __('Каждые 5 минут', 'wp-pro')
);
}
return $schedules;
}
add_filter('cron_schedules', 'wp_pro_add_custom_cron_interval');
function wp_pro_schedule_custom_cron_job() {
if (!wp_next_scheduled('wp_pro_custom_cron_hook')) {
wp_schedule_event(time(), 'every_five_minutes', 'wp_pro_custom_cron_hook');
}
}
add_action('wp', 'wp_pro_schedule_custom_cron_job');
Здесь мы добавляем новый интервал для cron — 5 минут — и регистрируем задачу, которая запускается с этим интервалом.
Обработка задачи
Создадим функцию, которая будет выполнять нужные действия при срабатывании задачи:
function wp_pro_custom_cron_function() {
// Пример: удаляем устаревшие записи из пользовательской таблицы
global $wpdb;
$table = $wpdb->prefix . 'custom_data';
$result = $wpdb->query(
$wpdb->prepare("DELETE FROM $table WHERE created_at < NOW() - INTERVAL 30 DAY")
);
if ($result !== false) {
error_log('wp-pro: Устаревшие записи удалены: ' . $result);
}
}
add_action('wp_pro_custom_cron_hook', 'wp_pro_custom_cron_function');
Таким образом, каждые 5 минут сервер будет запускать обработку, которая будет удалять устаревшие записи старше 30 дней.
Отладка и мониторинг cron-задач
Для удобства отладки и мониторинга задач рекомендуем использовать плагин Clearfy Pro. В нем есть функции для управления cron-задачами, мониторинга их статуса и очистки мусорных задач.
Также для просмотра запланированных задач можно использовать плагин WP Crontrol, который позволяет удобно редактировать и запускать задачи вручную.
Рекомендации по безопасности и производительности
При настройке системного cron убедитесь, что доступ к wp-cron.php ограничен, чтобы избежать несанкционированных запусков. Для этого можно настроить на сервере правила доступа по IP или использовать секретный параметр в URL.
Если вы создаете тяжелые задачи, стоит рассмотреть их разбиение на несколько частей или запуск по событию, чтобы не перегружать сервер.
Заключение
Перенос отложенных задач WordPress с WP-Cron на системный cron значительно повышает надежность и точность их выполнения. Это особенно важно для сайтов с низкой посещаемостью или большим объемом фоновых задач.
Используя описанные методы и примеры кода, вы сможете самостоятельно настроить удобный и стабильный механизм отложенного запуска задач на вашем сайте.