Создание RSS канала в WordPress для Турбо страниц. Без плагинов

Предыстория. После установки и тестирования нескольких бесплатных плагинов, я начал создание RSS канала в WordPress для Турбо страниц, самостоятельно, без плагинов. Не то чтобы плагины мне не понравились, они отличные, заполнил несколько полей и канал готов. Для людей, не знакомых с программированием вещь необходимая. Но, мне хотелось большего. Например кнопки «Поделиться», и я начал делать.

В этой статье я покажу по шагам способ создания RSS канала для Турбо-страниц не для новичков. Необходимы хотя бы минимальные знания  PHP.

Первое, что нужно сделать, создать новый фид. Согласно моей файловой структуре, в папке inc я создал файл custom-rss.php, и подключил его в файле functions.php.

<?php defined( 'ABSPATH' ) or exit;

add_action('init', 'yaturbo_rss_feed');
function yaturbo_rss_feed(){
    add_feed('yaturbo', 'yaturbo_callback_function');
}

В функции add_feed() я указал название ленты yaturbo и название функции yaturbo_callback_function, которая будет формировать эту самую ленту.

Далее пишем функцию формирования ленты. Я решил создать шаблон в отдельном файле, поэтому в custom_rss.php просто дописал три строки:

function yaturbo_callback_function(){
	get_template_part( 'inc/templates/yaturbo-rss' );
}

Дальше все манипуляции с шаблоном в созданном файле yaturbo-rss.php. Скачать полный файл можно на GitHub по ссылке -> https://github.com/okkey45/yaturbo

Создаем цикл на основе WP_Query:

$posts_args = array(
	'post_type' 		=> array('post', 'project'),
	'post_status'   	=> 'publish',
	'posts_per_page' 	=> 500,
);

$yaturbo_rss = new WP_Query( $posts_args );

if ( $yaturbo_rss->have_posts() ) :

    // Здесь будет заголовок RSS канала

    while( $yaturbo_rss->have_posts()) : $yaturbo_rss->the_post();

    // Формируем вывод отдельной записи

    endwhile;
endif; wp_reset_postdata()

Мне необходимо, чтобы выводились записи двух типов, поэтому в post_type я прописал post и project, и ограничил количество выводимых постов в ленте. Яндекс уже анонсировал API для турбо страниц, поэтому я не стал заморачиваться с пагинацией, буду ждать релиза.

Формируем заголовок для канала.

Отличие от стандартной ленты в теге rss и добавленных парных тегов yandex:analytics. Все элементы RSS канала для Турбо страниц можно посмотреть в помощи Яндекса -> https://yandex.ru/support/webmaster/turbo/rss-elements.html

if ( $yaturbo_rss->have_posts() ) :

header('Content-Type: ' . feed_content_type('rss') . '; charset=' . get_option('blog_charset'), true);
echo '<?xml version="1.0" encoding="'.get_option('blog_charset').'"?>';
?>
<rss xmlns:yandex="http://news.yandex.ru" xmlns:media="http://search.yahoo.com/mrss/" xmlns:turbo="http://turbo.yandex.ru" version="2.0">
<channel>
<title><?php bloginfo_rss('name'); ?></title>
<link><?php bloginfo_rss('url'); ?></link>
<description><?php bloginfo_rss("description"); ?></description>
<language>ru</language>
<yandex:analytics id="Номер счетчика Метрики" type="Yandex"></yandex:analytics>
<yandex:analytics id="Номер счетчика Гугла" type="Google"></yandex:analytics>

<?php while( $yaturbo_rss->have_posts()) : $yaturbo_rss->the_post();

// Формируем вывод отдельной записи

<?php endwhile; ?>
</channel>
</rss>
<?php endif; wp_reset_postdata();

Формируем вывод отдельной записи в RSS ленте.

Начало более чем стандартное за исключением тега item, в котором необходимо прописать параметр turbo=true, и обернуть контент в парный тег turbo:content.

<item turbo="true">
<title><?php the_title_rss();?></title>
<link><?php the_permalink_rss();?></link>
<pubDate><?php echo mysql2date('D, d M Y H:i:s +0000', get_post_time('Y-m-d H:i:s', true), false); ?></pubDate>
<author><?php the_author(); ?></author>
<description><?php the_excerpt_rss();?></description>
<enclosure url="<?php the_post_thumbnail_url('full');?>" />
<turbo:content>
<![CDATA[

// Вывод контента

]]>
</turbo:content>
</item>

Очистим запись от ненужных тегов, оставим, разрешенные для отображения в Турбо-страницах. В изображениях удаляем всё, кроме ссылки на само изображение.

<?php
	$allowed_html = array(
			'figure', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p', 'br', 'ul', 'ol', 'li', 'b', 'strong', 'i', 'em', 'sup',
			'sub', 'ins', 'del', 'small', 'big', 'pre', 'abbr', 'u', 'figcaption', 'video',

			'source' => array(
				'src' => true,
				'type' => true,
			),
			'a' => array(
				'href' => true,
			),
			'img' => array(
				'src' => true,
			)
		);
	$item_content = force_balance_tags( the_content() );
	$item_content = wp_kses( $item_content, $allowed_html);
	$item_content = preg_replace( '/^\s*\/\/<!\[CDATA\[([\s\S]*)\/\/\]\]>\s*\z/', '$1', $item_content );
	$item_content = preg_replace('/<!--(.|\s)*?-->/', '', $item_content);
	$item_content = preg_replace("/(<img\s(.+?)\/?>)/is", "<figure>$1</figure>", $item_content);
?>

Посмотрев предыдущий фрагмент кода внимательный читатель скажет: — «А в 17-й строке нужно было использовать функцию get_the_content()». Эта еще одна причина, почему я занялся созданием RSS канала в WordPress для Турбо страниц без плагинов. Дело в том, что именно эта тема при использовании вышеупомянутой функции удаляет все теги параграфа, хотя они прописаны в разрешенных, и валидатор турбо-страниц выбрасывает из поиска такие страницы с ошибкой:

Содержимое Турбо-страницы не соответствует оригинальной версии (в элементе turbo:content текст не разбит на абзацы)

Следующий шаг состоит из шести строк, которые содержат header, контент записи, и те самые кнопки «Поделиться».

<header>
<figure><img src="<?php the_post_thumbnail_url( 'thumb-900x450' ); ?>" /></figure>
<h1><?php the_title_rss();?></h1>
</header>
<?php echo $item_content; ?>
<div data-block="share" data-network="facebook, vkontakte, telegram, odnoklassniki, google, twitter"></div>

Очередность кнопок можно менять, в зависимости от вашего предпочтения. Учтите, на странице видно три кнопки, остальные скрыты за кнопкой «Еще».

Казалось, цель достигнута, можно остановиться. Но нет, Яндекс разрешает выводить похожие записи. Делаем. Здесь совсем просто. Мне необходимо выводить по 2 записи из этой же категории.

Категории и метки у меня выводятся в нескольких шаблонах, поэтому в файле theme-support.php заготовлена вот такая функция

function chalinclub_get_terms_slug( $postID, $term ){

	$terms_list = wp_get_post_terms( $postID, $term );
	$output = '';

	$i = 0;
	foreach ( $terms_list as $term ){ $i++;
		if( $i > 1 ){ $output .= ', '; }
		$output .= $term->slug;
	}

	return $output;

}

Воспользуемся ей для вывода записей только из категории, к которой принадлежит просматриваемая запись.  Сразу после закрывающего тега turbo:content пишем код:

<?php
	$categories = chalinclub_get_terms_slug( $post->ID, 'category' );

    $args = array (
        'post_type'         => 'post',
        'category_name'     => $categories,
        'post__not_in'      => array($post->ID),
        'posts_per_page'	=> 2,
        'post_status'       => 'publish',
        'orderby'       	=> 'rand',
    );

    $rel_post = new WP_Query( $args );
    if ( $rel_post->have_posts() ) :
    	echo '<yandex:related>';
    	while ( $rel_post->have_posts() ) : $rel_post->the_post(); ?>
    		<link url="<?php the_permalink(); ?>" img="<?php the_post_thumbnail_url('thumb-450x225'); ?>"><?php the_title(); ?></link>
    	<?php endwhile;
    	echo '</yandex:related>';
    endif; wp_reset_postdata();
?>

В аргументах указываем, что нам необходимы посты из этой же категории в количестве двух штук, и исключаем попадание текущей записи в «похожие».

Фид готов, и будет доступен по адресу //ваше_доменное_имя/feed/yaturbo. Перед первым открытием данной страницы необходимо зайти в админ панель сайта -> Настройки -> Постоянные ссылки и нажать кнопку «Сохранить», чтобы переписались правила построения ссылок. Или в файле с функцией инициализации фида написать следующий ниже код, открыть по ссылке RSS-канал, после чего код удалить или закомментировать.

global $wp_rewrite;
$wp_rewrite->flush_rules();

Есть предложения, исправления или вопросы? Пишите в комментариях, обязательно обсудим.

Всего комментариев - 6.

    1. Натали, я начал писать решение для AMP, но на данном этапе в моей практике не было задач, с которыми бы не справлялся плагин Accelerated Mobile Pages. Поэтому допиливание решения отложено на неопределенный срок. Ссылка на плагин -> https://ru.wordpress.org/plugins/accelerated-mobile-pages/

      1. Тут вы правы. Accelerated Mobile Pages отличный. Плагины турбо-страниц также хорошо справляются со своими функциями. Но некоторые же любят самостоятельно «поковыряться» в коде.))

        1. Главное со знанием дела «ковырять в коде», и только в тех случаях, когда без собственного вмешательства не получить необходимого результата. В остальных случаях есть множество плагинов для расширения функционала WordPress, как платных, так и бесплатных.

  1. Есть во всех этих плагинах, и в вашем решении тоже, одно но….»Не все проиндексированные страницы вашего сайта отображаюися в турбо страницах»
    — это главная
    — это категории

    1. Есть же кнопка включения автоматической главной в настройках Турбо-страниц. Выдержка из документации: «Для статейных Турбо-страниц можно включить автоматическую главную страницу. На ней отображаются:
      Список страниц вашего сайта. Список сортируется по новизне и обновляется раз в полчаса.
      Для формирования списка необходимо минимум 10 опубликованных статей за последний год.
      Реклама.
      Рекламные блоки на главной странице размещаются автоматически.»

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

      А на счет предупреждения Яндекса, так он и про то что реклама на турбо-страницах не установлена тоже в предупреждения кидает «Не настроена реклама. Вы можете использовать РСЯ или другие рекламные системы через AdFox (бесплатно).» :).

Добавить комментарий для Натали Отменить ответ

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

*
*
*

Нажимая кнопку «Отправить комментарий» я даю свое согласие на использование и обработку моих персональных данных в соответствии с ч. 1 ст. 9 ФЗ от 27.07.2006 г. № 152 «О персональных данных»