WordPress имеет встроенную систему планировщика задач — WP-Cron, которая позволяет вам запускать определённые функции по расписанию. В этой статье мы подробно разберём, как правильно использовать WP-Cron для автоматизации задач, какие есть подводные камни и как создавать собственные задания с примерами кода.
Что такое WP-Cron и как он работает
WP-Cron — это имитация системного cron, реализованная на уровне PHP. В отличие от классического cron, который запускается сервером по расписанию, WP-Cron срабатывает при загрузке любой страницы сайта. Это значит, что если посещений нет, задачи не выполняются вовремя.
WP-Cron проверяет, не наступило ли время запуска запланированных событий, и если да — запускает их. Это удобно, но может привести к задержкам, если трафик сайта низкий.
Чтобы улучшить надежность выполнения cron-задач, часто отключают WP-Cron и настраивают системный cron на сервере для обращения к скрипту wp-cron.php по расписанию.
Настройка системного cron для запуска WP-Cron
Для отключения встроенного WP-Cron добавьте в wp-config.php:
define('DISABLE_WP_CRON', true);Далее настроите системный cron (например, в Linux) командой:
* * * * * wget -q -O - https://ваш_сайт.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&1Это команда будет запускать WP-Cron каждую минуту, что гораздо надежнее, чем ждать загрузки сайта.
Как создавать собственные cron-задачи в WordPress
Для добавления собственной задачи используются функции wp_schedule_event, add_action и wp_clear_scheduled_hook. Рассмотрим пример, где мы будем автоматически удалять старые записи из пользовательской таблицы.
Пример: удаление записей старше 30 дней
1. Регистрируем событие при инициализации темы или плагина:
function wptour_schedule_cleanup() {
if (!wp_next_scheduled('wptour_cleanup_old_records')) {
wp_schedule_event(time(), 'daily', 'wptour_cleanup_old_records');
}
}
add_action('wp', 'wptour_schedule_cleanup');2. Создаем функцию-обработчик:
function wptour_cleanup_old_records_callback() {
global $wpdb;
$table = $wpdb->prefix . 'custom_table';
$date = date('Y-m-d H:i:s', strtotime('-30 days'));
$wpdb->query($wpdb->prepare("DELETE FROM $table WHERE created_at < %s", $date));
}
add_action('wptour_cleanup_old_records', 'wptour_cleanup_old_records_callback');3. При деактивации плагина или темы очищаем расписание:
function wptour_deactivate_cleanup() {
wp_clear_scheduled_hook('wptour_cleanup_old_records');
}
register_deactivation_hook(__FILE__, 'wptour_deactivate_cleanup');Так мы гарантируем, что задача запускается ежедневно и удаляет устаревшие данные.
Расширенные интервалы для WP-Cron: добавляем собственные периоды
Стандартные интервалы — hourly, twicedaily, daily. Что делать, если нужна своя периодичность, например, каждые 5 минут?
Для этого нужно добавить в фильтр cron_schedules свои интервалы:
function wptour_add_cron_intervals($schedules) {
$schedules['every_five_minutes'] = array(
'interval' => 300,
'display' => __('Каждые 5 минут')
);
return $schedules;
}
add_filter('cron_schedules', 'wptour_add_cron_intervals');Теперь можно использовать этот интервал при планировании событий:
wp_schedule_event(time(), 'every_five_minutes', 'wptour_cleanup_old_records');Практические советы по использованию WP-Cron
Мониторинг и отладка cron-задач
Чтобы убедиться, что задачи выполняются, используйте плагин WP Crontrol. Он позволяет просматривать все запланированные события, запускать их вручную и удалять ненужные.
Для логирования выполнения задач можно добавить запись в отдельный файл или использовать стандартный debug.log через error_log.
Избегаем дублирования задач
Обязательно проверяйте наличие запланированного события перед его созданием через wp_next_scheduled, чтобы избежать множества одинаковых задач, которые могут перегрузить сервер.
Оптимизация производительности
Если задача тяжелая, например, импорт/экспорт данных, разбивайте её на части, чтобы не превышать лимиты времени выполнения PHP. Для этого можно ставить несколько мелких задач или использовать transient API для хранения прогресса.
Использование WP-Cron в связке с плагинами WPShop
Для сайтов на WordPress с дополнениями из WPShop, например, при автоматизации обзоров через плагин Expert Review, можно запускать регулярные обновления рейтингов и отзывы по расписанию.
Пример запуска обновления рейтингов каждую ночь:
function wptour_update_reviews() {
if (function_exists('expert_review_update_all')) {
expert_review_update_all();
}
}
add_action('wptour_update_reviews_hook', 'wptour_update_reviews');
function wptour_schedule_review_update() {
if (!wp_next_scheduled('wptour_update_reviews_hook')) {
wp_schedule_event(time(), 'daily', 'wptour_update_reviews_hook');
}
}
add_action('wp', 'wptour_schedule_review_update');Это позволит поддерживать актуальность данных без ручного вмешательства.
Заключение по работе с WP-Cron
WP-Cron — мощный инструмент для автоматизации рутинных задач в WordPress. Главное — понимать его особенности и ограничения, грамотно планировать задачи и использовать системный cron для надежности. Совмещая это с полезными плагинами, вы сможете значительно расширить функциональность сайта и упростить администрирование.