Фиды (RSS) в WordPress
Фиды в WordPress — это формат вывода записей или комментариев в специальном формате. Это то же самое, что вывод записей на главной странице, только в особом формате, который создаётся по определённым стандартам и который может прочитать и понять программа-собиратель лент новостей.
Фиды используются, например, программой, которая собирает последние публикации с разных сайтов, среди которых есть ваш сайт (ваш фид). Чтобы эта программа смогла понять, где заголовок записи, а где контент, фиды всех сайтов имеют одинаковый формат — это общепринятый стандарт. Таких стандартов несколько: RSS, RSS2, Atom, RDF. В последнее время почти всегда используется RSS2.
В предыдущих версиях WordPress генерировал формат фида RSS-0.92, но теперь этот формат редиректит на RSS-2.0. Однако шаблон этого старого формата присутствует в ядре.
-
Для работы с внешними фидами смотрите функцию fetch_feed()
-
Примеры изменения фидов смотрите в подборке хуков для фидов.
- Проверить фид: https://validator.w3.org/feed/
Как работают фиды в WordPress
Для начала стоит сказать, что фиды текущего сайта WordPress не кэшируются. Кэширование происходит в браузере, чтобы его обойти, обновляйте страницу через Ctrl+F5. Или можно добавить такой хук:
## отключим кэширование в браузере для запросов фидов add_filter( 'wp_headers', function($headers){ if( !empty($GLOBALS['wp']->query_vars['feed']) ){ unset( $headers['ETag'], $headers['Last-Modified'] ); } return $headers; });
Как работает запрос фида
После загрузки всего ВП и установки текущего запроса и его параметров вызывается файл template-loader.php, в нём после проверки is_feed() вызывается функция do_feed().
Далее, если в запросе не был указан конкретный тип фида, то он определяется функцией get_default_feed() (через её хук можно изменить тип фида по умолчанию).
Далее вызывается динамический хук do_feed_(feed):
do_action( "do_feed_{$feed}", $wp_query->is_comment_feed, $feed );
К каждому варианту этого хука в WP по умолчанию подключена функция (см. default-filters.php):
add_action( 'do_feed_rdf', 'do_feed_rdf', 10, 1 ); add_action( 'do_feed_rss', 'do_feed_rss', 10, 1 ); add_action( 'do_feed_rss2', 'do_feed_rss2', 10, 1 ); add_action( 'do_feed_atom', 'do_feed_atom', 10, 1 );
Т.е. в зависимости от типа фида, срабатывает одна из функций, которая подключает нужный файл шаблона, который в свою очередь генерирует HTML код страницы фида.
Обычно срабатывает функция do_feed_rss2():
function do_feed_rss2( $for_comments ) { if ( $for_comments ) { load_template( ABSPATH . WPINC . '/feed-rss2-comments.php' ); } else { load_template( ABSPATH . WPINC . '/feed-rss2.php' ); } }
Как отключить фиды в WordPress
Для этого нужно открепить все функции фидов от хуков:
remove_action( 'do_feed_rdf', 'do_feed_rdf', 10, 1 ); remove_action( 'do_feed_rss', 'do_feed_rss', 10, 1 ); remove_action( 'do_feed_rss2', 'do_feed_rss2', 10, 1 ); remove_action( 'do_feed_atom', 'do_feed_atom', 10, 1 );
Теперь при заходе на страницу фида, например /feed, мы увидим 404 страницу с сообщением:
Так как фидов у нас теперь нет, также нужно удалить ссылки на фиды из wp_head:
add_action( 'wp', function(){ remove_action( 'wp_head', 'feed_links_extra', 3 ); remove_action( 'wp_head', 'feed_links', 2 ); remove_action( 'wp_head', 'rsd_link' ); } );
Читайте также: Удаление фидов, кроме фида на главной странице
Типы контента и форматы фидов
Теперь, когда мы разобрались с тем, что такое фиды, посмотрим, какие виды контента предоставляет WordPress в формате фида:
Тип фида | Пример URL |
---|---|
Последние записи (главный фид) | http://example.com/feed/ |
Последние комментарии (главный фид) | http://example.com/comments/feed/ |
Комментарии указанного поста | http://example.com/2009/07/post-name/feed/ |
Комментарии указанной страницы | http://example.com/archives/feed/ |
Записи за день, месяц, год, рубрика, метка | http://example.com/2010/feed/, http://example.com/2010/10/feed/, http://example.com/tag/tag-name/feed/ |
Записи для указанного параметра запроса поиска | http://example.com/search/term/feed/ |
Вместо /feed/ в конце могут быть использованы и другие типы RSS:
- Atom – /atom/
- RDF – /rdf/
- RSS2 – /feed/, /feed/rss/ или /feed/rss2/
URL (ссылки) фидов в WordPress
Ссылки (ЧПУ) для фидов всех записей
- http://example.com/feed/ (RSS 2.0 формат)
- http://example.com/feed/rss2/ (RSS 2.0 формат)
- http://example.com/feed/rss/ (RSS 0.92 формат)
- http://example.com/feed/rdf/ (RDF/RSS 1.0 формат)
- http://example.com/feed/atom/ (Atom формат)
Ссылки (не ЧПУ) для фидов всех записей
- http://example.com/wp-rss2.php (RSS 2.0 формат)
- http://example.com/wp-rss.php (RSS 0.92 формат)
- http://example.com/wp-rdf.php (RDF/RSS 1.0 формат)
- http://example.com/wp-atom.php (Atom формат)
Ссылки (не ЧПУ) для фидов всех записей через параметр запроса
- http://example.com/?feed=rss2 (RSS 2.0 формат)
- http://example.com/?feed=rss (RSS 0.92 формат)
- http://example.com/?feed=rdf (RDF/RSS 1.0 формат)
- http://example.com/?feed=atom (Atom формат)
В какой опции хранится каждая ссылка на фид
Когда нужно получить ссылку на дефолтный фид указанного вида, можно использовать функции получения опций сайта (информации о сайте):
<?php bloginfo('rss2_url'); ?> <!-- RSS 2.0 формат --> <?php bloginfo('rss_url'); ?> <!-- RSS 0.92 формат --> <?php bloginfo('rdf_url'); ?> <!-- RDF/RSS 1.0 формат --> <?php bloginfo('atom_url'); ?> <!-- Atom формат -->
Ссылки на фид всех комментариев WordPress
- http://example.com/comments/feed/ (ЧПУ формат)
- http://example.com/wp-commentsrss2.php (дефолтный формат)
- http://example.com/?feed=commentsrss2 (формат с параметром запроса)
В какой опции хранится ссылка на фид всех комментариев:
<?php bloginfo('comments_rss2_url'); ?>
Ссылка на комментарии указанного поста
<?php comments_rss_link('Подпишитесь на комментарии этой записи по RSS-2.0 фиду'); ?>
Другой вариант вывести ссылку на фид комментариев указанного поста — это добавить в конец постоянной ссылки feed/ (для ЧПУ) или ?feed=rss2 (если ЧПУ отключено). То есть, в результате получим:
- http://example.com/individual-post/feed/ (ЧПУ формат)
- http://example.com/individual-post/?feed=rss2 (дефолтный формат)
Также ссылка на фид комментов поста может выглядеть так, если отключены красивые URL (ЧПУ). Ниже p — это ID записи:
- http://example.com/?feed=rss2&p=123
Ссылки на фид записей из рубрики
- http://example.com/category/categoryname/feed/ (ЧПУ формат)
- http://example.com/wp-rss2.php?cat=33 (дефолтный формат)
PHP шаблоны фидов WordPress (файлы)
Какие файлы движка отвечают за вывод какого фида.
Фиды записей:
- /wp-includes/feed-atom.php
- /wp-includes/feed-rdf.php
- /wp-includes/feed-rss.php
- /wp-includes/feed-rss2.php
Каждый файл отвечает за свой тип фида.
feed-rss.php — считается устаревшим форматом.
Окончание /feed относится к файлу feed-rss2.php.
Фиды комментариев:
Работа с внешними фидами в WordPress
Для работы с фидами с других сайтов рекомендуется использовать функцию fetch_feed(). Также есть fetch_rss(), где используется библиотека MagpieRSS, но она устарела и не рекомендуется к использованию.
SimplePie стабильнее и удобнее по сравнению с MagpieRSS.
fetch_feed()
fetch_feed() использует библиотеку SimplePie для работы с фидами. SimplePie обеспечивает хорошую производительность и активно поддерживается командой WordPress.
Ниже код для чтения фида:
$rss = fetch_feed( 'https://example.com/feed' ); $rss_items = $rss->get_items( 0, $rss->get_item_quantity( 5 ) ); if( ! $rss_items ){ echo 'нет элементов'; } else { foreach( $rss_items as $item ){ echo '<p>' . $item->get_title() . '</p>'; } }
Функция использует механизмы кэширования WordPress. По умолчанию срок жизн кэша - 12 часов (43 200 секунд). Время кэша можно контролировать с помощью хука: wp_feed_cache_transient_lifetime. Пример:
add_filter( 'wp_feed_cache_transient_lifetime', fn() => 1800 );
Отладка и управление кэшированием в разработке
Для отладки можно создать свой хук, который например будет отключать кэширование фидов при включенном WP_DEBUG режиме.
Для этого можно использовать такой код:
if ( defined('WP_DEBUG') && WP_DEBUG ) { add_action( 'wp_feed_options', 'do_not_cache_feeds' ); } function do_not_cache_feeds( $feed ) { $feed->enable_cache( false ); }
fetch_rss() устарел, но всё ещё доступен
Другая функция для работы с фидами — fetch_rss(), которая была устаревшей в WordPress 2.8 в пользу fetch_feed(). Однако fetch_rss() всё ещё поддерживается для совместимости. Поведение кэширования для fetch_rss() также можно изменить с помощью констант, обычно устанавливаемых в файле wp-config.php.
Вот пример использования fetch_rss() для чтения ленты и вывода последних 5 записей:
$rss = fetch_rss( 'https://example.com/feed' ); $rss_items = array_slice( $rss->items, 0, 5 ); if ( ! $rss_items ) { echo 'нет элементов'; } else { foreach ( $rss_items as $item ) { echo '<p>' . $item['title'] . '</p>'; } }
Чтобы контролировать кэширование для fetch_rss(), можно использовать следующие константы:
define( 'MAGPIE_CACHE_ON', 0 ); // Деактивировать кэш define( 'MAGPIE_CACHE_AGE', 60*60 ); // Установить кэш на 1 час в секундах
Эти константы можно определить непосредственно в wp-config.php, чтобы они применялись глобально, или интегрировать их в определенные функции по мере необходимости.
Функции фидов
Смотрите в файле: /wp-includes/feed.php