WordPress как на ладони
Новые WordPress шаблоны Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

Фиды (RSS) в WordPress

Фиды в WordPress - это формат вывода записей или комментариев в специальном формате. Это тоже самое, что вывод записей на главной станице, только в особом формате, который создается по определенным стандартам и который может прочитать и понять программа-собиратель лент новостей.

Фиды используются, например, программой, которая собирает последние публикации с разных сайтов, среди них есть ваш сайт (ваш фид). Чтобы эта программа смогла понять где заголовок записи, а где контент - фиды всех сайтов имеют одинаковый формат - это общепринятый стандарт. Таких стандартов несколько: RSS, RSS2, Atom, RDF. В последнее время почти всегда используется RSS2.

В предыдущих версиях WordPress генерировал формат фида RSS-0.92, но теперь этот формат редиректит на RSS-2.0. Однако шаблон этого старого формат присутствует в ядре.

Как работают фиды в WordPress

Для начала стоит сказать, что фиды текущего сайта WordPress не кэшируются. Кэширование происходит в браузере, чтобы его обойти обновляйте страницу через Сtrl + 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://site.ru/feed/
Последние комментарии (главный фид) http://site.ru/comments/feed/
Комментарии указанного поста http://site.ru/2009/07/post-name/feed/
Комментарии указанной страницы http://site.ru/archives/feed/
Записи за день, месяц, год, рубрика, метка http://site.ru/2010/feed/, http://site.ru/2010/10/feed/, http://site.ru/tag/tag-name/feed/
Записи для указанного параметра запроса поиска http://site.ru/search/term/feed/

Вместо /feed/ в конце может быть использованы и другие типы RSS:

  • Atom – /atom/
  • RDF – /rdf/
  • RSS2 – /feed/, /feed/rss/ или /feed/rss2/
меню

URL (ссылки) фидов в WordPress

Ссылки (ЧПУ) для фидов всех записей

  • http://site.ru/feed/ (RSS 2.0 формат)
  • http://site.ru/feed/rss2/ (RSS 2.0 формат)
  • http://site.ru/feed/rss/ (RSS 0.92 формат)
  • http://site.ru/feed/rdf/ (RDF/RSS 1.0 формат)
  • http://site.ru/feed/atom/ (Atom формат)

Ссылки (не ЧПУ) для фидов всех записей

  • http://site.ru/wp-rss2.php (RSS 2.0 формат)
  • http://site.ru/wp-rss.php (RSS 0.92 формат)
  • http://site.ru/wp-rdf.php (RDF/RSS 1.0 формат)
  • http://site.ru/wp-atom.php (Atom формат)

Ссылки (не ЧПУ) для фидов всех записей через параметр запроса

  • http://site.ru/?feed=rss2 (RSS 2.0 формат)
  • http://site.ru/?feed=rss (RSS 0.92 формат)
  • http://site.ru/?feed=rdf (RDF/RSS 1.0 формат)
  • http://site.ru/?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://site.ru/comments/feed/ (ЧПУ формат)
  • http://site.ru/wp-commentsrss2.php (дефолтный формат)
  • http://site.ru/?feed=commentsrss2 (формат с параметров запроса)

В какой опции храниться ссылка на фид всех комментариев:

<?php bloginfo('comments_rss2_url'); ?>

Ссылка на комментарии указанного поста

<?php comments_rss_link('Подпишитесь на комментарии этой записи по RSS-2.0 фиду'); ?>

Другой вариант вывести ссылку на фид комментариев указанного поста - это добавить в конец постоянной ссылки feed/ (для ЧПУ) или ?feed=rss2 (если ЧПУ отключено). Т.е. в результате получим:

  • http://site.ru/individual-post/feed/ (ЧПУ формат)
  • http://site.ru/individual-post/?feed=rss2 (дефолтный формат)

Также ссылка на фид комментов поста, может выглядеть так, если отключены красивые URL (ЧПУ). Ниже p - это ID записи.:

  • http://site.ru/?feed=rss2&p=123

Ссылки на фид записей из рубрики

  • http://site.ru/category/categoryname/feed/ (ЧПУ формат)
  • http://site.ru/wp-rss2.php?cat=33 (дефолтный формат)
меню

PHP шаблоны фидов WordPress (файлы)

Какие файлы движка отвечают за вывод какого фида.

Фиды записей:

Каждый файл отвечать за свой тип фида.

feed-rss.php - считается устарелым форматом.

Окончание /feed относится к файлу feed-rss2.php.

Фиды комментариев:

меню

Функции фидов

Смотрите в файле: /wp-includes/feed.php

7 комментов
  • adward5 cайт: cimetrica.ru

    У меня на сайте закралось пару пробелов (или даже три) в rss-фид (в самом начале, перевод строки): http://tatar-congress.org/ru/feed/

    из-за этого некоторые трансляторы в соцсети не принимают такой файл. Я уже всё перерыл, что мог, что знал и не знал... Не могу найти траблу.

    Хотелось бы спросить - не существуют ли каких либо альтернативных способов отдавать rss-фид (хуков каки нибудь, например, или фильтров).

    К слову сказать, я использовал следующий кусок кода в functions.php, который к постам прилепляет миниатюры, и очищает контент записи от вложенных галерей:

    function thumbs_in_rss($content) {
    	global $post;
    	if(has_post_thumbnail($post->ID)){
    		$thumb = get_the_post_thumbnail( $post->ID, 'full' );
    		$content = preg_replace("/<img[^>]+\>/i", "", $content);
    		$content = $thumb . $content;
    	}
    	//return $content;
    	return mb_convert_encoding($content, 'utf-8', mb_detect_encoding($content));
    }
    
    add_filter('the_excerpt_rss', 'thumbs_in_rss');
    add_filter('the_content_feed', 'thumbs_in_rss');

    но и закомментировав его - проблема не исчезла. Понять не могу, как быть..

    Ответить1.7 год назад #
    • Kama6918

      Отключай по очереди все плагины, все коды. Это может быть из за любого кода. Скорее всего это где-то в коде в конце закрываться ?> и после этого парочка переносов...

      У тебя это и на самом сайте, не только в фидах...

      Ответить1.7 год назад #
      • adward5 cайт: cimetrica.ru

        К сожалению, не спасло. Выключил абсолютно все плагины. Два перевода каретки остались на месте sad

        я думаю, что тут наверное нужен какой то фильтр, который будет принимать на входе этот rss и возвращать его нормальным...

        Ответить1.7 год назад #
        • Kama6918

          Так не может быть, какой-то файл это делает. Может код... Его надо найти.

          Костыль тоже можно вставить, вот накидал:

          add_action('wp', function(){
          	if( is_feed() ) ob_start();
          });
          
          add_action('shutdown', function(){
          	if( is_feed() ){
          		$html = ob_get_clean();
          		$html = preg_replace('~^\s+~', '', $html );
          		echo $html;
          	}
          });
          
          Ответить1.7 год назад #
          • adward5 cайт: cimetrica.ru

            я нашел траблу.
            оказывается, в одном из недавно редактируемых файлов (которые инклудились в functions.php) были вставлены два пустых пробела между php-блоками.

            в общем, сейчас всё хорошо, всё работает, всем спасибо

            *(8-)

            <?php
            	тут был код
            ?>
            
            тут было пусто
            
            <?php
            	тут был код
            ?>
            Ответить1.7 год назад #
  • Владислав

    Здравствуйте, Kama!
    Подскажите пожалуйста, недавно заметил в WebМастере, что робот нашел следующие ссылки:

    • /salati/kak-prigotovit-yarkiy-salat-iz-varyonoy-tyikvyi-s-pomidorami/feed
    • /category/ribka/feed

    т.е. теперь к каждому url'у генерируются с feed на конце.
    Можно это как-то отключить в WordPress, оставив только сайт/feed?
    В robot.txt закрыл */feed

    • Kama6918

      Вот накидал код, проверил - все ссылки фидов перестанут работать, будут возвращать 404 ошибку, кроме фида на главной странице:

      ## удаляет все правила перезаписи фидов кроме фида на главной странице
      add_filter( 'rewrite_rules_array', 'delete_all_feed_rewrites_rules' );
      function delete_all_feed_rewrites_rules( $rules ){
      
      	foreach( $rules as $rule => $val ){
      		if( strpos($rule, 'feed/(') || ( strpos($rule, '/(feed') && 0 !== strpos($rule, 'feed/(feed') ) )
      			unset( $rules[ $rule ] );
      	}
      	//die( print_r(  $rules  ) );
      
      	return $rules;
      }
      1
Здравствуйте, !     Войти . Зарегистрироваться