Как отредактировать фид RSS WordPress

19 Мар 2023г. в 12:36

Представьте себе, что вы можете улучшить ваш фид RSS в WordPress? Хотите, чтобы он содержал больше (или меньше) контента? Или добавить несколько дополнительных деталей в конец вашей заметки?

В данном уроке будет показано, как:

Включить в фид и записи и страницы.
Добавить миниатюры к вашему фиду.
Исключить записи с определенными метками
Установить сколько записей будут появляться в вашем фиде (без влияния на остальную часть сайта).
Показывать только записи из определенной категории.
Добавить контент в конец каждой записи (например, ссылку на вашу последнюю особенную запись).
Все это выполняется в файле functions.php темы, используемой на вашем сайте. Если такого файла нет, просто создайте его в папке темы! (Помните, что в статье приведен код PHP).

Включаем страницы в фид WordPress
Нужно добавить фильтр WordPress, когда он ищет записи. Фильтр проверяет, предназначена ли запись для фида, и если это так, то используется запрос для добавления и записи и страницы.

1
function feedFilter($query) {
2
if ($query->is_feed) {
3
$query->set('post_type','any');
4
}
5
return $query;
6
}
7
add_filter('pre_get_posts','feedFilter');
Если вы хотите показывать только страницы, то нужно изменить слово ‘any’ на ‘page’ (или на имя любого произвольного типа заметок, который вы создали).

Если нужно показывать только страницы верхнего уровня, то нужно использовать следующий код:

1
function feedFilter($query) {
2
if ($query->is_feed) {
3
$query->set('post_type','any');
4
$query->set('post_parent','0');
5
}
6
return $query;
7
}
8
add_filter('pre_get_posts','feedFilter');
Добавляем миниатюры к фиду RSS
Обработка в этот раз немного отличается. Нам снова нужно добавить фильтр к запросу и проверять, назначена ли страница для фида RSS. Но в этот раз надо добавить фильтр к the_content (то есть контенту записи).

function feedFilter($query) {
if ($query->is_feed) {
add_filter('the_content', 'feedContentFilter');
}
return $query;
}
add_filter('pre_get_posts','feedFilter');

function feedContentFilter($content) {
$thumbId = get_post_thumbnail_id();
if($thumbId) {
$img = wp_get_attachment_image_src($thumbId);
$image = '<img align="left" src="'. $img[0] .'" alt="" width="'. $img[1] .'" height="'. $img[2] .'" />';
echo $image;
}
return $content;
}
Для изображения используется align="left", чтобы придать выводу форматированный вид. Многие читатели фида RSS будут отключать использование CSS, но использование старого доброго атрибута должно сработать.

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

add_image_size('feed', 600, 100, true);
Затем нужно будет поменять строчку в коде фильтра на:

$img = wp_get_attachment_image_src($thumbId, 'feed');
Как исключить записи с определенной меткой
В этот раз мы будем делать операцию, очень похожую на первый пример. Будет использоваться ‘set’ для настройки объекта запроса.

Нюанс заключается в том, что нужно сначала получить ID метки, которую надо исключить. Для этого нужно перейти в консоли администратора на панель Записи > Метки, затем найти нужную метку и нажать на ней кнопку мыши. В строке адреса браузера id метки можно найти в конце URL. Она будет выглядеть примерно так: &tag_ID=29

В нашем примере мы исключаем записи с меткой, ID которой имеет значение 29.

function feedFilter($query) {
if ($query->is_feed) {
$tags = array('29');
$query->set('tag__not_in', $tags);
}

return $query;
}
add_filter('pre_get_posts','feedFilter');
Если нужно исключить записи, соответствующие нескольким метками, то делается это так:

$tags = array('29', '31', '124');
Контролируем, сколько записей появятся в фиде
В панели администратора на панели Параметры > Чтение можно установить, сколько записей будет показано на страницах сайта и в фиде. Однако, часто требуется показывать в фиде больше записей, чем выводится на сайте.

Например, сайт может выглядеть отлично с 3 или 4 записями на странице, но вы хотите выводить большее количество в фид!

Для этого можно использовать код:

function feedFilter($query) {
if ($query->is_feed) {
$query->set('posts_per_page','20');
}
return $query;
}

add_filter('pre_get_posts','feedFilter');
Число 20 можно заменить на любое, какое нужно.

Показываем записи только из одной категории
Обычно в блогах не используются такие функции, но если WordPress служит в качестве CMS, то может возникнуть желание публиковать записи только из категории "blog". В таком случае можно использовать следующий код:

function feedFilter($query) {
if ($query->is_feed) {
$query->set('category_name', 'blog');
}

return $query;

}

add_filter('pre_get_posts','feedFilter');
Можно также исключать записи любой заданной категории, только нужно использовать соответствующие установки:

$query->set('cat', '-45');
В данном случае исключаются записи из категории с ID 45. Знак "минус" нужен непременно, так как без него будут исключаться записи из категории с именем "45".

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

function feedFilter($query) {
if ($query->is_feed) {
add_filter('the_content','feedContentFilter');
}
return $query;
}
add_filter('pre_get_posts','feedFilter');

function feedContentFilter($content) {
$content .= '<p>Спасибо за внимание. Следите за блогом <a href="'. get_bloginfo('url') .'">'. get_bloginfo('name') .'</a>!</p>';
return $content;
}
Теперь давайте сделаем что-нибудь более интересное. Допустим у вас есть слайдер специального контента на сайте, или список специальных записей на боковой панели, и нужно сделать так, чтобы при размещении записи добавлялась метка на эти особенные записи.

В этом примере мы будем добавлять строку к записи в фид:

"Не пропустите наш последний специальный материал: 'заголовок записи'"

В функции feedContentFIlter мы будем формировать запрос на получение последней особенной записи с меткой "featured". А затем мы будем использовать объект записи для установки заголовка и адреса.

function feedFilter($query) {
if ($query->is_feed) { add_filter('the_content','feedContentFilter');
}
return $query;
}
add_filter('pre_get_posts','feedFilter');

function feedContentFilter($content) {

$args = array(
'numberposts' => 1,
'tag' => 'featured'
);
$posts = get_posts($args);
if($posts) {
foreach($posts as $post) {
$content .= '<p>Не пропустите наш последний специальный материал: <a href="'. get_permalink($post->ID) .'">'. $post->post_title .'</a>!</p>';
}
}
return $content;
}
Вы можете изменить функцию так как нужно, например, добавить встроенные правила CSS для форматирования строки.