fetch_feed()
Отримує зовнішній фід і розбирає його дані (парсит його).
Функція потрібна, щоб отримати RSS-фід у вигляді SimplePie об’єкта і закешувати результат.
Для отримання та парсингу фіда fetch_feed() використовує популярний клас SimplePie . Фід кешується і кеш згодом оновлюється кожні 12 годин.
Дані кешуються в базу даних у часові опції . Якщо встановлено плагін постійного об’єктного кешування, то функція кешуватиме не в БД, а в сховище для об’єктного кешу.
Є дуже схожа функція fetch_rss($url)
Докладніше про методи класу SimplePie читайте у документації (англ.).
Хуки з функції
Повертає
SimplePie|WP_Error. SimplePie об’єкт даних про фід або об’єкт WP_Error у разі помилки.
Використання
$feed = fetch_feed($uri);
- $uri
(рядок) (обов’язковий) - Посилання (УРЛ) на фід, який потрібно отримати. В результаті за цим посиланням буде отримано створений об’єкт (масив) SimplePie.
Приклади
#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>#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>';
}
}#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;
}#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;
} );#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 | Введено. |