WP-Cron — встроенная в WordPress система планирования задач, которая позволяет выполнять определённые действия по расписанию. В отличие от системного cron на сервере, WP-Cron запускается не по времени, а при обращении к сайту, что требует особого подхода к настройке и использованию.
Что такое WP-Cron и как он работает
WP-Cron — это виртуальный планировщик задач, который запускается автоматически при загрузке любой страницы сайта. Он проверяет, есть ли запланированные задачи, и если их время выполнения наступило, запускает их. Это удобно, когда у вас нет доступа к системному cron, но накладывает ограничения — если на сайт долго не заходят, задачи могут не выполниться вовремя.
WP-Cron работает через функцию wp-cron.php, которая вызывается при каждом запросе к сайту. Это значит, что нагрузка на сервер распределяется равномерно с посещениями, но если трафика мало, задачи задерживаются.
Для надежной работы на сайтах с низкой посещаемостью рекомендуется отключить WP-Cron и настроить системный cron, который будет обращаться к wp-cron.php по расписанию.
Отличия WP-Cron от системного cron
- WP-Cron запускается при посещении сайта, системный cron — по расписанию в системе.
- WP-Cron проще настроить, не требует доступа к серверу.
- WP-Cron может не сработать вовремя при низком трафике.
Как создать и зарегистрировать собственную задачу в WP-Cron
Для автоматизации задач часто нужно создать собственное событие, которое будет вызываться по расписанию. Рассмотрим пример, как это сделать на практике.
Первый шаг — зарегистрировать расписание, если стандартных интервалов недостаточно. Например, добавить интервал в 10 минут:
function wpfix_add_cron_interval($schedules) {
if (!isset($schedules['every_ten_minutes'])) {
$schedules['every_ten_minutes'] = array(
'interval' => 600, // 600 секунд = 10 минут
'display' => __('Каждые 10 минут')
);
}
return $schedules;
}
add_filter('cron_schedules', 'wpfix_add_cron_interval');Теперь нужно зарегистрировать саму задачу. Допустим, мы хотим каждые 10 минут очищать кэш или отправлять отчёт.
function wpfix_register_cron_event() {
if (!wp_next_scheduled('wpfix_custom_cron_hook')) {
wp_schedule_event(time(), 'every_ten_minutes', 'wpfix_custom_cron_hook');
}
}
add_action('wp', 'wpfix_register_cron_event');Далее создаём функцию, которая будет выполняться по событию:
function wpfix_custom_cron_function() {
// Здесь ваш код для выполнения задачи
error_log('WP-Cron задача выполнена: ' . date('Y-m-d H:i:s'));
}
add_action('wpfix_custom_cron_hook', 'wpfix_custom_cron_function');Удаление задачи из расписания
Если задача больше не нужна, её можно отменить:
function wpfix_clear_cron_event() {
$timestamp = wp_next_scheduled('wpfix_custom_cron_hook');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpfix_custom_cron_hook');
}
}
// Вызывать при деактивации плагина или вручную
// add_action('deactivate_my_plugin', 'wpfix_clear_cron_event');Как проверить и отлаживать WP-Cron задачи
Проверка и отладка WP-Cron — важный этап, чтобы убедиться, что задачи работают корректно.
Для просмотра запланированных задач можно использовать плагин Clearfy, который позволяет удобно управлять кроном и оптимизировать сайт.
Также полезно выводить логи выполнения задач, например, через error_log() или записывать в отдельный файл.
Если WP-Cron не срабатывает, проверьте следующие моменты:
- Не отключена ли константа
DISABLE_WP_CRONвwp-config.php. - Есть ли посещения сайта — WP-Cron запускается при запросах.
- Не блокирует ли сервер обращения к
wp-cron.php.
Использование системного cron для надежного запуска WP-Cron
На некоторых сайтах с низкой посещаемостью рекомендуется отключить WP-Cron и настроить системный cron.
Для отключения добавьте в wp-config.php:
define('DISABLE_WP_CRON', true);Далее в cPanel, SSH или другом интерфейсе сервера добавьте задачу:
*/15 * * * * wget -q -O - https://ваш-сайт.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&1Это запустит обработку задач каждые 15 минут, независимо от посещаемости.
Примеры полезных задач для WP-Cron
WP-Cron можно использовать для множества задач:
- Автоматическая очистка временных файлов и кэша.
- Отправка регулярных email-рассылок или уведомлений.
- Обновление данных из внешних API.
- Создание резервных копий базы данных.
- Удаление устаревших записей или черновиков.
Например, задача для удаления старых ревизий записей:
function wpfix_delete_old_revisions() {
global $wpdb;
$days = 30;
$wpdb->query($wpdb->prepare(
"DELETE FROM $wpdb->posts WHERE post_type = 'revision' AND post_modified < NOW() - INTERVAL %d DAY",
$days
));
}
add_action('wpfix_delete_old_revisions_hook', 'wpfix_delete_old_revisions');
if (!wp_next_scheduled('wpfix_delete_old_revisions_hook')) {
wp_schedule_event(time(), 'daily', 'wpfix_delete_old_revisions_hook');
}Заключение
WP-Cron — мощный инструмент для автоматизации задач в WordPress. Правильная настройка и понимание принципов работы позволяют создавать удобные и эффективные решения без необходимости доступа к серверному cron. Используйте примеры кода из статьи, чтобы внедрять автоматизацию под свои задачи и оптимизировать работу сайта.