WP-Cron — это встроенный механизм планировщика задач в WordPress, который позволяет запускать определённые действия по расписанию. Он полезен для автоматизации рутинных процессов, таких как публикация отложенных постов, очистка базы данных, отправка уведомлений и многое другое. В этой статье мы детально рассмотрим, как правильно использовать WP-Cron, как создавать собственные задачи и оптимизировать их работу.
Что такое WP-Cron и как он работает
WP-Cron не является настоящим системным планировщиком, как cron в Linux. Его запуск зависит от посещений сайта: когда пользователь заходит на страницу, WordPress проверяет, есть ли запланированные задачи, и если да, выполняет их. Это значит, что при низкой посещаемости задачи могут запускаться с задержкой.
Для повышения надёжности можно настроить системный cron, который будет делать HTTP-запрос к сайту, принуждая WP-Cron запускаться регулярно.
Основные функции WP-Cron:
- Запуск задач по расписанию (раз в минуту, час, день и т.д.).
- Возможность создавать собственные интервалы и задачи.
- Интеграция с хуками WordPress для расширения функционала.
Как зарегистрировать собственную задачу в WP-Cron
Для создания кастомной задачи нужно выполнить несколько шагов: зарегистрировать интервал, если стандартных не хватает, добавить событие в расписание и написать функцию-обработчик.
Регистрация пользовательского интервала
В WordPress есть стандартные интервалы, например, hourly (каждый час), twicedaily (два раза в день), daily (ежедневно). Однако часто нужна своя периодичность. Для этого используем фильтр cron_schedules:
add_filter('cron_schedules', 'wpbook_cron_custom_schedules');
function wpbook_cron_custom_schedules($schedules) {
$schedules['every_five_minutes'] = array(
'interval' => 300, // 300 секунд = 5 минут
'display' => __('Каждые 5 минут')
);
return $schedules;
}Теперь в расписании появится новый интервал 'every_five_minutes'.
Добавление задачи в расписание
Чтобы добавить задачу, нужно проверить, не запланирована ли она уже, и если нет — запланировать:
function wpbook_cron_schedule_event() {
if (!wp_next_scheduled('wpbook_cron_custom_task')) {
wp_schedule_event(time(), 'every_five_minutes', 'wpbook_cron_custom_task');
}
}
add_action('wp', 'wpbook_cron_schedule_event');Этот код запустит событие wpbook_cron_custom_task каждые 5 минут.
Обработка события
Далее добавляем функцию-обработчик, которая выполняет нужные действия:
add_action('wpbook_cron_custom_task', 'wpbook_cron_do_something');
function wpbook_cron_do_something() {
// Здесь можно добавить логику, например, очистку кеша
error_log('WP-Cron задача выполнена в ' . current_time('mysql'));
}В примере мы просто пишем в лог время запуска задачи.
Как проверить и отлаживать задачи WP-Cron
Для мониторинга и отладки WP-Cron есть несколько способов:
- Использовать плагин WP Crontrol. Он позволяет видеть все запланированные задачи, запускать их вручную и удалять.
- Проверять логи ошибок PHP, если в обработчиках используется
error_log(). - Добавлять уведомления или записи в базу данных для контроля выполнения.
WP Crontrol — мощный инструмент, который поможет быстро понять, какие задачи активны и когда они запланированы.
Оптимизация работы WP-Cron на сайте
Из-за того, что WP-Cron запускается при посещении сайта, на сайтах с низкой посещаемостью задачи могут запускаться с задержкой. Чтобы это исправить, рекомендуется отключить встроенный WP-Cron и настроить системный cron, который будет вызывать wp-cron.php регулярно.
Отключение WP-Cron
В файл wp-config.php добавляем:
define('DISABLE_WP_CRON', true);Настройка системного cron
В Linux на сервере добавляем задачу:
*/5 * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1Это будет запускать WP-Cron каждые 5 минут независимо от посещаемости.
Практические примеры использования WP-Cron
Автоматическая очистка базы данных
Чтобы регулярно удалять старые ревизии и спам-комментарии, можно написать такую функцию:
add_action('wpbook_cron_cleanup_db', 'wpbook_cron_cleanup_database');
function wpbook_cron_cleanup_database() {
global $wpdb;
$wpdb->query("DELETE FROM {$wpdb->posts} WHERE post_type = 'revision'");
$wpdb->query("DELETE FROM {$wpdb->comments} WHERE comment_approved = 'spam'");
error_log('Очистка базы данных выполнена');
}
// Запланировать задачу один раз
function wpbook_schedule_cleanup() {
if (!wp_next_scheduled('wpbook_cron_cleanup_db')) {
wp_schedule_event(time(), 'daily', 'wpbook_cron_cleanup_db');
}
}
add_action('wp', 'wpbook_schedule_cleanup');Такой подход помогает держать базу в порядке и экономит место.
Отправка email-рассылки по расписанию
WP-Cron отлично подходит для автоматической отправки уведомлений:
add_action('wpbook_cron_send_newsletter', 'wpbook_send_newsletter_email');
function wpbook_send_newsletter_email() {
$users = get_users(array('role' => 'subscriber'));
foreach ($users as $user) {
wp_mail($user->user_email, 'Новостная рассылка', 'Привет! Вот свежие новости нашего сайта.');
}
error_log('Рассылка выполнена: ' . current_time('mysql'));
}
function wpbook_schedule_newsletter() {
if (!wp_next_scheduled('wpbook_cron_send_newsletter')) {
wp_schedule_event(time(), 'weekly', 'wpbook_cron_send_newsletter');
}
}
add_action('wp', 'wpbook_schedule_newsletter');Рассылку можно настроить на любую периодичность, добавив нужный интервал.
Заключение
WP-Cron — мощный инструмент для автоматизации задач на WordPress. Правильное использование и оптимизация помогут сделать сайт более функциональным и удобным в поддержке. Не забывайте проверять задачи и использовать системный cron для повышения надёжности.