В этой статье мы подробно разберем, как создать плагин для WordPress, который автоматически обновляет данные с внешнего источника по расписанию. Такая задача часто встречается при интеграции с API, обновлении курсов валют, новостей или других динамических данных без вмешательства пользователя.
Почему стоит делать автоматическое обновление данных в плагине WordPress
Автоматическое обновление данных позволяет держать сайт актуальным, не загружая администратора рутинной работой. Вместо ручного запуска процессов обновления можно использовать встроенный планировщик задач WordPress — WP-Cron. Это упрощает поддержку и повышает надежность.
Кроме того, если данные приходят из внешних API, регулярные обновления позволяют избежать устаревшей информации и улучшить пользовательский опыт.
Важный момент — корректная работа с WP-Cron, обработка ошибок и логирование, чтобы быстро выявлять проблемы с обновлениями.
Создание плагина с автоматическим обновлением данных: основные шаги
1. Регистрация плагина и создание планировщика WP-Cron
Начнем с создания простого плагина. В корне wp-content/plugins создайте папку wptem-auto-update, а в ней файл wptem-auto-update.php с таким содержимым:
<?php
/**
* Plugin Name: WPTEM Автообновление данных
* Description: Плагин для автоматического обновления данных с внешнего источника
* Version: 1.0
* Author: WPTEM
*/
// Регистрация события планировщика при активации плагина
register_activation_hook(__FILE__, 'wptem_auto_update_activation');
function wptem_auto_update_activation() {
if (!wp_next_scheduled('wptem_auto_update_cron_hook')) {
wp_schedule_event(time(), 'hourly', 'wptem_auto_update_cron_hook');
}
}
// Очистка планировщика при деактивации
register_deactivation_hook(__FILE__, 'wptem_auto_update_deactivation');
function wptem_auto_update_deactivation() {
wp_clear_scheduled_hook('wptem_auto_update_cron_hook');
}
// Хук для выполнения задачи
add_action('wptem_auto_update_cron_hook', 'wptem_auto_update_function');
// Функция обновления данных
function wptem_auto_update_function() {
// Здесь будет логика обновления данных
}
Здесь мы создаем задачу, которая будет запускаться ежечасно. Можно изменить частоту, зарегистрировав кастомный интервал, если нужно чаще или реже.
2. Добавление кастомного интервала для WP-Cron
Если вам нужно, например, запускать обновления каждые 30 минут, добавьте фильтр, расширяющий интервалы:
add_filter('cron_schedules', 'wptem_add_custom_cron_interval');
function wptem_add_custom_cron_interval($schedules) {
if (!isset($schedules['every_thirty_minutes'])) {
$schedules['every_thirty_minutes'] = array(
'interval' => 1800, // 30 минут в секундах
'display' => __('Каждые 30 минут')
);
}
return $schedules;
}
// Измените wp_schedule_event в функции активации:
// wp_schedule_event(time(), 'every_thirty_minutes', 'wptem_auto_update_cron_hook');
3. Логика обновления данных: загрузка и сохранение
Для примера сделаем обновление данных о курсе валют с публичного API. Используем API Центробанка России, который возвращает XML с курсами валют.
Добавим код в функцию wptem_auto_update_function:
function wptem_auto_update_function() {
$url = 'https://www.cbr.ru/scripts/XML_daily.asp';
$response = wp_remote_get($url);
if (is_wp_error($response)) {
error_log('WPTEM Auto Update: Ошибка запроса данных - ' . $response->get_error_message());
return;
}
$body = wp_remote_retrieve_body($response);
if (empty($body)) {
error_log('WPTEM Auto Update: Пустой ответ API');
return;
}
$xml = simplexml_load_string($body);
if ($xml === false) {
error_log('WPTEM Auto Update: Ошибка парсинга XML');
return;
}
$currencies = [];
foreach ($xml->Valute as $valute) {
$currencies[(string)$valute->CharCode] = (float)str_replace(',', '.', (string)$valute->Value);
}
// Сохраняем данные в опции
update_option('wptem_currency_rates', $currencies);
error_log('WPTEM Auto Update: Курсы валют обновлены успешно');
}
Таким образом, плагин получает свежие курсы, парсит их и сохраняет в базу. Эти данные потом можно использовать в шаблонах или коротких кодах.
Использование обновленных данных на сайте
Для вывода данных создадим шорткод, который покажет курс нужной валюты:
add_shortcode('wptem_currency_rate', 'wptem_shortcode_currency_rate');
function wptem_shortcode_currency_rate($atts) {
$atts = shortcode_atts(array('code' => 'USD'), $atts);
$rates = get_option('wptem_currency_rates', []);
$code = strtoupper($atts['code']);
if (isset($rates[$code])) {
return 'Курс ' . esc_html($code) . ': ' . esc_html($rates[$code]);
} else {
return 'Курс валюты не найден';
}
}
<Для вывода курса в записи или на странице используйте шорткод [wptem_currency_rate code="EUR"].
Дополнительные советы по улучшению плагина
Обработка ошибок и уведомления
Для продакшн-плагина желательно реализовать уведомления об ошибках, например, отправку на email администратора или интеграцию с сервисами логирования (Sentry, Loggly). Это поможет быстро реагировать на сбои.
Можно добавить флаг успешного обновления с отметкой времени для отслеживания свежести данных.
Интерфейс в админке для управления обновлениями
Добавьте страницу настроек в админ-панель для управления частотой обновлений, адресом API, возможностью запуска обновления вручную.
Используйте стандартные API WordPress Settings API для создания удобного интерфейса.
Поддержка кэширования и оптимизация
Если данные используются на фронтенде, рекомендуется кэшировать результаты шорткода с помощью Transients API, чтобы избежать частых обращений к базе.
Примеры плагинов, которые можно использовать для автоматизации обновлений
Если не хочется писать все с нуля, можно обратить внимание на плагины, которые облегчают работу с WP-Cron и API:
- Clearfy Pro — оптимизация и управление планировщиком задач WP-Cron.
- WPRemark — для создания отзывов с возможностью автозаполнения, можно адаптировать для обновления данных.
Итоги
Создание плагина с автоматическим обновлением данных в WordPress требует грамотной настройки планировщика WP-Cron, обработки ошибок и удобного интерфейса для контроля. На примере загрузки курсов валют показано, как реализовать базовый функционал, который можно адаптировать под любые внешние API.
Такой подход позволит сделать сайт динамичным, актуальным и снизить нагрузку на администраторов.