Индивидуальная настройка RSS

Индивидуальная настройка RSS | n-wp.ru
Набор спиппетов, которые позволят вам внести индивидуальные настройки в RSS ленту блога.
👍 Научим бесплатно правильно создавать сайты на WordPress. Подробнее →

Индивидуальная настройка RSS

Основным поставщиком новых записей для многих до сих пор является технология RSS, как бы Гугл с ней ни боролся. От того, как выглядит запись, получаемая по RSS, зависит, будет ли она интересна пользователю, перейдет ли он по ссылке, или нет. Давайте посмотрим, что мы можем сделать с представлением постов в RSS-ленте, не прибегая к помощи дополнительных плагинов.

Настройки чтения

Индивидуальная настройка RSS

В настройках чтения вы можете определить, в каком виде отдавать записи в RSS — в полном или сокращенном. Многие предпочитают отдавать в сокращенном виде, и на это есть несколько причин:

  • Сокращенный вариант защищает от автоматического копирования контента.
  • Сокращенный вариант побуждает к переходам на сайт.
  • В сокращенном варианте можно избежать ошибок оформления и использования дополнительных параметров (например, произвольных полей).
  • Сокращенный вариант создает меньшую нагрузку на хостинг.

Так же в настройках блога можно установить количество записей, постоянно доступных доступных в RSS.

Количество постов, попадающих в RSS

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

function posts_num_in_rss($query) {
	if( ! $query->is_feed || ! $query->is_main_query() )
	return;
	$num = 10;
	add_filter( 'post_limits', create_function('', "return 'LIMIT $num';") );
}
add_filter( 'pre_get_posts', 'posts_num_in_rss' );

10 — это количество последних постов, отображаемых в RSS.

Добавление произвольных типов записей в RSS

По-умолчанию в RSS попадают только посты. Однако в современных блогах активно используются и другие типы записей, например, портфолио (portfolio), события (events). Если вы хотите, чтобы они тоже попадали в RSS, то добавьте в файл functions.php используемой вами темы этот код:

function add_post_types_to_rss( $query ) {
	if( ! $query->is_feed || ! $query->is_main_query() )
	return;
	$query->set( 'post_type', array('post', 'portfolio', 'events', 'page') );	
}
add_filter('pre_get_posts', 'add_post_types_to_rss');

Теперь в RSS будут попадать не только стандартные посты, но и новые страницы, а так же записи portfolio и events.

Задержка публикаций в RSS

Еще одним способом борьбы с воровством контента является задержка публикации записей в RSS. Если отдавать в RSS записи, которые уже были проиндексированы поисковыми системами, то их копирование не возымеет эффекта, так как оригиналом будут считаться записи с вашего сайта. Задержку можно установить, добавить код в файл functions.php используемой вами темы:

function publish_later_on_feed($where) 
 {
  global $wpdb;if ( is_feed() ) 
   {
    $now = gmdate('Y-m-d H:i:s');
    $wait = '1440'; // задержка
    $device = 'MINUTE'; // единицы измерения MINUTE, HOUR, DAY, WEEK, MONTH, YEAR
    $where .= " AND TIMESTAMPDIFF($device, $wpdb->posts.post_date_gmt, '$now') > $wait ";
   }
  return $where;
 }
add_filter('posts_where', 'publish_later_on_feed');

Добавление миниатюр в RSS

Если вы выберете краткое представление записи в RSS, то в ней будет отдаваться только текст цитаты поста. Чтобы добавить к нему еще и миниатюру, добавьте в functions.php:

function rss_post_thumbnail($content) {
global $post;
if(has_post_thumbnail($post->ID)) {
$content = '<div style="padding:0 0  10px 0">' . get_the_post_thumbnail( $post->ID, 'thumbnail' ) . '</div>' . get_the_excerpt();
}
return $content;
}
add_filter('the_excerpt_rss', 'rss_post_thumbnail');

Если вы хотите добавлять миниатюру поста еще и в полное представление записи в RSS, добавьте еще одну строчку:

add_filter('the_content_feed', 'rss_post_thumbnail');

Исключение определенных категорий из RSS

Иногда требуется исключить из RSS посты из определенных категорий. Например, это могут быть посты из категории рекламных статей, которые вы не хотите показывать постоянны подписчикам. Для этого добавьте в файл functions.php:

function exclude_cats_from_rss( $query ){
	if( ! $query->is_feed || ! $query->is_main_query() )
	return;
	$query->set( 'cat', '-10,-12' ); 
}
add_filter( 'pre_get_posts', 'exclude_cats_from_rss' );

10 и 12 — это ID категорий, посты из которых не должны попадать в RSS.

Исключение родительской категории и всех дочерних категорий из RSS

Иногда требуется исключить не просто определенную категорию, но и все дочерние категории, которые включены в нее. В этом случае код, вставляемый в файл functions.php, будет таким:

function exclude_cat_tree_from_rss( $query ){
	if( ! $query->is_feed || ! $query->is_main_query() )
	return;
	$cat = 13;
	$subcats = get_categories( "child_of=$cat" );
	$subcat_string = '';
	foreach( $subcats as $subcat) {
		$subcat_string .= '-' . $subcat->cat_ID . ',';
	}
	$subcat_string .= "-$cat";
	$query->set( 'cat', $subcat_string ); 
}
add_filter( 'pre_get_posts', 'exclude_cat_tree_from_rss' );

13 — это ID категории, которая будет исключена из RSS вместе со всеми дочерними категориями.

Вывод в RSS постов только из определенных категорий

Если вам легче указать, из каких категорий брать посты для RSS, а не составлять список категорий, которые нужно исключить, то используйте этот код:

function include_categories_for_rss( $query ){
	if( ! $query->is_feed || ! $query->is_main_query() )
	return;
	$query->set( 'cat', '3,4,5,7' );
}
add_filter( 'pre_get_posts', 'include_categories_for_rss' );

3, 4, 5, 7 — это ID категорий, посты из которых нужно выводить в RSS. Посты из других категорий не будут попадать в RSS.

Исключение из RSS постов с определенным произвольным полем

Если вам нужно исключать из RSS посты, в которых задано определенное произвольное поле, то вставьте в functions.php этот код:

function exclude_posts_with_custom_fiels_from_rss($where){
	if( ! is_feed() || ! is_main_query() )
	return $where;
	global $wpdb;
	$where .= " AND $wpdb->posts.ID NOT IN ( 
	    SELECT distinct(post_id) from $wpdb->postmeta 
		where $wpdb->postmeta.meta_key = 'exclude_from_rss'
	) ";
	return $where;
}
add_filter( 'posts_where', 'exclude_posts_with_custom_fiels_from_rss' );

exclude_from_rss — это произвольное поле, которое имеет значение. Все посты с этим произвольным полем будут исключены из RSS.

Исключение из RSS постов с определенной меткой

Из RSS можно исключать посты не только с определенными произвольными полями и категориями, но и метками. Добавьте в файл functions.php используемой вами темы:

function exclude_posts_from_rss_with_tag( $query ) {
	if( ! $query->is_feed || ! $query->is_main_query() )
	return;
	$query->set( 'tag__not_in', array(345, 346, 347) );
}
add_filter( 'pre_get_posts', 'exclude_posts_from_rss_with_tag' );

345, 346, 347 — это ID меток, посты с которыми не попадут в RSS.

Исключение из RSS постов определенных форматов

WordPress позволяет публиковать посты определенных форматов. Если вы не хотите, что посты некоторых форматов попадали в RSS, то можете исключить их, добавив в functions.php:

if ( $wp_query->is_feed() ) { 
     $post_formats_to_exclude = array( 
         'post-format-status',
         'post-format-quote',
         'post-format-link', 
         'post-format-aside' 
     ); 
     $extra_tax_query = array( 
         'taxonomy' => 'post_format', 
         'field' => 'slug', 
         'terms' => $post_formats_to_exclude, 
         'operator' => 'NOT IN' 
     );  
     $tax_query = $wp_query->get( 'tax_query' ); 
     if ( is_array( $tax_query ) ) { 
         $tax_query = $tax_query + $extra_tax_query; 
     } else { 
         $tax_query = array( $extra_tax_query ); 
     } 
         $wp_query->set( 'tax_query', $tax_query ); 
     } 
} 
 add_action( 'pre_get_posts', 'exclude_post_formats_from_feeds' );

Этот код исключает из RSS посты форматов статус (status), цитата (quote), ссылка (link) и заметка (aside).

Добавление в конце записи в RSS ссылки на блог

Если вы хотите, чтобы в конце краткой записи в RSS стояла ссылка на ваш блог, то добавьте в functions.php:

function add_link_to_blog_in_rss( $content ){
	$content .= '<p>источник: <a target="_blank" rel="nofollow" href="">'. get_bloginfo('name') .'</a></p>';
	return $content;
}
add_filter( 'the_excerpt_rss', 'add_link_to_blog_in_rss' );

Вывод похожих постов в RSS

Если вы хотите, чтобы в конце каждой записи в RSS выводился список похожих постов, то добавьте в functions.php этот код:

function add_rel_to_rss( $content ){	
	global $post;
	$cache_key = __FUNCTION__ . $post->ID;
	if( $cache = wp_cache_get( $cache_key ) )
	return $content . $cache;
	$tag_ids = wp_get_post_tags( $post->ID, array( 'fields' => 'ids' ) );
	if( $tag_ids ){
		$out = '';
		$args = array( 
			'posts_per_page' => 5, 
			'tag__in' => $tag_ids,
			'post__not_in' => array($post->ID)
		);
		$posts = get_posts( $args );
		if( $posts ){
			foreach( $posts as $p ){
				$out .= '<li>'. get_permalink($p->ID) . " </li>";
			}
			$out = make_clickable( $out );
			$content .= '<p>похожие записи: <ul>'. $out .'</ul></p>';
		}
	}
	wp_cache_set( $cache_key, $out );
	return $content;
}
add_filter( 'the_excerpt_rss', 'add_rel_to_rss' );
add_filter( 'the_content_feed', 'add_rel_to_rss' );

Этот код выводит в конце каждой записи 5 похожих постов. Их похожесть определяется используемыми метками.

Вывод форматов постов в RSS

Не каждый RSS-ридер отображает мультимедийный контент, поэтому можно предупредить читателя, указав, какой формата пост он получил. Для этого можно добавить вывод формата поста в запись:

function post_format_in_feed( $content ) {
     global $post;
     if( is_feed() ) {
         if( has_post_format( 'gallery' ) ) {
             $output = '<p>Этот пост содержит галерею изображений. <a target="_blank" rel="nofollow" href="">ID ) . '">Посмотреть галерею</a> на сайте.</p>';
             $content = $output . $content;
         }
         if( has_post_format( 'video' ) ) {
             $output = '<p>Этот пост содержит видео. <a target="_blank" rel="nofollow" href="">ID ) . '">Посмотреть видео</a> на сайте.</p>';
             $content = $output . $content;
         }
         if( has_post_format( 'audio' ) ) {
             $output = '<p>Этот пост содержит аудио. <a target="_blank" rel="nofollow" href="">ID ) . '">Послушать аудио</a> на сайте.</p>';
             $content = $output . $content;
         }
     }
     return $content;
}
 add_filter( 'the_content', post_format_in_feed' );

Вывод категории в названии поста в RSS

Чтобы в названии поста в RSS присутствовала категория, добавьте этот код в functions.php:

function wpbeginner_cattitlerss($content) {
$postcat = "";
foreach((get_the_category()) as $cat) {
$postcat .= ''.$cat->cat_name . ' / ';
}
$content = $postcat.$content;
return $content;
}
add_filter('the_title_rss', 'wpbeginner_cattitlerss');

Отключение RSS комментариев

WordPress по-умолчанию создает RSS не только постов, но и комментариев. Если вы хотите отключить RSS комментариев, то добавьте в functions.php:

function disablePostCommentsFeedLink($for_comments) {
    return;
}
add_filter('post_comments_feed_link','disablePostCommentsFeedLink');

Отключение автоматических фидов

WordPress так же создает множество дополнительных фидов — для меток, категорий. Если вы не хотите раздавать их автоматически, то добавьте в functions.php:

function my_feed_links() {
  if ( !current_theme_supports('automatic-feed-links') ) return;
  ?>
  
  <?php 
}
remove_action('wp_head', 'feed_links', 2); 
add_action('wp_head', 'my_feed_links');

Этот код убирает вообще все фиды, и выводит вместо них одну, главную RSS-ленту основных записей. В качестве примера взят адрес n-wp.ru, вместо него вы должны подставить адрес своего блога.

Создай свой первый сайт на WordPress

Рут
Оцените автора
Добавить комментарий

  1. Mikhail

    Вставка миниатюры не сработала вообще. Есть другие варианты?
    Вставка похожих постов сработала как вставка обычного текста ссылки (не активные ссылки).

    Ответить
  2. tiaurus

    Вывод похожих записей в RSS:

    function add_rel_to_rss( $content ){    
        global $post;
        $cache_key = __FUNCTION__ . $post->ID;
        if( $cache = wp_cache_get( $cache_key ) )
        return $content . $cache;
        $tag_ids = wp_get_post_tags( $post->ID, array( 'fields' => 'ids' ) );
        if( $tag_ids ){
            $out = '';
            $args = array( 
                'posts_per_page' => 4, 
                'tag__in' => $tag_ids,
                'post__not_in' => array($post->ID)
            );
            $posts = get_posts( $args );
            if( $posts ){
                foreach( $posts as $p ){
                    $out .= '<span><a href="'. get_permalink($p->ID) . '">'. get_the_title($p->ID) .'</a> // </span>';
                }
                $out = make_clickable( $out );
                $content .= '<div>Ссылка <a href="'.get_permalink($post->ID).'">'.get_permalink($post->ID).'</a>    Читать еще '. $out .'</div>';
            }
        }
        wp_cache_set( $cache_key, $out );
        return $content;
    }
    add_filter( 'the_excerpt_rss', 'add_rel_to_rss' );
    add_filter( 'the_content_feed', 'add_rel_to_rss' );
    Ответить
  3. tiaurus

    Вывод миниатюр в RSS:

    function rss_post_thumbnail($content) {
    global $post;
    if(has_post_thumbnail($post->ID)) {
    $content = '<table><tr><td><div style="margin:0 20px 0 0;padding:0;">' . get_the_post_thumbnail( $post->ID, 'medium' ) . '</div></td><td><div style="font-size:138%;line-height:138%;">' . get_the_excerpt() . '</div></tr></table>';
    }
    return $content;
    }
    add_filter('the_excerpt_rss', 'rss_post_thumbnail');
    //add_filter('the_content_feed', 'rss_post_thumbnail');
    Ответить
    1. Mikhail

      Попробовал оба кода, но ничего не помогло. Может у меня тема какая то кривая, что код в ней не срабатывает?

      Ответить
  4. MyKey

    Здравствуйте, использовал фильтр, для подключения фидов к произвольному типу записей, но он не сработал, может подскажете, в чем может быть ошибка.

    участок кода отвечающий за добавление произвольного типа записей

    /* Portfolio */
    function my_post_type_portfolio() {
    register_post_type( ‘portfolio’,
    array(
    ‘label’ => theme_locals(“portfolio”),
    ‘singular_label’ => theme_locals(“portfolio”),
    ‘_builtin’ => false,
    ‘public’ => true,
    ‘show_ui’ => true,
    ‘show_in_nav_menus’ => true,
    ‘hierarchical’ => true,
    ‘capability_type’ => ‘page’,
    ‘menu_icon’ => ( version_compare( $GLOBALS[‘wp_version’], ‘3.8’, ‘>=’ ) ) ? ‘dashicons-portfolio’ : PARENT_URL . ‘/includes/images/icon_portfolio.png’,
    ‘rewrite’ => array(
    ‘slug’ => ‘portfolio-view’,
    ‘with_front’ => FALSE,
    ),
    ‘supports’ => array(
    ‘title’,
    ‘editor’,
    ‘thumbnail’,
    ‘excerpt’,
    ‘comments’,
    )
    )
    );
    register_taxonomy(
    ‘portfolio_category’,
    ‘portfolio’,
    array(
    ‘hierarchical’ => true,
    ‘label’ => theme_locals(“categories”),
    ‘singular_name’ => theme_locals(“category”),
    ‘rewrite’ => true,
    ‘query_var’ => true
    )
    );
    register_taxonomy(
    ‘portfolio_tag’,
    ‘portfolio’,
    array(
    ‘hierarchical’ => false,
    ‘label’ => theme_locals(“tags”),
    ‘singular_name’ => theme_locals(“tag”),
    ‘rewrite’ => true,
    ‘query_var’ => true
    )
    );
    }
    add_action(‘init’, ‘my_post_type_portfolio’);
    фильтр

    add_filter(‘pre_get_posts’, ‘add_new_post_types_to_feed’);
    function add_new_post_types_to_feed( $query ) {
    // Выходим если это запрос не фидов
    if( ! $query->is_feed || ! $query->is_main_query() )
    return;

    $query->set( ‘post_type’, array(‘post’, ‘portfolio’));
    }

    Ответить