Интеграция новостей из RSS-лент в WordPress — востребованная задача для сайтов, которые хотят оперативно публиковать актуальный контент из внешних источников без ручного копирования. Обычно для этого используют плагины, но иногда требуется более гибкое и легковесное решение без сторонних расширений. В этой статье разберём, как реализовать автоматический импорт новостей из RSS в WordPress с помощью собственного кода.
Почему стоит избегать плагинов для RSS-импорта
Плагины для RSS-агрегации часто оказываются слишком тяжелыми, перегружают сайт лишним функционалом, создают конфликтные ситуации и требуют регулярного обновления. К тому же, при использовании собственного кода вы точно знаете, как работает процесс, и можете адаптировать его под любые нужды. Это особенно актуально для сайтов на WordPress с высокой нагрузкой или специфическим дизайном.
Вместо тяжелых решений мы создадим простое и эффективное решение, которое будет запускаться по расписанию и добавлять новые записи в блог автоматически.
Как работает импорт RSS-ленты в WordPress
Принцип прост: мы парсим RSS-ленту, получаем из неё новые элементы (новости), проверяем, нет ли их уже в базе, и создаём новые записи (post type) с нужными полями. Для парсинга мы воспользуемся встроенным классом SimplePie, который есть в WordPress по умолчанию.
Хранение записей будет в стандартном типе постов post, но вы можете использовать и кастомный тип, если нужно. Важно настроить правильное расписание для запуска задачи, чтобы импорт происходил, например, раз в час или раз в день.
Пример кода для автоматического импорта из RSS
Добавьте следующий код в файл functions.php вашей темы или создайте небольшой плагин с этим функционалом.
function wpsocial_import_rss_feed() {
$feed_url = 'https://example.com/rss-feed.xml'; // Укажите URL вашей RSS-ленты
include_once ABSPATH . WPINC . '/feed.php';
$rss = fetch_feed($feed_url);
if (is_wp_error($rss)) {
error_log('Ошибка загрузки RSS: ' . $rss->get_error_message());
return;
}
$maxitems = $rss->get_item_quantity(10); // Максимум 10 новостей за раз
$rss_items = $rss->get_items(0, $maxitems);
foreach ($rss_items as $item) {
$guid = $item->get_id();
// Проверяем, есть ли уже запись с таким GUID
$existing = new WP_Query(array(
'post_type' => 'post',
'meta_key' => 'wpsocial_rss_guid',
'meta_value' => $guid,
'posts_per_page' => 1
));
if ($existing->have_posts()) {
continue; // Новость уже импортирована
}
// Создаём новую запись
$post_data = array(
'post_title' => wp_strip_all_tags($item->get_title()),
'post_content' => $item->get_content(),
'post_status' => 'publish',
'post_author' => 1,
'post_date' => $item->get_date('Y-m-d H:i:s'),
'post_category' => array(1) // ID категории, можно изменить
);
$post_id = wp_insert_post($post_data);
if ($post_id) {
// Сохраняем GUID для предотвращения дубликатов
update_post_meta($post_id, 'wpsocial_rss_guid', $guid);
// Можно добавить дополнительные метаданные, например ссылку на источник
update_post_meta($post_id, 'wpsocial_rss_link', $item->get_link());
}
}
}
// Планируем задачу по расписанию
add_action('wpsocial_cron_import_rss', 'wpsocial_import_rss_feed');
if (!wp_next_scheduled('wpsocial_cron_import_rss')) {
wp_schedule_event(time(), 'hourly', 'wpsocial_cron_import_rss');
}Подробности работы кода и его настройка
В начале мы указываем URL RSS-ленты. Затем используем функцию fetch_feed() для получения и парсинга. Если возникает ошибка, она записывается в лог ошибок сервера.
Для каждого элемента RSS проверяем, есть ли в базе уже запись с таким уникальным идентификатором (GUID). Это позволяет избежать дублирования публикаций при повторных запусках.
Если записи нет, создаём новую с заголовком, контентом, датой и статусом публикации. В метаданных сохраняем GUID и ссылку на оригинал. Так можно потом легко фильтровать и расширять функционал.
Для запуска этой функции по расписанию используется WP-Cron — встроенный механизм WordPress. В нашем примере импорт будет происходить каждый час. Если хотите изменить период, можно добавить свой интервал через фильтр cron_schedules.
Добавление собственного интервала для WP-Cron
function wpsocial_custom_cron_intervals($schedules) {
$schedules['every_three_hours'] = array(
'interval' => 10800, // 3 часа в секундах
'display' => 'Каждые 3 часа'
);
return $schedules;
}
add_filter('cron_schedules', 'wpsocial_custom_cron_intervals');
// Используйте 'every_three_hours' вместо 'hourly' при планировании события
Дополнительные улучшения и интеграция с плагинами
Если требуется более сложная обработка, можно добавить фильтрацию по ключевым словам, автоматическое назначение рубрик и тегов, загрузку изображений из RSS (enclosure). Например, чтобы скачать и прикрепить миниатюру, можно расширить функцию следующим образом:
function wpsocial_set_post_thumbnail_from_rss($post_id, $item) {
$enclosure = $item->get_enclosure();
if ($enclosure) {
$image_url = $enclosure->get_link();
$image_id = media_sideload_image($image_url, $post_id, null, 'id');
if (!is_wp_error($image_id)) {
set_post_thumbnail($post_id, $image_id);
}
}
}Вызовите эту функцию сразу после создания поста.
Для сайтов с активированной SEO-оптимизацией и социальными мета-тегами можно дополнительно использовать плагин Clearfy Pro — он поможет избежать дублированного контента и оптимизировать автоматические публикации.
Отладка и мониторинг работы импорта
Чтобы контролировать работу скрипта, можно добавить логирование успешных и неудачных попыток импорта. Например, записывать сообщения в файл или использовать error_log. Также полезно выводить статистику последнего запуска в админку или на отдельную страницу.
Если WP-Cron не работает корректно из-за низкой посещаемости сайта, настройте системный cron job на сервере, который будет триггерить wp-cron.php с нужным интервалом.
Итог
Вы получили рабочее, лёгкое и настраиваемое решение для автоматического добавления новостей из RSS в WordPress без плагинов. Такой подход оптимален для сайтов с ограниченными ресурсами и индивидуальными требованиями. При необходимости код всегда можно расширить и интегрировать с другими инструментами.
Для удобства использования и расширения функционала рекомендуем изучить документацию по WP-Cron и классу SimplePie в WordPress, а также попробовать плагины из WPSHOP, если понадобится готовое решение с поддержкой и обновлениями.