Как создать автоматический импорт событий в WordPress через REST API

Автоматический импорт событий в 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.

Как использовать фильтры WooCommerce для изменения цены товара
08.03.2026
Оценка эффективности плагинов WordPress: как выбрать и проверить
05.02.2026
Как создать собственный объект виджета в WordPress с примерами кода
11.12.2025
Как добавить автоматический режим работы для плагина WordPress
25.01.2026
Оптимизация базы данных WordPress: эффективные методы и примеры кода
23.11.2025