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);
}
?>
Нет постов.';
} else {
foreach ($rss_items as $item) {
?>
-
get_date('j F Y | g:i a'); ?>'>
get_title()); ?>
Пример 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 '';
}
}
Пример 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! Удачи!