Автоматический импорт постов в WordPress из внешних источников — задача, с которой сталкиваются многие владельцы сайтов и блогов. Это удобно для агрегаторов новостей, тематических порталов и сайтов, которые хотят дополнить контент без постоянного ручного добавления. В статье разберём, как реализовать такие импорты с помощью плагинов и кастомного кода, а также какие нюансы учитывать.
Почему нужен автоматический импорт постов в WordPress
Автоматизация контентного наполнения позволяет экономить время и ресурсы. Вместо того, чтобы вручную копировать и вставлять статьи, WordPress может регулярно подтягивать свежие публикации из RSS-лент, новостных API или других источников. Это особенно актуально для нишевых сайтов, которые хотят быстро реагировать на новости и обновления.
Кроме того, правильная организация импорта помогает избежать дублирования и сохраняет корректную структуру данных, что важно для SEO и удобства пользователей.
Плагины для автоматического импорта постов из RSS и API
Существует множество готовых решений, которые помогут быстро настроить импорт. Рассмотрим самые популярные и надежные плагины.
WP All Import
Один из самых мощных и гибких инструментов для импорта данных в WordPress. Поддерживает CSV, XML и RSS. Позволяет настраивать правила импорта и сопоставлять поля.
- Поддержка различных форматов данных.
- Возможность автоматического запуска по расписанию (cron).
- Интеграция с WooCommerce и другими плагинами.
Для настройки автоматического RSS-импорта нужно создать импорт из URL RSS-ленты и задать расписание обновления.
Feedzy RSS Feeds Lite / Pro
Плагин специально создан для импорта RSS-лент в записи WordPress. Позволяет использовать шорткоды для вывода контента, а в Pro-версии — создавать полноценные записи с возможностью настройки полей.
WP RSS Aggregator
Отличный плагин для сбора и отображения RSS-лент. Имеет дополнения для импорта лент в записи, что позволяет полностью автоматизировать процесс.
Пример: автоматический импорт постов из RSS с помощью кода и кастомного WP-Cron
Если вы хотите более тонко контролировать процесс и не зависеть от плагинов, можно реализовать импорт самостоятельно. Ниже пример функции для wpbloger, которая периодически парсит RSS и добавляет новые записи.
function wpbloger_import_rss_posts() {
$rss = fetch_feed('https://example.com/feed/');
if ( is_wp_error($rss) ) {
return;
}
$maxitems = $rss->get_item_quantity(5);
$rss_items = $rss->get_items(0, $maxitems);
foreach ($rss_items as $item) {
$title = $item->get_title();
$link = $item->get_link();
$content = $item->get_content();
// Проверяем, добавлялась ли уже такая запись по ссылке
$existing = get_posts(array(
'post_type' => 'post',
'meta_key' => 'wpbloger_source_link',
'meta_value' => $link,
'posts_per_page' => 1
));
if ($existing) {
continue; // Пропускаем дубликаты
}
// Создаем новую запись
$post_id = wp_insert_post(array(
'post_title' => $title,
'post_content' => $content,
'post_status' => 'publish',
'post_author' => 1,
'post_category' => array(1) // Категория по умолчанию
));
if ($post_id) {
add_post_meta($post_id, 'wpbloger_source_link', $link, true);
}
}
}
// Планируем cron задачу
if (!wp_next_scheduled('wpbloger_import_rss_event')) {
wp_schedule_event(time(), 'hourly', 'wpbloger_import_rss_event');
}
add_action('wpbloger_import_rss_event', 'wpbloger_import_rss_posts');Этот код использует встроенный класс fetch_feed для получения RSS и создает записи только для новых элементов, проверяя по уникальному мета-полю wpbloger_source_link.
Автоматический импорт через REST API внешних сервисов
Иногда источником данных является не RSS, а JSON API сторонних сервисов. Примером может быть импорт новостей из новостных агрегаторов или собственных приложений.
В этом случае нужно написать функцию, которая делает HTTP-запрос через wp_remote_get(), парсит JSON и добавляет посты аналогично примеру с RSS.
function wpbloger_import_api_posts() {
$response = wp_remote_get('https://api.example.com/posts');
if (is_wp_error($response)) {
return;
}
$body = wp_remote_retrieve_body($response);
$data = json_decode($body, true);
if (!$data) {
return;
}
foreach ($data as $item) {
$title = sanitize_text_field($item['title']);
$content = wp_kses_post($item['content']);
$external_id = sanitize_text_field($item['id']);
$existing = get_posts(array(
'post_type' => 'post',
'meta_key' => 'wpbloger_external_id',
'meta_value' => $external_id,
'posts_per_page' => 1
));
if ($existing) continue;
$post_id = wp_insert_post(array(
'post_title' => $title,
'post_content' => $content,
'post_status' => 'publish',
'post_author' => 1
));
if ($post_id) {
add_post_meta($post_id, 'wpbloger_external_id', $external_id, true);
}
}
}
add_action('wpbloger_import_api_event', 'wpbloger_import_api_posts');
if (!wp_next_scheduled('wpbloger_import_api_event')) {
wp_schedule_event(time(), 'hourly', 'wpbloger_import_api_event');
}Учитываем важные аспекты и безопасность при импорте
При автоматическом импорте важно не только получать данные, но и обрабатывать их корректно:
- Проверяйте и очищайте входящие данные, чтобы избежать XSS и других уязвимостей.
- Избегайте дублирования постов, используя уникальные идентификаторы из источника.
- Обрабатывайте возможные ошибки сети и загрузки, чтобы скрипт не приводил к сбоям сайта.
- Настраивайте расписание импорта с учётом нагрузки на сервер.
Для упрощения и расширения функционала можно использовать плагин WP All Import или Feedzy RSS Feeds Pro для более удобного управления импортом без программирования.
Оптимизация и кастомизация импортируемых записей
После успешного импорта часто требуется дополнительно настроить записи:
- Добавить категории и теги автоматически по контенту.
- Устанавливать миниатюры (thumbnails) из внешних изображений.
- Добавлять пользовательские поля и метаданные.
- Проводить SEO-оптимизацию, например, автоматически задавать мета-теги.
Для добавления миниатюр можно использовать такой код в цикле импорта:
function wpbloger_set_post_thumbnail($post_id, $image_url) {
$upload_dir = wp_upload_dir();
$image_data = file_get_contents($image_url);
$filename = basename($image_url);
if(wp_mkdir_p($upload_dir['path'])) {
$file = $upload_dir['path'] . '/' . $filename;
} else {
$file = $upload_dir['basedir'] . '/' . $filename;
}
file_put_contents($file, $image_data);
$wp_filetype = wp_check_filetype($filename, null);
$attachment = array(
'post_mime_type' => $wp_filetype['type'],
'post_title' => sanitize_file_name($filename),
'post_content' => '',
'post_status' => 'inherit'
);
$attach_id = wp_insert_attachment($attachment, $file, $post_id);
require_once(ABSPATH . 'wp-admin/includes/image.php');
$attach_data = wp_generate_attachment_metadata($attach_id, $file);
wp_update_attachment_metadata($attach_id, $attach_data);
set_post_thumbnail($post_id, $attach_id);
}Вызывать эту функцию можно при импорте, передавая URL картинки из источника.