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 | Введено. |