Как создать автоматический импорт постов из внешнего JSON в WordPress

Часто возникает задача автоматизировать импорт записей в WordPress из внешних систем, которые предоставляют данные в формате JSON. Это может быть новостной агрегатор, каталог товаров, блог-платформа или любое другое API. В этой статье подробно разберём, как создать автоматический импорт постов из внешнего JSON, используя собственный плагин и WP Cron для регулярного обновления, а также рассмотрим несколько полезных плагинов для облегчения задачи.

Почему стоит автоматизировать импорт постов из JSON

Автоматизация импорта экономит время и сводит к минимуму ручной ввод данных. JSON — наиболее популярный формат обмена данными через API, его легко парсить в PHP и работать с ним в WordPress. Такой подход позволяет интегрировать внешние источники контента, поддерживать сайт свежим и актуальным без постоянного участия администратора.

Кроме того, автоматический импорт помогает синхронизировать контент с другими системами, например, с CRM или новостными сервисами, что особенно полезно в бизнес-проектах и крупных порталах.

Обзор плагинов для импорта JSON в WordPress

Перед тем как писать собственное решение, можно рассмотреть готовые плагины, которые облегчают задачу:

  • WP All Import — мощный инструмент с поддержкой различных форматов, в том числе JSON. Позволяет настраивать импорт через визуальный интерфейс, но требует платной версии для сложных задач.
  • WP Ultimate CSV Importer — поддерживает CSV и JSON, есть бесплатная версия с базовым функционалом.
  • WPBook Importer — специализированный плагин от WPShop, оптимизированный для автоматического импорта данных с расширенными настройками и поддержкой кастомных типов записей.

Если задача стандартная, один из этих плагинов может решить её быстро. Но для полной гибкости и понимания процесса полезно создать собственный скрипт.

Создание плагина для автоматического импорта из JSON

Рассмотрим пример создания простого плагина, который по расписанию будет загружать JSON с внешнего API и создавать новые записи в WordPress.

Создаём структуру плагина

Создайте папку wpbook-json-importer в wp-content/plugins/. Внутри создайте файл wpbook-json-importer.php со следующим содержимым:

<?php
/**
 * Plugin Name: WPBook JSON Importer
 * Description: Автоматический импорт постов из внешнего JSON
 * Version: 1.0
 * Author: WPBook
 */

// Регистрируем крон задачу при активации
register_activation_hook(__FILE__, 'wpbook_activate_json_importer');
function wpbook_activate_json_importer() {
    if (!wp_next_scheduled('wpbook_json_import_event')) {
        wp_schedule_event(time(), 'hourly', 'wpbook_json_import_event');
    }
}

// Удаляем крон задачу при деактивации
register_deactivation_hook(__FILE__, 'wpbook_deactivate_json_importer');
function wpbook_deactivate_json_importer() {
    wp_clear_scheduled_hook('wpbook_json_import_event');
}

// Хук для импорта
add_action('wpbook_json_import_event', 'wpbook_import_posts_from_json');

function wpbook_import_posts_from_json() {
    $json_url = 'https://example.com/api/posts.json'; // URL внешнего JSON

    $response = wp_remote_get($json_url);

    if (is_wp_error($response)) {
        error_log('WPBook JSON Importer: Ошибка загрузки JSON - ' . $response->get_error_message());
        return;
    }

    $body = wp_remote_retrieve_body($response);
    $data = json_decode($body, true);

    if (json_last_error() !== JSON_ERROR_NONE) {
        error_log('WPBook JSON Importer: Ошибка декодирования JSON - ' . json_last_error_msg());
        return;
    }

    if (!is_array($data)) {
        error_log('WPBook JSON Importer: Некорректный формат данных');
        return;
    }

    foreach ($data as $item) {
        // Проверяем обязательные поля
        if (empty($item['title']) || empty($item['content'])) {
            continue;
        }

        // Проверяем, есть ли уже такой пост по уникальному идентификатору внешнего API
        $existing = get_posts([
            'meta_key' => 'wpbook_external_id',
            'meta_value' => sanitize_text_field($item['id']),
            'post_type' => 'post',
            'post_status' => 'publish',
            'numberposts' => 1
        ]);

        if ($existing) {
            // Можно обновлять запись, если требуется
            continue;
        }

        // Создаём новый пост
        $post_id = wp_insert_post([
            'post_title' => sanitize_text_field($item['title']),
            'post_content' => wp_kses_post($item['content']),
            'post_status' => 'publish',
            'post_author' => 1,
            'post_type' => 'post'
        ]);

        if (!is_wp_error($post_id)) {
            update_post_meta($post_id, 'wpbook_external_id', sanitize_text_field($item['id']));
        }
    }
}

Объяснение кода

Этот плагин при активации запускает крон-задачу, которая каждый час обращается к указанному URL, получает JSON, парсит его и добавляет новые записи в блог. Важно, что перед созданием поста проверяется наличие уже импортированной записи по уникальному внешнему ID, чтобы избежать дублирования.

В реальном проекте стоит расширить функционал, например, добавлять категории, теги, настраивать кастомные типы записей, обрабатывать изображения и т.д.

Расширение функционала: импорт изображений и кастомных полей

Для создания полноценного импорта часто требуется загружать связанные изображения и записывать дополнительные поля. Рассмотрим, как добавить импорт миниатюры и произвольных полей.

Импорт миниатюры

Если в JSON есть URL изображения, например, image_url, можно скачать файл и прикрепить его к посту как миниатюру.

function wpbook_set_post_thumbnail_from_url($post_id, $image_url) {
    require_once(ABSPATH . 'wp-admin/includes/file.php');
    require_once(ABSPATH . 'wp-admin/includes/media.php');
    require_once(ABSPATH . 'wp-admin/includes/image.php');

    $tmp = download_url($image_url);

    if (is_wp_error($tmp)) {
        return false;
    }

    $file_array = [];
    $file_array['name'] = basename($image_url);
    $file_array['tmp_name'] = $tmp;

    $id = media_handle_sideload($file_array, $post_id);

    if (is_wp_error($id)) {
        @unlink($file_array['tmp_name']);
        return false;
    }

    set_post_thumbnail($post_id, $id);
    return true;
}

В основной функции импорта после создания поста вызовите эту функцию:

if (!empty($item['image_url'])) {
    wpbook_set_post_thumbnail_from_url($post_id, esc_url_raw($item['image_url']));
}

Добавление кастомных полей

Если JSON содержит дополнительные данные, их можно сохранить в мета-поля:

if (!empty($item['custom_field'])) {
    update_post_meta($post_id, 'wpbook_custom_field', sanitize_text_field($item['custom_field']));
}

Запуск импорта вручную и отладка

Для отладки полезно дать возможность запускать импорт вручную без ожидания крон-задачи. Добавим в плагин админ-страницу с кнопкой для старта импорта.

Добавьте в плагин:

add_action('admin_menu', 'wpbook_json_importer_menu');
function wpbook_json_importer_menu() {
    add_submenu_page('tools.php', 'Импорт JSON', 'Импорт JSON', 'manage_options', 'wpbook-json-importer', 'wpbook_json_importer_page');
}

function wpbook_json_importer_page() {
    if (isset($_POST['wpbook_import_now'])) {
        wpbook_import_posts_from_json();
        echo '<div class="updated notice">Импорт выполнен.</div>';
    }
    echo '<h2>Ручной импорт JSON</h2>';
    echo '<form method="post"><input type="submit" name="wpbook_import_now" class="button button-primary" value="Запустить импорт сейчас" /></form>';
}

Выводы и рекомендации

Автоматический импорт записей из внешнего JSON — мощный инструмент для интеграции сторонних систем с WordPress. В статье мы рассмотрели пример создания собственного плагина с использованием WP Cron, работу с JSON, проверку на дублирование, импорт изображений и мета-полей.

Для более сложных проектов рекомендуем обратить внимание на WPBook Importer от WPShop — он предлагает расширенные возможности и поддержку различных форматов.

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
Как использовать хук в WordPress для динамического изменения meta title
14.02.2026
Как избежать проблем с пересекающимися таксономиями в WooCommerce
29.04.2026
Как удалить неиспользуемые шорткоды в WordPress: эффективные методы и примеры кода
18.02.2026
Как удалить неиспользуемые изображения в WordPress и освободить место
23.12.2025
Как использовать pre_get_posts для исключения категории из главной ленты WordPress
22.04.2026
×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее