WP-Cron — это встроенный механизм планировщика задач в WordPress, который позволяет автоматически выполнять определённые действия по расписанию. В отличие от системного cron на сервере, WP-Cron запускается при загрузке сайта, поэтому важно понимать, как правильно его применять и оптимизировать.
Что такое WP-Cron и как он работает
WP-Cron — это имитация планировщика задач, встроенная в ядро WordPress. Основная идея в том, что при каждом заходе пользователя на сайт запускается проверка, есть ли запланированные задачи, время которых настало. Если такие задачи есть — они выполняются.
Это значит, что если на сайте нет посетителей, задачи могут выполняться с задержкой. Поэтому WP-Cron отлично подходит для большинства сайтов, но для проектов с низкой посещаемостью рекомендуется использовать системный cron или другие методы.
Основные преимущества WP-Cron:
- Не требует доступа к серверному cron;
- Простота настройки через код или плагины;
- Гибкость в расписании и параметрах задач.
Однако есть и недостатки, связанные с зависимостью от посещаемости сайта и возможными проблемами с производительностью при большом количестве задач.
Основные функции WP-Cron для разработчиков
Для работы с WP-Cron используются несколько ключевых функций:
wp_schedule_event()— для создания повторяющихся событий;wp_schedule_single_event()— для однократных задач;wp_clear_scheduled_hook()— для удаления запланированных задач;wp_next_scheduled()— для проверки запланированной задачи.
Пример создания повторяющейся задачи, которая запускается раз в час:
function wpnews_schedule_hourly_event() {
if (!wp_next_scheduled('wpnews_hourly_event_hook')) {
wp_schedule_event(time(), 'hourly', 'wpnews_hourly_event_hook');
}
}
add_action('wp', 'wpnews_schedule_hourly_event');
add_action('wpnews_hourly_event_hook', 'wpnews_hourly_event_function');
function wpnews_hourly_event_function() {
// Код задачи, например, очистка кэша или отправка отчётов
}Обратите внимание, что функцию планирования wpnews_schedule_hourly_event мы подключаем к хуку wp, чтобы она проверялась при каждой загрузке страницы и создавалась при необходимости.
Создание пользовательского интервала для WP-Cron
По умолчанию WordPress поддерживает несколько интервалов: hourly (часовой), twicedaily (дважды в день), daily (ежедневный). Если нужно задать свой интервал, его можно добавить через фильтр cron_schedules.
Пример добавления интервала в 10 минут:
function wpnews_custom_cron_intervals($schedules) {
if (!isset($schedules['every_ten_minutes'])) {
$schedules['every_ten_minutes'] = array(
'interval' => 600, // 600 секунд = 10 минут
'display' => __('Каждые 10 минут')
);
}
return $schedules;
}
add_filter('cron_schedules', 'wpnews_custom_cron_intervals');После добавления такого интервала его можно использовать в wp_schedule_event():
wp_schedule_event(time(), 'every_ten_minutes', 'wpnews_custom_10min_event_hook');Отладка и управление WP-Cron
Для отладки и управления задачами WP-Cron удобны специальные плагины. Вот несколько полезных решений:
- WP Crontrol — позволяет просматривать, добавлять, редактировать и удалять задачи WP-Cron прямо из админки WordPress;
- Clearfy Pro — комплексный плагин для оптимизации и управления разными аспектами WordPress, включая работу WP-Cron;
- WPRemark — плагин для автоматизации аналитики и отчетов, который можно запускать через WP-Cron.
Если на сайте много задач WP-Cron, стоит внимательно следить за нагрузкой и оптимизировать расписание.
Как отключить WP-Cron и использовать системный cron
Для повышения стабильности и точности запуска задач рекомендуют отключить WP-Cron и настроить системный cron на сервере. Отключение WP-Cron происходит через файл wp-config.php добавлением строки:
define('DISABLE_WP_CRON', true);Затем на сервере настраивается cron-задание, которое будет вызывать вызов скрипта WP-Cron по расписанию, например, каждую минуту:
* * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1Это гарантирует, что задачи будут запускаться точно и своевременно, независимо от посещаемости сайта.
Практическое применение WP-Cron: пример автоматической очистки базы данных
Ниже приведён пример, как с помощью WP-Cron автоматически удалять посты из черновиков старше 7 дней. Это полезно для поддержания чистоты базы и оптимизации.
function wpnews_delete_old_drafts() {
global $wpdb;
$seven_days_ago = date('Y-m-d H:i:s', strtotime('-7 days'));
$wpdb->query($wpdb->prepare(
"DELETE FROM $wpdb->posts WHERE post_status = 'draft' AND post_date < %s",
$seven_days_ago
));
}
function wpnews_schedule_delete_drafts() {
if (!wp_next_scheduled('wpnews_delete_old_drafts_hook')) {
wp_schedule_event(time(), 'daily', 'wpnews_delete_old_drafts_hook');
}
}
add_action('wp', 'wpnews_schedule_delete_drafts');
add_action('wpnews_delete_old_drafts_hook', 'wpnews_delete_old_drafts');Такой код настроит ежедневную очистку старых черновиков, что помогает снизить нагрузку и поддерживать порядок.
Рекомендации по безопасности и производительности
При работе с WP-Cron важно учитывать следующие моменты:
- Не перегружайте сайт слишком частыми задачами — это может привести к задержкам и нагрузке;
- Используйте уникальные префиксы для своих хуков и функций (например,
wpnews_), чтобы избежать конфликтов с другими плагинами; - Проверяйте логи и используйте плагины для мониторинга задач;
- Если задачи критичны по времени, лучше отключить WP-Cron и настроить системный cron;
- Избегайте длительных и ресурсоёмких операций внутри WP-Cron, лучше разбивайте на более мелкие задачи.
Использование WP-Cron — мощный инструмент для автоматизации рутинных процессов на WordPress-сайте. Правильная настройка и контроль помогут сделать сайт стабильнее и функциональнее.