Автоматический импорт событий в WordPress — частая задача для сайтов с календарями, мероприятиями и новостями. Вместо ручного добавления событий, можно настроить автоматическую синхронизацию через REST API с внешним сервисом или собственным источником данных. В этой статье мы подробно разберем, как создать такой механизм, используя возможности WordPress и примеры кода.
Что такое автоматический импорт событий и зачем он нужен
Автоматический импорт событий — процесс, при котором данные о событиях загружаются из внешнего источника и добавляются в базу WordPress без участия пользователя. Это удобно для сайтов, которые получают данные от партнёров, агрегаторов или собственного сервиса.
Преимущества такого подхода:
- Экономия времени на ручном вводе
- Минимизация ошибок при добавлении
- Обновление событий в режиме реального времени
- Гибкость и масштабируемость
Для реализации можно использовать REST API WordPress и cron-задачи для регулярного запуска импорта.
Создаем кастомный тип записи «События»
Сначала создадим собственный тип записи для событий. Это позволит структурировать данные и использовать все преимущества WordPress для кастомного контента.
function wpsystem_register_event_post_type() {
$labels = array(
'name' => 'События',
'singular_name' => 'Событие',
'add_new' => 'Добавить событие',
'add_new_item' => 'Добавить новое событие',
'edit_item' => 'Редактировать событие',
'new_item' => 'Новое событие',
'view_item' => 'Просмотр события',
'search_items' => 'Поиск событий',
'not_found' => 'События не найдены',
'not_found_in_trash' => 'События не найдены в корзине',
'menu_name' => 'События'
);
$args = array(
'labels' => $labels,
'public' => true,
'has_archive' => true,
'supports' => array('title', 'editor', 'custom-fields'),
'show_in_rest' => true,
'rewrite' => array('slug' => 'events'),
);
register_post_type('wpsystem_event', $args);
}
add_action('init', 'wpsystem_register_event_post_type');После добавления кода в functions.php или в свой плагин появится новый тип записи «События» с поддержкой REST API.
Структура данных для импорта и поля мета
Предположим, что внешний API возвращает события в формате JSON с такими данными: название, описание, дата начала, дата окончания, место проведения.
Для хранения даты и места создадим мета-поля:
wpsystem_event_start— дата и время началаwpsystem_event_end— дата и время окончанияwpsystem_event_location— место проведения
Добавим примитивное сохранение мета-полей через хук:
function wpsystem_save_event_meta($post_id) {
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
if (!isset($_POST['wpsystem_event_nonce']) || !wp_verify_nonce($_POST['wpsystem_event_nonce'], basename(__FILE__))) return;
if (isset($_POST['wpsystem_event_start'])) {
update_post_meta($post_id, 'wpsystem_event_start', sanitize_text_field($_POST['wpsystem_event_start']));
}
if (isset($_POST['wpsystem_event_end'])) {
update_post_meta($post_id, 'wpsystem_event_end', sanitize_text_field($_POST['wpsystem_event_end']));
}
if (isset($_POST['wpsystem_event_location'])) {
update_post_meta($post_id, 'wpsystem_event_location', sanitize_text_field($_POST['wpsystem_event_location']));
}
}
add_action('save_post_wpsystem_event', 'wpsystem_save_event_meta');Реализация функции импорта событий из внешнего API
Создадим функцию, которая будет обращаться к API, получать JSON с событиями, проверять их наличие в базе по уникальному идентификатору и создавать или обновлять записи.
function wpsystem_import_events_from_api() {
$api_url = 'https://example.com/api/events'; // Замените на реальный URL
$response = wp_remote_get($api_url);
if (is_wp_error($response)) return;
$body = wp_remote_retrieve_body($response);
$events = json_decode($body, true);
if (empty($events)) return;
foreach ($events as $event) {
$event_id_external = sanitize_text_field($event['id']);
$existing = new WP_Query(array(
'post_type' => 'wpsystem_event',
'meta_key' => 'wpsystem_event_external_id',
'meta_value' => $event_id_external,
'posts_per_page' => 1
));
$post_data = array(
'post_title' => sanitize_text_field($event['title']),
'post_content' => wp_kses_post($event['description']),
'post_status' => 'publish',
'post_type' => 'wpsystem_event',
);
if ($existing->have_posts()) {
$existing->the_post();
$post_data['ID'] = get_the_ID();
wp_update_post($post_data);
$post_id = get_the_ID();
wp_reset_postdata();
} else {
$post_id = wp_insert_post($post_data);
if ($post_id) {
update_post_meta($post_id, 'wpsystem_event_external_id', $event_id_external);
}
}
if ($post_id) {
update_post_meta($post_id, 'wpsystem_event_start', sanitize_text_field($event['start_date']));
update_post_meta($post_id, 'wpsystem_event_end', sanitize_text_field($event['end_date']));
update_post_meta($post_id, 'wpsystem_event_location', sanitize_text_field($event['location']));
}
}
}В этом примере мы используем meta_key 'wpsystem_event_external_id' для связи с внешним событием и обновляем существующие записи, чтобы избежать дублирования.
Настройка автоматического запуска импорта через WP-Cron
Чтобы импорт происходил автоматически, добавим планировщик задач:
function wpsystem_schedule_event_import() {
if (!wp_next_scheduled('wpsystem_import_events_cron')) {
wp_schedule_event(time(), 'hourly', 'wpsystem_import_events_cron');
}
}
add_action('wp', 'wpsystem_schedule_event_import');
add_action('wpsystem_import_events_cron', 'wpsystem_import_events_from_api');Этот код запускает импорт каждый час. Можно менять периодичность, добавив кастомный интервал через фильтр cron_schedules.
Добавление кастомного интервала для WP-Cron
Например, для запуска каждые 30 минут:
function wpsystem_custom_cron_intervals($schedules) {
$schedules['every_thirty_minutes'] = array(
'interval' => 1800,
'display' => 'Каждые 30 минут'
);
return $schedules;
}
add_filter('cron_schedules', 'wpsystem_custom_cron_intervals');И изменить расписание на:
wp_schedule_event(time(), 'every_thirty_minutes', 'wpsystem_import_events_cron');Использование плагинов для расширения функционала импорта
Если хочется упростить задачу или добавить интерфейс, можно использовать плагины:
- WP All Import — мощный инструмент для импорта из XML, CSV, JSON. Позволяет создавать шаблоны импорта и обновлять записи.
- WP Crontrol — позволяет управлять WP-Cron задачами из админки.
- Clearfy Pro — ускоряет работу сайта и оптимизирует REST API, что важно при импорте больших объемов данных.
Для интеграции с WP All Import можно настроить автоматическую загрузку файла с API и запуск импорта по расписанию.
Обработка ошибок и логирование импорта
При автоматическом импорте важно отслеживать ошибки. Рекомендуется добавить логирование в файл или использовать класс WP_Error.
function wpsystem_import_events_from_api() {
$api_url = 'https://example.com/api/events';
$response = wp_remote_get($api_url);
if (is_wp_error($response)) {
error_log('WPSYSTEM Import Error: ' . $response->get_error_message());
return;
}
// Остальной код ...
}Также можно отправлять уведомления администратору о статусе импорта через email.
Вывод событий с мета-полями в шаблоне
Для отображения событий на сайте нужно вывести данные с мета-полями. Пример простого шаблона:
$args = array(
'post_type' => 'wpsystem_event',
'posts_per_page' => 10,
'meta_key' => 'wpsystem_event_start',
'orderby' => 'meta_value',
'order' => 'ASC'
);
$events = new WP_Query($args);
if ($events->have_posts()) {
while ($events->have_posts()) {
$events->the_post();
$start = get_post_meta(get_the_ID(), 'wpsystem_event_start', true);
$end = get_post_meta(get_the_ID(), 'wpsystem_event_end', true);
$location = get_post_meta(get_the_ID(), 'wpsystem_event_location', true);
echo '<h3>' . get_the_title() . '</h3>';
echo '<p>Дата: ' . esc_html($start) . ' - ' . esc_html($end) . '</p>';
echo '<p>Место: ' . esc_html($location) . '</p>';
echo '<div>' . get_the_content() . '</div>';
}
wp_reset_postdata();
} else {
echo '<p>Событий не найдено.</p>';
}Такой вывод можно вставить в шаблон страницы или виджет.
Итог
Автоматический импорт событий через REST API в WordPress — эффективное решение для актуализации контента без ручного труда. Мы создали кастомный тип записи, описали мета-поля, написали функцию импорта с проверкой дубликатов, настроили WP-Cron для регулярного запуска и рассмотрели использование плагинов и логирования.
Если хотите расширить функционал, можно добавить фильтры, интеграцию с календарями, уведомления и многое другое. Для примера и удобства управления рекомендуем использовать плагины WP All Import и Clearfy Pro.