fetch_feed() в WordPress: описание, синтаксис и примеры использования

FETCH_FEED() │ WP 2.8.0

Эта функция помогает создать объект SimplePie, который основан на RSS или Atom ленте с указанного URL.

Хуки функции

  • wp_feed_cache_transient_lifetime — этот хук позволяет настроить время кэширования ленты.
  • wp_feed_options — предоставляет возможность изменить настройки перед получением ленты.

Возвращаемое значение

Функция возвращает либо объект SimplePieSimplePie, если всё прошло успешно, либо объект WP_Error, если произошла ошибка.

Использование

Синтаксис

fetch_feed( $url );

Параметры

  • $url (string|array) (обязательный) — URL ленты, которую нужно получить. Если передать массив URL, ленты будут объединены с помощью функции многолепестковой ленты SimplePie.

Примеры использования

Пример 1: Получаем последние 5 постов из RSS-ленты внешнего сайта

// Подключаем функцию fetch_feed(), обычно это не требуется
include_once ABSPATH . WPINC . '/feed.php';

// Получаем ленту и создаём объект SimplePie из неё.
$rss = fetch_feed('http://blog.ru/feed');

// Проверяем, успешно ли создан объект
if (!is_wp_error($rss)) {
    // Указываем, что хотим вывести максимум 5 постов из ленты
    $maxitems = $rss->get_item_quantity(5);
    // Создаём массив всех постов, начиная с первого поста
    $rss_items = $rss->get_items(0, $maxitems);
}
?>

Пример 2: Получаем 5 постов из RSS-ленты третьего сайта

include_once ABSPATH . WPINC . '/feed.php';

$rss = fetch_feed('http://mysite.com/feed/');

$rss_items = $rss->get_items(0, $rss->get_item_quantity(5));

if (!$rss_items) {
    echo 'Нет постов';
} else {
    foreach ($rss_items as $item) {
        echo '

' . $item->get_title() . '

'; } }

Пример 3: Управление временем кэширования ленты

Результаты получения ленты кэшируются на 12 часов. Для изменения этого времени можно использовать хук wp_feed_cache_transient_lifetime.

add_filter('wp_feed_cache_transient_lifetime', 'speed_up_feed', 10, 2);

function speed_up_feed($interval, $url) {
    if ('http://myexample.com/feed/' === $url) {
        return 3600; // 1 час
    }
    return $interval;
}

Пример 4: Отключение кэширования во время разработки

При манипуляциях с лентами нужно отключить кэширование, иначе это будет мешать.

// Отключаем кэширование лент только если включён режим разработки WP_DEBUG
if (defined('WP_DEBUG') && WP_DEBUG) {
    add_action('wp_feed_options', function(&$feed) {
        $feed->enable_cache(false);
    });
}

Важно: Не забудьте отключить этот код на рабочем сайте. Он может значительно увеличить скорость загрузки страниц.

Пример 5: Очистка кэша всех лент в WordPress

Для выполнения кода добавьте параметр ?clear_feeds_cache к URL.

// Очищаем кэш всех лент в WordPress
if (isset($_GET['clear_feeds_cache'])) {
    global $wpdb;
    $cleared = $wpdb->query("DELETE FROM $wpdb->options WHERE option_name LIKE '_transient%_feed_%'");
    die(var_dump($cleared));
}

Примечание: Если на сайте включено кэширование объектов, данный код не сработает.

Пример 6: Как разобрать ленту из локального файла

В большинстве случаев библиотека SimplePie позволяет передавать локальный файл, но в WordPress эта функция отключена. Это можно исправить с помощью хука wp_feed_options.

$feed_path = PROJECT_ROOT_DIR . '/_tmp/feed.xml';

add_action('wp_feed_options', 'change_simple_pie_options', 10, 2);
function change_simple_pie_options($simplepie, $url) {
    class TEMP_SimplePie_File extends SimplePie_File {}

    $simplepie->set_file_class(TEMP_SimplePie_File::class);
    $simplepie->set_cache_duration(0);
}

$simplepie = fetch_feed($feed_path);
$items = $simplepie->get_items(0, 10);
foreach ($items as $item) {
    echo $item->get_title() . "n";
}

Пример 7: Как разобрать ленту, если у нас уже есть XML-содержимое

Если вы получили XML-содержимое ленты, например, с помощью wp_remote_get(), то можно написать свою функцию для разбора содержимого.

/**
 * Парсит XML ленту и возвращает объект {@see SimplePieSimplePie()}.
 */
function wpkama_parse_feed(string $xml): SimplePieSimplePie|WP_Error {
    if (!class_exists(SimplePieSimplePie::class, false)) {
        require_once ABSPATH . WPINC . '/class-simplepie.php';
    }
    if (!class_exists(WP_SimplePie_Sanitize_KSES::class, false)) {
        require_once ABSPATH . WPINC . '/class-wp-simplepie-sanitize-kses.php';
    }

    $feed = new SimplePieSimplePie();
    $feed->get_registry()->register(SimplePieSanitize::class, WP_SimplePie_Sanitize_KSES::class, true);

    $feed->set_raw_data($xml);
    $feed->enable_cache(false);
    $feed->init();
    $feed->set_output_encoding(get_bloginfo('charset'));

    if ($feed->error()) {
        return new WP_Error('simplepie-error', $feed->error());
    }

    return $feed;
}

Изменения

Функция была добавлена в WordPress версии 2.8.0.

Аналогичные функции

  • bloginfo_rss()
  • get_the_title_rss()
  • the_excerpt_rss()

Поддерживающие функции

  • array_is_list()
  • wp_die()
  • wp_html_excerpt()

Теперь вы готовы работать с RSS лентами в WordPress! Удачи!

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *