Автоматический импорт контента из внешних источников — частая задача для сайтов на WordPress, особенно если нужно регулярно обновлять блог или новостной раздел свежими публикациями. В этой статье мы рассмотрим, как создать собственный плагин для автоматического импорта постов из внешнего API или RSS-ленты с помощью встроенных инструментов WordPress и PHP.
Почему стоит создавать собственный импортёр, а не использовать готовые плагины
Готовые решения часто бывают громоздкими, с лишними функциями и не всегда подходят под конкретные задачи. Создав свой плагин, вы получите точечное решение, которое легко настраивать и расширять под нужды проекта. Кроме того, это отличный способ глубже понять работу с API, WP_Query, WP-Cron и функциями для работы с контентом в WordPress.
Мы также рассмотрим, как автоматически запускать импорт с помощью WP-Cron, чтобы обновления происходили регулярно без вашего участия.
Основные шаги создания плагина автоматического импорта
Для начала определимся с источником данных. Это может быть RSS-лента, JSON API или XML. Принцип работы примерно одинаков:
- Получить данные из внешнего источника;
- Обработать и распарсить их;
- Проверить, существуют ли уже такие записи в базе, чтобы не создавать дубликаты;
- Создать новые посты или обновить существующие;
- Запланировать регулярный запуск импорта через WP-Cron.
Пример: импорт постов из RSS-ленты
RSS — один из самых простых форматов для импорта. WordPress имеет встроенную функцию fetch_feed() из библиотеки SimplePie для работы с RSS.
function wpbook_import_posts_from_rss() {
include_once( ABSPATH . WPINC . '/feed.php' );
$rss = fetch_feed('https://example.com/feed/');
if (is_wp_error($rss)) {
return;
}
$maxitems = $rss->get_item_quantity(10);
$rss_items = $rss->get_items(0, $maxitems);
foreach ($rss_items as $item) {
$title = $item->get_title();
$link = $item->get_link();
$content = $item->get_content();
$pubDate = $item->get_date('Y-m-d H:i:s');
// Проверяем, есть ли пост с таким URL (сохраним ссылку в метаполе)
$existing = new WP_Query(array(
'post_type' => 'post',
'meta_key' => 'wpbook_import_source_url',
'meta_value' => $link,
'posts_per_page' => 1
));
if ($existing->have_posts()) {
continue; // Пост уже импортирован
}
// Создаем новый пост
$postarr = array(
'post_title' => $title,
'post_content' => $content,
'post_status' => 'publish',
'post_date' => $pubDate,
'post_author' => 1, // ID автора
);
$post_id = wp_insert_post($postarr);
if (!is_wp_error($post_id)) {
add_post_meta($post_id, 'wpbook_import_source_url', $link, true);
}
}
}Регулярный запуск импорта через WP-Cron
Чтобы импорт запускался автоматически, добавим расписание и событие:
function wpbook_schedule_rss_import() {
if (!wp_next_scheduled('wpbook_rss_import_event')) {
wp_schedule_event(time(), 'hourly', 'wpbook_rss_import_event');
}
}
add_action('wp', 'wpbook_schedule_rss_import');
add_action('wpbook_rss_import_event', 'wpbook_import_posts_from_rss');Этот код запускает импорт каждый час. Вы можете изменить 'hourly' на 'twicedaily' или 'daily' или добавить своё собственное расписание через фильтр cron_schedules.
Импорт из JSON API
Если источник — API с JSON-ответом, можно использовать wp_remote_get() для получения данных и json_decode() для их обработки.
function wpbook_import_posts_from_api() {
$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 (empty($data) || !is_array($data)) {
return;
}
foreach ($data as $item) {
$title = sanitize_text_field($item['title']);
$content = wp_kses_post($item['content']);
$pubDate = sanitize_text_field($item['date']);
$source_id = sanitize_text_field($item['id']);
// Проверяем, есть ли пост с таким source_id
$existing = new WP_Query(array(
'post_type' => 'post',
'meta_key' => 'wpbook_import_source_id',
'meta_value' => $source_id,
'posts_per_page' => 1
));
if ($existing->have_posts()) {
continue; // Уже импортирован
}
$postarr = array(
'post_title' => $title,
'post_content' => $content,
'post_status' => 'publish',
'post_date' => $pubDate,
'post_author' => 1,
);
$post_id = wp_insert_post($postarr);
if (!is_wp_error($post_id)) {
add_post_meta($post_id, 'wpbook_import_source_id', $source_id, true);
}
}
}Обработка ошибок и логирование
При работе с импортом важно логировать ошибки и сбои, чтобы не пропустить проблемы. Можно использовать стандартный лог WordPress или создавать свой в файле.
Пример простой функции логирования в файл:
function wpbook_log($message) {
$logfile = WP_CONTENT_DIR . '/wpbook-import.log';
$date = date('Y-m-d H:i:s');
error_log("[$date] $message\n", 3, $logfile);
}Вызывайте wpbook_log('Сообщение') при ошибках или важных событиях.
Как избежать дубликатов и обновлять уже импортированные записи
Чтобы не создавать дубликаты, мы сохраняем уникальный идентификатор источника в метаполе поста и проверяем его при каждом запуске. Если запись уже есть, можно дополнительно реализовать обновление содержимого поста, если оно изменилось.
Пример кода для обновления поста:
if ($existing->have_posts()) {
$existing_post_id = $existing->posts[0]->ID;
$postarr = array(
'ID' => $existing_post_id,
'post_title' => $title,
'post_content' => $content,
'post_date' => $pubDate,
);
wp_update_post($postarr);
continue;
}Плагины и инструменты для расширения возможностей импорта
Если вы хотите расширить функционал, рассмотрите интеграцию с такими плагинами, как Clearfy Pro для оптимизации работы сайта после импорта или WPRemark для управления комментариями к импортированным постам.
Также полезно использовать плагины кэширования и оптимизации, чтобы импорт не замедлял работу сайта.
Итог
Создание собственного автоматического импортера постов в WordPress — это практическая задача, решающая проблему регулярного обновления контента. Используя примеры из статьи, вы можете реализовать импорт из RSS и JSON API, настроить регулярный запуск через WP-Cron и обеспечить отсутствие дубликатов. Такой подход гибок и хорошо масштабируется под любые требования.