В WordPress часто возникает необходимость автоматически обновлять контент: например, подтягивать свежие данные с внешних API, обновлять кэшированные страницы или периодически менять информацию на сайте. Для подобных задач идеально подходит механизм WP-Cron — встроенный в WordPress планировщик задач. В этой статье подробно разберём, как грамотно настроить автоматическое обновление контента с помощью WP-Cron, приведём рабочие примеры кода и рассмотрим распространённые нюансы.
Что такое WP-Cron и как он работает
WP-Cron — это имитация системного cron в WordPress. В отличие от классического cron, который запускается по расписанию на уровне сервера, WP-Cron срабатывает при посещении сайта. При каждом запросе WordPress проверяет, есть ли запланированные события, и если да — выполняет их. Это удобно, так как не требует доступа к серверу, но есть и минусы:
- Задачи запускаются только при посещении сайта, что может привести к задержкам, если трафик низкий.
- При высокой нагрузке множество одновременно срабатывающих задач может замедлить работу сайта.
- Не все задачи подходят для WP-Cron — критичные по времени лучше запускать системным cron.
Тем не менее для большинства задач автоматического обновления контента WP-Cron подходит отлично, особенно если оптимизировать расписание и код.
Как добавить собственную задачу обновления контента с WP-Cron
Рассмотрим пример: мы хотим раз в час подтягивать свежие данные из внешнего API и сохранять их в опции базы данных. Для этого нужно сделать три шага:
- Создать функцию с логикой обновления.
- Зарегистрировать событие в WP-Cron.
- Запланировать периодическое выполнение задачи.
Шаг 1: Функция обновления контента
function wp2_update_external_data() {
$response = wp_remote_get('https://api.example.com/data');
if (is_wp_error($response)) {
error_log('wp2: Ошибка при получении данных');
return;
}
$data = wp_remote_retrieve_body($response);
if (!empty($data)) {
update_option('wp2_external_data', $data);
}
}
Здесь мы используем стандартную функцию wp_remote_get, чтобы получить данные, и сохраняем их в опцию wp2_external_data. В реальной задаче можно парсить JSON, проверять валидность и пр.
Шаг 2: Регистрация события WP-Cron
add_action('wp2_hourly_event', 'wp2_update_external_data');
Здесь мы связываем хук wp2_hourly_event с нашей функцией обновления.
Шаг 3: Запланировать событие при активации темы или плагина
function wp2_schedule_hourly_event() {
if (!wp_next_scheduled('wp2_hourly_event')) {
wp_schedule_event(time(), 'hourly', 'wp2_hourly_event');
}
}
add_action('wp', 'wp2_schedule_hourly_event');
Эта функция проверяет, запланировано ли уже событие, и если нет — ставит его в очередь на выполнение каждый час. Лучше вызывать её на hook wp или при активации плагина.
Как создать собственный интервал расписания в WP-Cron
По умолчанию WordPress поддерживает интервалы: hourly (час), twicedaily (два раза в день), daily (день). Если нужно обновлять данные, например, каждые 15 минут, нужно добавить свой интервал:
function wp2_custom_cron_intervals($schedules) {
if (!isset($schedules['fifteen_minutes'])) {
$schedules['fifteen_minutes'] = array(
'interval' => 15 * 60, // 15 минут в секундах
'display' => __('Каждые 15 минут')
);
}
return $schedules;
}
add_filter('cron_schedules', 'wp2_custom_cron_intervals');
Теперь можно использовать этот интервал при планировании события:
wp_schedule_event(time(), 'fifteen_minutes', 'wp2_hourly_event');
Так вы получите более гибкое расписание обновления.
Как отключить WP-Cron и настроить системный cron для надежности
Если сайт большой и важны точные интервалы, WP-Cron может быть недостаточно. В этом случае лучше отключить WP-Cron и настроить системный cron на сервере.
Чтобы отключить WP-Cron, добавьте в wp-config.php:
define('DISABLE_WP_CRON', true);
Далее настройте системный cron (например, на Linux) с командой:
* * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1
Эта команда будет запускать обработку WP-Cron каждую минуту, что гораздо надежнее и стабильнее.
Практические рекомендации и оптимизация задач WP-Cron
WP-Cron лучше использовать для задач, не требующих мгновенного срабатывания и не создающих большую нагрузку. Чтобы избежать проблем:
- Не делайте тяжелые операции внутри WP-Cron — лучше разбивайте задачи на части.
- Используйте transient для кеширования данных, чтобы не обращаться слишком часто к внешним сервисам.
- Логируйте ошибки в отдельный файл для быстрого обнаружения проблем.
- Проверяйте, что задачи не запускаются параллельно, чтобы избежать конфликтов.
Например, для параллельной защиты можно использовать простой механизм блокировки с помощью опции:
function wp2_update_external_data() {
if (get_option('wp2_cron_lock')) {
return; // Задача уже запущена
}
update_option('wp2_cron_lock', true);
// Ваша логика обновления
update_option('wp2_cron_lock', false);
}
Примеры плагинов для управления WP-Cron
Если не хочется писать код самому, можно использовать готовые плагины с расширенным управлением WP-Cron:
- WP Crontrol — позволяет просматривать, запускать, удалять и добавлять задачи WP-Cron из админки.
- Advanced Cron Manager — расширенный менеджер с возможностью редактирования и мониторинга задач.
- Clearfy Pro — среди прочих функций помогает оптимизировать и управлять WP-Cron, устраняя конфликты и лишнюю нагрузку.
Заключение по теме автоматического обновления контента
WP-Cron — мощный инструмент для автоматизации в WordPress, но требует правильной настройки и понимания особенностей. С помощью примеров из статьи вы сможете настроить регулярное обновление данных, избежать типичных ошибок и повысить стабильность работы сайта. При необходимости переходите на системный cron для максимальной надежности и скорости.