fetch_feed() WP 2.8.0

Отримує зовнішній фід і розбирає його дані (парсит його).

Функція потрібна, щоб отримати RSS-фід у вигляді SimplePie об’єкта і закешувати результат.

Для отримання та парсингу фіда fetch_feed() використовує популярний клас SimplePie . Фід кешується і кеш згодом оновлюється кожні 12 годин.

Дані кешуються в базу даних у часові опції . Якщо встановлено плагін постійного об’єктного кешування, то функція кешуватиме не в БД, а в сховище для об’єктного кешу.

Є дуже схожа функція fetch_rss($url)

Докладніше про методи класу SimplePie читайте у документації (англ.).

Повертає

SimplePie|WP_Error. SimplePie об’єкт даних про фід або об’єкт WP_Error у разі помилки.

Використання

$feed = fetch_feed($uri);
$uri
(рядок) (обов’язковий)
Посилання (УРЛ) на фід, який потрібно отримати. В результаті за цим посиланням буде отримано створений об’єкт (масив) SimplePie.

Приклади

0

#1 Отримаємо останні 5 записів із фіда у зовнішнього сайту

Приклад, який отримує та виводить на екран посилання на існуючий RSS-фід. У прикладі ми обмежуємо висновок лише 5 останніми записами у фіді.

<h2>Останні новини з блогу blog.ru</h2>

<?php
// робимо функцію 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 );

	// Створюємо масив усіх записів фіда, починаючи з першого запису (0 – початок)
	$rss_items = $rss->get_items(0, $maxitems);
}
?>

<ul>
	<?php
	if ( $maxitems == 0 ) {
		echo '<li>Немає записів.</li>';
	} else { // Пробігаємось по масиву і виводимо посилання на кожен запис
		foreach ( $rss_items as $item ) { ?>
			<li>
				<a href='<?php echo esc_url( $item->get_permalink() ); ?>'
				   title='<?php echo 'Posted' . $item->get_date( 'j FY | g:i a' ); ?>'
				>
					<?php echo esc_html( $item->get_title() ); ?>
				</a>
			</li>
		<?php}
	} ?>
</ul>
0

#2 Ще один приклад: отримаємо 5 записів фіда стороннього сайту

Прочитаємо фід http://mysite.com/feed/ та отримаємо з нього перші 5 записів.

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 'no items';
}
else {
	foreach ( $rss_items as $item ) {
		echo '<p><a href="' . $item->get_permalink() . '">' . $item->get_title() . '</a></p>';
	}
}
0

#3 Управління часом життя кешу фідів

Результат отримання фіда кешується на 12:00. Щоб змінити час кешу функції 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://myexample.com/feed/' == $url )
		return 3600; // 1 год

	return $interval;
}
0

#4 Відключення кешування під час розробки

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

// відключаємо кешування фідів. Тільки якщо увімкнено режим розробки WP_DEBUG
if( defined('WP_DEBUG') && WP_DEBUG ){

	add_action( 'wp_feed_options', function( &$feed ){
		$feed->enable_cache(false);
	} );
}

ВАЖЛИВО! Обов’язково вимкніть цей код на робочому сайті. Тому що він може збільшити швидкість завантаження сторінок сайту у рази!

Кешування фідів не працює із включеною константою WP_DEBUG

Майте на увазі, що якщо увімкнено константу WP_DEBUG , то фід не кешується. Спрацьовує такий код ядра:

function do_not_cache_feeds(&$feed) {
	$feed->enable_cache(false);
}

if ( defined('WP_DEBUG') && WP_DEBUG ) {
	add_action( 'wp_feed_options', 'do_not_cache_feeds');
}
Кешування у браузері

Також зверніть увагу, що кешування може відбуватися у браузері, щоб обійти його оновлюйте сторінку через ctrl + F5. Або можна додати такий хук:

// відключимо кешування в барузері для запитів фідів
add_filter( 'wp_headers', function( $headers ){

	if( !empty( $GLOBALS['wp']->query_vars['feed'] ) ){
		unset( $headers['ETag'], $headers['Last-Modified'] );
	}

	return $headers;
} );
0

#5 Очищення кешу всіх фідів у WordPress

Для запуску коду потрібно додати в URL параметр ?clear_feeds_cache .

// Очищення кешу всіх фідів у 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));
}

Примітка: якщо на сайті включено об’єктне кешування, цей код не спрацює.

список змін

З версії 2.8.0Введено.

Код : fetch_feed() WP 6.0.2

function fetch_feed($url) {
	if ( ! class_exists( 'SimplePie', false ) ) {
		require_once ABSPATH. WPINC. '/class-simplepie.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 = новий 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 = новий WP_SimplePie_Sanitize_KSES();

	// Регістр шрифта handler за допомогою сумісного методу для SimplePie 1.3 or later.
	if ( method_exists( 'SimplePie_Cache', 'register' ) ) {
		SimplePie_Cache::register( 'wp_transient', 'WP_Feed_Cache_Transient' );
		$feed->set_cache_location( 'wp_transient' );
	} else {
		// Back-compat for SimplePie 1.2.x.
		require_once ABSPATH. WPINC. '/class-wp-feed-cache.php';
		$feed->set_cache_class( 'WP_Feed_Cache' );
	}

	$feed->set_file_class( 'WP_SimplePie_File' );

	$feed->set_feed_url($url);
	/** Цей filter is documented в 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 SimplePie $feed SimplePie feed object (passed by reference).
	 * @param string|string[] $url URL-адреса або array of URL-адреси для запису.
	 */
	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;
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *