В WordPress часто возникает необходимость выполнять задачи по расписанию: очистка кэша, отправка уведомлений, обновление данных и многое другое. Для этого WordPress использует собственную систему планировщика задач — WP-Cron. Однако, стандартный WP-Cron запускается только при посещении сайта, что не всегда удобно и надежно. В этой статье подробно разберём, как создавать автозапускаемые cron-задачи в WordPress, чтобы задачи выполнялись стабильно и своевременно.
Что такое WP-Cron и почему его нужно доработать
WP-Cron — это имитация системного cron на PHP, встроенная в WordPress. Она запускается при каждом визите на сайт, проверяя, не пора ли выполнить запланированные задачи. Такой подход имеет несколько недостатков:
- Если на сайт мало посетителей, задачи могут выполняться с задержками.
- При перегрузке сервера WP-Cron может работать с ошибками или тормозить.
- Невозможность точно задать интервал запуска задач, например, каждую минуту.
Поэтому для крупных проектов и критически важных задач рекомендуется настроить системный cron и отключить WP-Cron.
Отключение WP-Cron и настройка системного cron
Для отключения WP-Cron в файле wp-config.php добавьте строку:
define('DISABLE_WP_CRON', true);
Далее создайте задание в системном cron на сервере, которое будет запускать файл wp-cron.php с нужной периодичностью.
Пример записи в crontab для запуска каждую минуту:
* * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1
Замените https://example.com на ваш домен. Такой подход гарантирует выполнение задач независимо от посещаемости сайта.
Создание и регистрация собственной cron-задачи в WordPress
Для добавления собственной задачи используйте хуки wpplugin_schedule_cron_task и wpplugin_do_cron_task (префикс wpplugin_ для уникальности).
Шаг 1. Регистрация задачи и расписания
Добавим в плагин или файл functions.php следующий код:
function wpplugin_add_custom_cron_schedule($schedules) {
if (!isset($schedules['every_five_minutes'])) {
$schedules['every_five_minutes'] = array(
'interval' => 300, // 300 секунд = 5 минут
'display' => __('Каждые 5 минут')
);
}
return $schedules;
}
add_filter('cron_schedules', 'wpplugin_add_custom_cron_schedule');
function wpplugin_activate_cron_task() {
if (!wp_next_scheduled('wpplugin_do_cron_task')) {
wp_schedule_event(time(), 'every_five_minutes', 'wpplugin_do_cron_task');
}
}
add_action('wp', 'wpplugin_activate_cron_task');
Здесь мы добавляем новое расписание с интервалом 5 минут и регистрируем задачу, которая будет запускаться по этому расписанию.
Шаг 2. Обработка задачи
Теперь напишем функцию, которая выполнится при срабатывании задачи:
function wpplugin_handle_cron_task() {
// Пример: очистка временных данных
global $wpdb;
$deleted = $wpdb->query("DELETE FROM {$wpdb->prefix}wpplugin_temp_data WHERE expiration < NOW()");
if ($deleted !== false) {
error_log("WPPlugin: удалено {$deleted} устаревших записей.");
}
}
add_action('wpplugin_do_cron_task', 'wpplugin_handle_cron_task');
В этом примере мы удаляем устаревшие записи из пользовательской таблицы. Вместо этого можно выполнять любые задачи, например, отправлять письма, обновлять кэш, синхронизировать данные.
Как проверить и отладить cron-задачи
Для мониторинга и отладки cron-задач удобно использовать плагин WP Crontrol. Он позволяет видеть все запланированные задачи, запускать их вручную и удалять ненужные.
Также полезно логировать выполнение задач через error_log или записывать статус в отдельную таблицу.
Рекомендации по оптимизации и безопасности
При создании cron-задач учитывайте:
- Избегайте длительных операций в одной задаче — разбивайте их на части.
- Используйте транзакции и обрабатывайте ошибки.
- Отключайте WP-Cron на продакшене и настраивайте системный cron.
- Не запускайте задачи слишком часто, чтобы не перегружать сервер.
- Проверяйте права доступа и защищайте
wp-cron.phpот несанкционированного запуска.
Пример интеграции с плагином WP Rocket для очистки кеша
Если у вас установлен плагин WP Rocket, можно настроить автоматическую очистку кеша по расписанию:
function wpplugin_clear_wp_rocket_cache() {
if (function_exists('rocket_clean_domain')) {
rocket_clean_domain();
error_log('WPPlugin: кеш WP Rocket очищен.');
}
}
add_action('wpplugin_do_cron_task', 'wpplugin_clear_wp_rocket_cache');
Добавьте вызов wpplugin_clear_wp_rocket_cache в обработчик своих cron-задач, и кеш будет автоматически обновляться.