Если вам необходимо регулярно импортировать большое количество постов в WordPress из внешних источников через REST API, важно организовать процесс так, чтобы избежать перегрузки сервера и ошибок. В этой статье мы подробно разберём, как реализовать последовательный импорт постов, используя стандартный REST API WordPress и собственный код для управления очередью и обработкой данных.
Преимущества последовательного импорта постов
Импорт большого объёма данных за один запрос часто приводит к таймаутам, ошибкам памяти и другим проблемам. Последовательный импорт позволяет:
- Обрабатывать данные партиями, снижая нагрузку на сервер.
- Отслеживать прогресс и при необходимости возобновлять процесс с места остановки.
- Уменьшить вероятность ошибок из-за превышения лимитов PHP или сервера.
Такой подход особенно полезен для сайтов с ограниченными ресурсами хостинга или при импорте из нестабильных источников.
Подготовка: базовые знания о WordPress REST API
WordPress REST API предоставляет удобный интерфейс для создания, чтения, обновления и удаления записей. Для создания поста через API выполняется POST-запрос на эндпоинт /wp-json/wp/v2/posts с необходимыми данными.
Но при импорте большого количества элементов стоит использовать собственный механизм очереди, чтобы не отправлять все запросы сразу.
Аутентификация и права доступа
Для создания постов через REST API необходимо аутентифицироваться. Обычно используются следующие методы:
- Basic Auth — подходит для локальной разработки, не рекомендуется на продакшене.
- OAuth — более сложный, но безопасный метод.
- Application Passwords (пароли приложений) — удобный способ с WordPress 5.6 и выше.
В примерах ниже мы используем Application Passwords для упрощения.
Создание очереди для последовательного импорта
Идея заключается в том, чтобы разбить список импортируемых постов на небольшие партии и запускать их обработку по очереди. Для этого можно использовать AJAX-запросы из админки или WP-CLI для запуска скрипта из консоли.
Пример кода для разбивки данных и запуска импорта
<?php
// Функция для запуска последовательного импорта
function wpsystem_import_posts_sequentially( array $posts_data, int $batch_size = 10 ) {
$total = count($posts_data);
$batches = array_chunk($posts_data, $batch_size);
foreach ($batches as $index => $batch) {
// Отложенный запуск через wp_schedule_single_event можно добавить здесь
wpsystem_import_posts_batch($batch, $index + 1);
}
}
// Обработка одной партии постов
function wpsystem_import_posts_batch(array $batch, int $batch_number) {
foreach ($batch as $post_data) {
wpsystem_import_single_post($post_data);
}
error_log("Batch {$batch_number} imported successfully.");
}
// Импорт одного поста через REST API
function wpsystem_import_single_post(array $post_data) {
$url = site_url('/wp-json/wp/v2/posts');
$username = 'admin'; // Ваш логин
$application_password = 'xxxx xxxx xxxx xxxx'; // Ваш пароль приложения
$args = [
'headers' => [
'Authorization' => 'Basic ' . base64_encode($username . ':' . $application_password),
'Content-Type' => 'application/json',
],
'body' => json_encode($post_data),
'method' => 'POST',
'timeout' => 20,
];
$response = wp_remote_request($url, $args);
if (is_wp_error($response)) {
error_log('Ошибка импорта поста: ' . $response->get_error_message());
return false;
}
$code = wp_remote_retrieve_response_code($response);
if ($code !== 201) {
error_log('Ошибка импорта поста, код ответа: ' . $code);
return false;
}
return true;
}
?>
В этом примере мы разбиваем массив с данными постов на партии по 10 элементов и последовательно вызываем функцию импорта каждого поста через REST API.
Интеграция с WP-CLI для удобства запуска
Если вы предпочитаете запускать импорт из командной строки — WP-CLI отлично подходит для этого. Создадим кастомную команду для запуска импорта в партиях:
<?php
if (defined('WP_CLI') && WP_CLI) {
class WPSystem_Import_CLI {
public function run($args, $assoc_args) {
$file = $assoc_args['file'] ?? '';
if (!$file || !file_exists($file)) {
WP_CLI::error('Укажите корректный путь к JSON-файлу с постами');
}
$json = file_get_contents($file);
$posts_data = json_decode($json, true);
if (!$posts_data) {
WP_CLI::error('Неверный формат JSON');
}
$batch_size = (int)($assoc_args['batch'] ?? 10);
$total = count($posts_data);
$batches = array_chunk($posts_data, $batch_size);
foreach ($batches as $index => $batch) {
WP_CLI::log("Импорт партии #" . ($index + 1));
foreach ($batch as $post_data) {
wpsystem_import_single_post($post_data);
}
}
WP_CLI::success('Импорт завершён успешно!');
}
}
WP_CLI::add_command('wpsystem-import', 'WPSystem_Import_CLI');
}
?>
Запуск из терминала:
wp wpsystem-import --file=path/to/posts.json --batch=15
Таким образом вы можете контролировать размер партий и видеть прогресс прямо в консоли.
Примеры полезных плагинов для управления импортом и очередями
Если хотите ускорить разработку и добавить удобный интерфейс, можно использовать готовые решения:
- WP All Import — мощный плагин для импорта любых данных с поддержкой CSV, XML и API. Позволяет настраивать расписания и фильтры.
- WP Crontrol — для управления задачами по расписанию в WordPress, удобно для организации отложенного импорта.
- Clearfy Pro — оптимизирует работу вашего сайта и может помочь с управлением запросами и производительностью при массовом импорте.
При необходимости можно комбинировать собственные скрипты с этими плагинами для максимального удобства.
Рекомендации по улучшению производительности и безопасности
Чтобы импорт прошёл гладко и безопасно, учтите следующие моменты:
- Используйте nonce и проверку прав пользователей при запуске импортов в админке.
- Проверяйте и валидируйте данные до отправки на сервер.
- Минимизируйте нагрузку, ограничивая количество одновременно обрабатываемых постов.
- Ведите логирование ошибок и успешных операций для диагностики.
- Используйте транзакции или временное кеширование при сложных операциях с метаполями и таксономиями.
Заключение по теме последовательного импорта
Последовательный импорт постов через REST API — эффективный способ избежать проблем при массовом добавлении контента в WordPress. Использование собственных функций и WP-CLI даёт гибкость и контроль, а интеграция с плагинами ускоряет разработку и улучшает интерфейс.
Для более детальной настройки и расширения функционала вы можете посмотреть решения на WPSHOP.RU, где представлены удобные инструменты для работы с WordPress.