fetch_feed

Получает внешний фид и разбирает его на данные (парсит его).

Функция нужна, чтобы получить RSS фид в виде SimplePie объекта и закэшировать результат.

Для получения и парсинга фида fetch_feed() использует популярный класс SimplePie. Фид кэшируется и кэш в последствии обновляется каждые 12 часов.

Данные кэшируются в базу данных во временные опции. Если установлен плагин постоянного объектного кэширования, то функция будет кэшировать не в БД, а в хранилище для объектного кэша.

Есть очень похожая функция fetch_rss( $url )
Хуки из функции:
wp_feed_cache_transient_lifetime
wp_feed_options
Возвращает

Объект SimplePie или WP_Error. SimplePie объект данных о фиде или объект WP_Error в случае ошибки.

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

$feed = fetch_feed( $uri );
$uri(строка) (обязательный)
Ссылка (УРЛ) на фид который нужно получить. В результате по этой ссылке будет получен создан объект (массив) SimplePie.
По умолчанию: нет

Примеры

#1. Получим последние 5 записей из фида у внешнего сайта

Пример, который получает и выводит на экран ссылки на существующий RSS фид. В примере мы ограничиваем вывод только 5-ю последними записями в фиде.

include_once(ABSPATH . WPINC . '/feed.php');
$rss = fetch_feed('http://mysite.ru/feed/');
$rss_items = $rss->get_items( 0, $rss->get_item_quantity(5) );
if ( ! $rss_items ) {
	echo 'no items';
} else {
	foreach ( $rss_items as $item ) {
		echo '<p><a href="' . $item->get_permalink() . '">' . $item->get_title() . '</a></p>';
	}
}

#3 Управление временем жизни кэша

Результат получения фида кэшируется на 12 часов. Чтобы изменить время кэша для функции fetch_feed(), нужно использовать хук 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://mysite.ru/feed/' == $url )
		return 3600; // 1 час

	return $interval;
}

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

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

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


ВАЖНО! Обязательно отключите эту код на рабочем сайте. Потому что он может увеличить нагрузку на сервер в разы!

Заметки

Подробнее о методах класса SimplePie читайте в документации (англ.).

Код из


wp-includes/feed.php

WP 4.7.2

<?php
function fetch_feed( $url ) {
	if ( ! class_exists( 'SimplePie', false ) ) {
		require_once( ABSPATH . WPINC . '/class-simplepie.php' );
	}

	require_once( ABSPATH . WPINC . '/class-wp-feed-cache.php' );
	require_once( ABSPATH . WPINC . '/class-wp-feed-cache-transient.php' );
	require_once( ABSPATH . WPINC . '/class-wp-simplepie-file.php' );
	require_once( ABSPATH . WPINC . '/class-wp-simplepie-sanitize-kses.php' );

	$feed = new SimplePie();

	$feed->set_sanitize_class( 'WP_SimplePie_Sanitize_KSES' );
	// We must manually overwrite $feed->sanitize because SimplePie's
	// constructor sets it before we have a chance to set the sanitization class
	$feed->sanitize = new WP_SimplePie_Sanitize_KSES();

	$feed->set_cache_class( 'WP_Feed_Cache' );
	$feed->set_file_class( 'WP_SimplePie_File' );

	$feed->set_feed_url( $url );
	/** This filter is documented in wp-includes/class-wp-feed-cache-transient.php */
	$feed->set_cache_duration( apply_filters( 'wp_feed_cache_transient_lifetime', 12 * HOUR_IN_SECONDS, $url ) );
	/**
	 * Fires just before processing the SimplePie feed object.
	 *
	 * @since 3.0.0
	 *
	 * @param object &$feed SimplePie feed object, passed by reference.
	 * @param mixed  $url   URL of feed to retrieve. If an array of URLs, the feeds are merged.
	 */
	do_action_ref_array( 'wp_feed_options', array( &$feed, $url ) );
	$feed->init();
	$feed->set_output_encoding( get_option( 'blog_charset' ) );

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

	return $feed;
}