# 10 СПОСОБОВ КАСТОМИЗАЦИИ RSS-ЛЕНТЫ В WORDPRESS
RSS-лента вашего сайта позволяет пользователям следить за новым контентом в вашем блоге. Чтобы это сделать, пользователи подписываются на ваш блог через RSS-чтец и получают обновления из вашей ленты. Иногда нужно изменить отображение постов в ленте, например, добавить кастомные типы постов или изображения.
В этой статье я покажу, как кастомизировать вывод в вашей RSS-ленте WordPress. Все предложенные фрагменты кода нужно добавить в файл functions.php
вашей темы или использовать для создания отдельного плагина. Код плагина будет выглядеть следующим образом:
## Содержание
- Включение кастомных типов постов в RSS-ленту
- Добавление миниатюры поста в RSS-ленту
- Исключение постов с определённым тегом из ленты
- Исключение категорий из RSS-ленты
- Исключение ветки категорий из RSS-ленты
- Исключение постов с кастомным полем из ленты
- Отображение постов только из указанных категорий в ленте
- Добавление ссылки на источник в конце каждого поста в RSS-ленте
- Связанные посты по тегам в конце каждого поста в RSS-ленте
- Настройка количества постов, отображаемых в RSS-ленте
- Откладывание публикации поста в RSS-ленте
- Удаление всех лент из правил переписывания (пермалинки), кроме ленты на главной странице
### ВКЛЮЧЕНИЕ КАСТОМНЫХ ТИПОВ ПОСТОВ В RSS-ЛЕНТУ
Если вы создали новый тип поста, например "book", и хотите, чтобы посты этого типа отображались в RSS-ленте вместе с обычными постами, вы можете сделать это следующим образом:
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', 'book') );
}
Если также нужно включить страницы, добавьте "page" в массив: array('post', 'book', 'page')
.
### ДОБАВЛЕНИЕ МИНИАТЮРЫ ПОСТА В RSS-ЛЕНТУ
Мы можем использовать хук the_excerpt_rss
, чтобы добавить миниатюру поста в краткое описание:
add_filter( 'the_excerpt_rss', 'add_thumbnail_to_feed' );
add_filter( 'the_content_feed', 'add_thumbnail_to_feed' );
function add_thumbnail_to_feed( $content ) {
$img = get_the_post_thumbnail( null, [100, 80], [ 'align' => 'left', 'style' => 'margin-right:15px;' ] );
$content = $img . $content;
return $content;
}
Для получения миниатюры мы используем функцию get_the_post_thumbnail()
, указывая желаемый размер изображения в качестве второго аргумента. Имейте в виду, что рассматриваемый размер (100x80) — это не фактический размер, а пропорционально уменьшенная копия исходного изображения. Лучше всего создавать специальные форматы миниатюр для RSS-лент.
### ИСКЛЮЧЕНИЕ ПОСТОВ С ОПРЕДЕЛЁННЫМ ТЕГОМ ИЗ ЛЕНТЫ
Если вам нужно исключить посты с определённым тегом (например, с ID 451) из RSS-ленты, используйте следующий код:
add_filter( 'pre_get_posts', 'exclude_posts_from_feed_by_tag_id' );
function exclude_posts_from_feed_by_tag_id( $query ) {
if ( ! $query->is_feed || ! $query->is_main_query() ) {
return;
}
$query->set( 'tag__not_in', [ 451 ] );
}
Для исключения постов с несколькими тегами просто перечислите их ID в массиве, например: [ 29, 31, 124 ]
.
### ИСКЛЮЧЕНИЕ КАТЕГОРИЙ ИЗ RSS-ЛЕНТЫ
Чтобы исключит�� лишние категории из ленты, например категории с IDs 6 и 4, используйте следующий код:
add_filter( 'pre_get_posts', 'exclude_cats_from_feed' );
function exclude_cats_from_feed( $query ) {
if ( ! $query->is_feed || ! $query->is_main_query() ) {
return;
}
$query->set( 'cat', '-6,-4' );
}
### ИСКЛЮЧЕНИЕ ВЕТКИ КАТЕГОРИЙ ИЗ RSS-ЛЕНТЫ
Если нужно исключить посты из категории и всех её подкатегорий, используйте следующий код, в котором нужно указать только ID родительской категории:
add_filter( 'pre_get_posts', 'exclude_cat_tree_from_feed' );
function exclude_cat_tree_from_feed( $query ) {
if ( ! $query->is_feed || ! $query->is_main_query() ) {
return;
}
$cat = 4; // ID категории, деревo которой нужно исключить
$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 );
}
### ИСКЛЮЧЕНИЕ ПОСТОВ С КАСТОМНЫМ ПОЛЕМ ИЗ ЛЕНТЫ
Чтобы исключить случайные посты из RSS-ленты, добавьте кастомное поле exclude_from_feed
с любым значением (например, 1) к таким постам, а затем используйте этот код:
add_filter( 'posts_where', 'exclude_special_posts_from_feed' );
function exclude_special_posts_from_feed( $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_feed'
) ";
return $where;
}
### ОТОБРАЖЕНИЕ ПОСТОВ ТОЛЬКО ИЗ УКАЗАННЫХ КАТЕГОРИЙ В ЛЕНТЕ
Если вам нужно отображать посты только из одной категории, используйте следующий код:
add_filter( 'pre_get_posts', 'my_categories_for_feed' );
function my_categories_for_feed( $query ) {
if ( ! $query->is_feed || ! $query->is_main_query() ) {
return;
}
$query->set( 'category_name', 'life' );
}
Чтобы отображать посты из нескольких категорий, укажите их имена, разделённые запятыми:
```php
$query->set( 'category_name', 'life,love' );
Или укажите ID категорий, разделённые запятыми:
$query->set( 'cat', '2,6,17,38' );
ДОБАВЛЕНИЕ ССЫЛКИ НА ИСТОЧНИК В КОНЦЕ КАЖДОГО ПОСТА В RSS-ЛЕНТЕ
Если вы хотите добавить определённый текст в конец каждого поста, например, ваш копирайт, используйте следующий код:
add_filter( 'the_excerpt_rss', 'add_text_to_the_feed_end' );
function add_text_to_the_feed_end( $content ) {
$content .= '
Источник: '. get_bloginfo('name') .'.
';
return $content;
}
СВЯЗАННЫЕ ПОСТЫ ПО ТЕГАМ В КОНЦЕ КАЖДОГО ПОСТА В RSS-ЛЕНТЕ
Вы можете добавить ссылки на посты с тем же тегом в конце каждого поста. Например, если пост имеет тег "life", в конце будут отображаться другие посты с этим тегом:
add_filter( 'the_excerpt_rss', 'related_tag_posts_to_feed_end' );
add_filter( 'the_content_feed', 'related_tag_posts_to_feed_end' );
function related_tag_posts_to_feed_end( $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, [ 'fields' => 'ids' ] );
if ( $tag_ids ) {
$out = '';
$args = array(
'posts_per_page' => 3,
'tag__in' => $tag_ids,
'post__not_in' => [ $post->ID ],
);
$posts = get_posts( $args );
if ( $posts ) {
foreach ( $posts as $p ) {
$out .= ''. get_permalink( $p->ID ) . ' ';
}
$out = make_clickable( $out );
$content .= 'Читайте также:
'. $out .'
';
}
}
wp_cache_set( $cache_key, $out );
return $content;
}
НАЛИЧИЕ КОЛИЧЕСТВА ПОСТОВ, ОТОБРАЖАЕМЫХ В RSS-ЛЕНТЕ
По умолчанию количество отображаемых в RSS-ленте постов можно установить в настройках: Настройки > Чтение > Показывать в потоке новейшие. Если вам нужно изменить это количество через плагин или в других случаях, используйте следующий код:
add_filter( 'pre_get_posts', 'how_many_posts_display_in_feed' );
function how_many_posts_display_in_feed( $query ) {
if ( ! $query->is_feed || ! $query->is_main_query() ) {
return;
}
$n = 7; // Количество отображаемых постов
add_filter( 'post_limits', function( $n ) { return "LIMIT $n"; } );
}
ОТКЛАДЫВАНИЕ ПУБЛИКАЦИИ ПОСТА В RSS-ЛЕНТЕ
Чтобы пост появлялся в RSS-ленте не сразу, а с задержкой, вы можете использовать следующий код:
add_filter( 'pre_get_posts', 'delay_post_to_feed' );
function delay_post_to_feed( $query ) {
global $wpdb;
if ( $query->is_feed && $query->is_main_query() && ! $GLOBALS['wp_query']->is_comment_feed ) {
$query->set( 'date_query', [
'before' => '12 hour ago',
]);
}
}
УДАЛЕНИЕ ВСЕХ ЛЕНТ ИЗ ПРАВИЛ ПЕРЕПИСЫВАНИЯ (ПЕРМАЛИНКИ), КРОМЕ ЛЕНТЫ НА ГЛАВНОЙ СТРАНИЦЕ
Если вам нужно, чтобы все ссылки на ленты не работали и возвращали ошибку 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 ] );
}
}
return $rules;
}
После установки кода необходимо сбросить правила переписывания в настройках пермалинков.
Хуки, используемые в примерах:
pre_get_posts
— позволяет модифицировать запрос перед тем, как будет выполнен реальный запрос к базе данных.the_excerpt_rss
— фильтрует содержание краткого описания для синдицированных лент.the_content_feed
— фильтрует содержание поста после его получения из баз�� данных и обработки через фильтрthe_content
.posts_where
— модифицирует часть WHERE SQL-запроса.post_limits
— модифицирует часть LIMIT SQL-запроса перед тем, как посты будут получены из базы данных.