Как кастомизировать RSS-ленту в WordPress: 10 способов

# 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;
    }

    После установки кода необходимо сбросить правила переписывания в настройках пермалинков.


    Хуки, используемые в примерах:

    1. pre_get_posts — позволяет модифицировать запрос перед тем, как будет выполнен реальный запрос к базе данных.
    2. the_excerpt_rss — фильтрует содержание краткого описания для синдицированных лент.
    3. the_content_feed — фильтрует содержание поста после его получения из баз�� данных и обработки через фильтр the_content.
    4. posts_where — модифицирует часть WHERE SQL-запроса.
    5. post_limits — модифицирует часть LIMIT SQL-запроса перед тем, как посты будут получены из базы данных.

    Leave a Reply

    Ваш адрес email не будет опубликован. Обязательные поля помечены *