Основным поставщиком новых записей для многих до сих пор является технология RSS, как бы Гугл с ней ни боролся. От того, как выглядит запись, получаемая по RSS, зависит, будет ли она интересна пользователю, перейдет ли он по ссылке, или нет. Давайте посмотрим, что мы можем сделать с представлением постов в RSS-ленте, не прибегая к помощи дополнительных плагинов.
- Настройки чтения
- Количество постов, попадающих в RSS
- Добавление произвольных типов записей в RSS
- Задержка публикаций в RSS
- Добавление миниатюр в RSS
- Исключение определенных категорий из RSS
- Исключение родительской категории и всех дочерних категорий из RSS
- Вывод в RSS постов только из определенных категорий
- Исключение из RSS постов с определенным произвольным полем
- Исключение из RSS постов с определенной меткой
- Исключение из RSS постов определенных форматов
- Добавление в конце записи в 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, вместо него вы должны подставить адрес своего блога.

Вставка миниатюры не сработала вообще. Есть другие варианты?
Вставка похожих постов сработала как вставка обычного текста ссылки (не активные ссылки).
Вывод похожих записей в RSS:
Вывод миниатюр в RSS:
Попробовал оба кода, но ничего не помогло. Может у меня тема какая то кривая, что код в ней не срабатывает?
Здравствуйте, использовал фильтр, для подключения фидов к произвольному типу записей, но он не сработал, может подскажете, в чем может быть ошибка.
участок кода отвечающий за добавление произвольного типа записей
/* 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’));
}