Часто возникает задача автоматизировать импорт записей в 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 — он предлагает расширенные возможности и поддержку различных форматов.