Создание RSS-ленты для сервиса Яндекс.Турбо.
Данный плагин автоматически создаст на вашем сайте новую RSS-ленту (или несколько лент) для сервиса “Яндекс.Турбо” в полном соответствии с техническими требованиями Яндекса.
После установки плагина не забудьте проверить его настройки в “Настройках\Яндекс.Турбо”.
Чтобы добавить свою ленту в Яндекс.Турбо вам надо будет отправить заявку в Яндекс.Вебмастере (“Турбо-страницы\Источники”). И не забудьте перевести переключатель в положение “Вкл”.
Если вам понравился этот плагин, то, пожалуйста, поставьте ему 5 звезд.
Для плагина есть премиум-дополнение WPCase: Turbo Ads для неограниченной вставки рекламы на турбо-страницах.
Первое. Сравните оригинальную страницу и ее турбо-версию. Особое внимание уделите соответствию заголовков, картинок, наличию блока содержимого и прочего. Крайне рекомендую проверить опцию “Миниатюра в RSS” – не ставьте галку на этой опции, если в вашей теме в начале статьи не выводится “Изображение записи”. Очень желательно установить именно тот размер миниатюры, который используется вашей темой. Как Яндекс проверяет соответствие картинок мне неизвестно – возможно, что по названию файла. В таком случае выбор неправильного размера изображения может быть причиной бана.
Второе. Если вы используете механизм шаблонов в плагине, то проверьте, чтобы ваши шаблоны более-менее соответствовали обычным страницам. Механизм шаблонов нужен в основном для преобразования лэндинг-страниц, которые сверстаны в визуальных билдерах и не могут быть напрямую преобразованы в турбо-формат. А также для использования совместно с произвольными типами записей, использующими свои произвольные поля для хранения контента. В любом другом случае надо убедиться в том, что вы не злоупотребили механизмом шаблонов.
Третье. Скачайте Яндекс.Браузер – в нем есть такая опция, как “Режим чтения”. Если для вашего сайта эта опция доступна, то вы можете увидеть, как именно видит вашу страницу Яндекс. Сравните вашу страницу в режиме чтения с ее турбо-версией и отметьте для себя их отличия. Устраните отличия с помощью настроек плагина.
Четвертое. Не стесняйтесь писать Платонам и требовать от них четкого ответа, что именно не так с вашими турбо-страницами. Яндекс запустил проверку турбо-страниц, но работает она сейчас достаточно криво. Например, Яндекс ругается на отсутствие даты и дает для примера старую версию турбо-страницы и забанненую версию этой турбо-страницы. Самое удивительное – и там и там даты нет. Как можно ругаться на несоответствие дат, если и там и там их нет? Поэтому еще раз повторю, доставайте Платонов – пусть связываются с командой, работающей над турбо-страницами и узнают точную причину бана. В противном случае, велика вероятность, что Платоны на глазок определят проблему и в этом случае устранить бан турбо-страниц будет сложно.
Один из самых частых вопросов. Вы изменили настройки плагина, потом смотрите вашу RSS-ленту в браузере и не видите никаких изменений. Так происходит из-за того, что все браузеры кэшируют открытые RSS-ленты. Чтобы увидеть изменения надо произвести “жесткую” перезагрузку страницы. В браузерах это делается при нажатии клавиш Ctrl + F5.
RSS-лента для Яндекс.Турбо никогда не сможет пройти обычную валидацию, так как технические требования Яндекс.Турбо несовместимы со стандартами обычного RSS.
Проверять RSS-ленты надо в Яндекс.Вебмастере, в разделе “Турбо-страницы\Источники”. После добавления RSS-ленты Яндекс через пару минут выдаст свой “диагноз”.
Убедитесь, что вы выбрали хотя бы один тип записей и не перемудрили с настройками исключений. Если проблема не в этом, то откройте RSS-ленту в браузере и визуально убедитесь, что она открывается. Зачастую начинающие вебмастера отключают RSS-ленты (вручную или плагинами типа Clearfy), а потом удивляются тому, что RSS-ленты на сайте не работают.
Опытным путем установлено, что Яндекс ругается на стрелочки < и > (< и >), причем неважно закодированные они или нет. На вопрос, как это исправить Платоны посоветовали просто “забить”. Цитата:
“Такие предупреждения носят, в первую очередь, информационный характер. Насколько я вижу, в обоих случаях эти символы отображаются на Турбо-страницах корректно, поэтому подобные предупреждения можно игнорировать, они никак не повлияют на Турбо-версии страниц вашего сайта в выдаче.”
Установите любой из плагинов кэширования. Они все умеют кэшировать RSS-ленты.
Бывает, что боты Яндекса сходят с ума и начинают запрашивать RSS-ленты по паре раз в минуту – даже мощный сервер под такой нагрузкой может “лечь”. Убедить Платонов в том, что это ненормально практически невозможно, а поэтому установка плагина кэширования это единственный способ решить проблему излишней нагрузки.
Добавьте в robots.txt директиву:
Allow: /feed/turbo/
Где “turbo” это имя вашей RSS-ленты.
Учтите, что сервис Яндекс.Турбо кэширует полученный robots.txt, так что изменения в robots.txt он заметит не сразу!
В плагине есть фильтр yturbo_the_content для обработки контента записей.
Пример использования (добавьте этот код в файл functions.php вашей темы):
function yturbo_sign( $content ) { $rsspermalink = esc_url( apply_filters( 'the_permalink_rss', get_permalink() ) ); $sign = 'Сообщение "<a href="'.$rsspermalink.'">'.get_the_title_rss().'</a>" появилось сначала на "<a href="'.get_bloginfo_rss('url').'">'.get_bloginfo_rss('title').'</a>".'; $content .= $sign; return $content; } add_filter( 'yturbo_the_content', 'yturbo_sign' );
И вы получите подпись, аналогичную подписи от плагина Yoast SEO.
Добавляем кнопку в качестве “подписи”.
function my_yturbo_sign_buttons( $content ) { $sign = ' <p><b>ДОРОГИЕ ЧИТАТЕЛИ!</b></p> <p>Если вам необходимо с нами связаться — позвоните нам (круглосуточно).</p> <p><b>Это быстро и бесплатно!</b></p> <button formaction="tel:+74991111111" data-background-color="#5B97B0" data-color="white" data-primary="true">Москва</button> '; $content .= $sign; return $content; } add_filter( 'yturbo_the_content', 'my_yturbo_sign_buttons' );
Добавляем кнопку в виде шорткода.
function turbobutton_shortcode( $atts, $content ) { //получаем настройки плагина, чтобы узнать имя RSS-ленты $yturbo_options = get_option('yturbo_options'); $rssturboname = $yturbo_options['ytrssname']; //если это не наша RSS-лента, то шорткод будет удален if ( ! is_feed($rssturboname) ) return ''; //формируем кнопку шорткода $content = ' <button formaction="https://www.yandex.ru" data-background-color="#5B97B0" data-color="white" data-primary="true">Яндекс</button> '; return $content; } add_shortcode ( 'turbobutton', 'turbobutton_shortcode' );
Теперь вам достаточно добавить в контент код [turbobutton]
и в нужном месте записи будет выведена кнопка (только на турбо-страницах).
Замена указанной ссылки на кнопку.
Предположим, что у вас имеется конкретная ссылка и вы хотите ее заменить на кнопку на турбо-страницах. Например, ваша ссылка выглядит так:
<a class="phone" href="tel:+74959998877">+7(495)999-88-77</a>
Чтобы заменить ее на турбо-страницах на кнопку вам надо использовать код:
function yturbo_replace_link( $content ) { //что заменить $link = '<a class="phone" href="tel:+74959998877">+7(495)999-88-77</a>'; //на что заменить $button = '<button formaction="tel:+74959998877" data-background-color="#5B97B0" data-color="white" data-primary="true">+7(495)999-88-77</button>'; //производим замену $content = str_replace($link, $button, $content); return $content; } add_filter( 'yturbo_the_content', 'yturbo_replace_link' );
Замена всех ссылок на кнопки по регулярному выражению.
Предположим, что у вас есть однотипные ссылки вида:
<a class="buy" href="http://www.wptest.ru/buy_test/">Купить товар «Название товара»</a> <a class="buy" href="http://www.wptest.ru/buy_test2/">Купить товар «Название товара 2»</a>
Чтобы заменить их на кнопки на турбо-страницах вы должны использовать код:
function yturbo_replace_all_links( $content ) { //что заменить $pattern = '/<a class="buy" href="(.*?)">Купить товар «(.*?)»<\/a>/i'; //на что заменить $replacement = '<button formaction="$1" data-background-color="#5B97B0" data-color="white" data-primary="true">$2</button>'; //производим замену $content = preg_replace($pattern, $replacement, $content); return $content; } add_filter( 'yturbo_the_content', 'yturbo_replace_all_links' );
Если вам нужна будет помощь с регулярками, то спрашивайте на форуме плагина.
Есть 3 способа использования формы обратной связи:
а) Вы можете использовать “блок обратной связи” (включается в настройках плагина). Форма обратной связи будет выведена при клике на соответствующую кнопку в этом блоке.
б) Вы можете вывести готовую форму обратной связи прямо в контенте записи (шорткодом, выводимым только на турбо-страницах). Для этого используйте код:
function turbocontactform_shortcode( $atts, $content ) { //получаем настройки плагина, чтобы узнать имя RSS-ленты $yturbo_options = get_option('yturbo_options'); $rssturboname = $yturbo_options['ytrssname']; //если это не наша RSS-лента, то шорткод будет удален if ( ! is_feed($rssturboname) ) return ''; //создаем форму обратной связи //data-send-to должен содержать email, принадлежащий вашему домену //при заполнении data-agreement-company обязательно нужно указать и data-agreement-link $content = ' <form data-type="callback" data-send-to="[email protected]" data-agreement-company="ООО Ромашка" data-agreement-link="http://example.com"> </form> '; return $content; } add_shortcode ( 'turbocontactform', 'turbocontactform_shortcode' );
Форма обратной связи будет выведена в полном виде только на турбо-страницах при использовании шорткода [turbocontactform]
.
в) Вы можете вывести кнопку, при клике на которую будет выведена форма обратной связи (шорткодом, выводимым только на турбо-страницах). Для этого используйте код:
function turbocontactformbutton_shortcode( $atts, $content ) { //получаем настройки плагина, чтобы узнать имя RSS-ленты $yturbo_options = get_option('yturbo_options'); $rssturboname = $yturbo_options['ytrssname']; //если это не наша RSS-лента, то шорткод будет удален if ( ! is_feed($rssturboname) ) return ''; //создаем кнопку, выводящую по клику форму обратной связи //data-send-to должен содержать email, принадлежащий вашему домену //при заполнении data-agreement-company обязательно нужно указать и data-agreement-link $content = ' <button formaction="mailto:[email protected]" data-background-color="#5B97B0" data-color="white" data-primary="true" data-send-to="[email protected]" data-agreement-company="ООО Ромашка" data-agreement-link="http://example.com">Оставить заявку </button> '; return $content; } add_shortcode ( 'turbocontactformbutton', 'turbocontactformbutton_shortcode' );
Шорткод [turbocontactformbutton]
выведет кнопку “Оставить заявку”, при клике на которую будет открыта форма обратной связи (и кнопка и форма обратной связи будут выведены только на турбо-страницах).
В шаблонах записей можно использовать произвольные поля. Для этого достаточно обернуть название произвольного поля символами %% (пример – %%_aioseop_title%%). Однако, при использовании произвольных полей, созданных плагином Advanced Custom Fields зачастую получить значение этих произвольных полей затруднительно, так как ACF хранит многие поля в своем собственном формате. Как это обойти? В плагине есть фильтр шаблонов yturbo_the_template, которым можно воспользоваться.
Покажу на примере, предположим у вас в ACF созданы произвольное поля:
myimage – тип “Изображение”, возвращаемое значение “Массив изображения”.
steps – тип “Повторитель”, внутри есть произвольные поля:
image – тип “Изображение”, возвращаемое значение “Ссылка на изображение”;
text – тип “Текст”.
Если вы пропишите в шаблоне:
%%myimage%% %%steps%% %%post_content%%
То в результате получите что-то типа:
<p>92332</p> <p>контент записи</p>
То есть вместо картинки вы получили ID этого массива картинок, а поле типа “Повторитель” вообще было проигнорировано.
Вот для обработки таких нестандартных произвольных полей и нужен фильтр yturbo_the_template. Вот пример кода, обрабатывающего эти поля:
//обработка произвольных полей плагина ACF begin function yturbo_acf_template( $content ) { //обрабатываем только нужные нам поля (остальные обработает плагин RSS for Yandex Turbo) if (preg_match_all("/%%(.*?)%%/i", $content, $res)) { foreach ($res[0] as $r) { //обрабатываем поле %%myimage%% (заменяем его на результат работы функции ct_get_myimage) if($r == '%%myimage%%') { $content = str_replace($r, ct_get_myimage(), $content); } //обрабатываем поле %%steps%% (заменяем его на результат работы функции ct_get_steps() ) if($r == '%%steps%%') { $content = str_replace($r, ct_get_steps(), $content); } } } return $content; } add_filter( 'yturbo_the_template', 'yturbo_acf_template' ); //обработка произвольных полей плагина ACF end //обработка произвольного поля %%myimage%% begin function ct_get_myimage() { if ($field = get_field('myimage')) { $output = '<figure><img src="' . $field['sizes']['photo'] . '" /></figure>'; } return $output; } //обработка произвольного поля %%myimage%% end //обработка произвольного поля %%steps%% begin function ct_get_steps() { if ($items = get_field('steps')) { $count = 0; $i = 1; foreach ($items as $item) {$count++;} foreach ($items as $item) { $output .= '<h3>Шаг ' . $i . ' из ' . $count . ' </h3>'; $i++; $output .= '<figure><img src="' . $item['image'] . '" /></figure>'; $output .= $item['text']; } } return $output; } //обработка произвольного поля %%steps%% end
Принцип довольно простой и я думаю, что вам должно быть тут все понятно. Результатом этого кода будет что-то типа:
<figure><img src="http://site.com/wp-content/uploads/2018/06/cover-47.jpg" /></figure> <h3>Шаг 1 из 2 </h3> <figure><img src="http://site.com/wp-content/uploads/2018/06/cover-45.jpg" /></figure> <p>первое изображение</p> <h3>Шаг 2 из 2 </h3> <figure><img src="http://site.com/wp-content/uploads/2018/06/cover-38.jpg" /></figure> <p>второе изображение</p> <p>контент записи</p>
Учтите, что результат вывода вашего шаблона будет потом обработан фильтрами плагина. Это может вызвать определенные проблемы, так как фильтры плагина удалят всю лишнюю разметку, которая вам может быть нужна. Например, если вы пытаетесь создать турбо-галерею, а плагин каждую вашу картинку оборачивает в тег <figure>
, что портит разметку турбо-галереи. В таком случае вам нужно воспользоваться фильтром yturbo_before_ads
, который срабатывает почти в самом конце обработки контента записи прямо перед вставкой рекламы. Однако, ваши переменные не должны быть обернуты символами %% (их содержимое будет удалено при обработке шаблона). Воспользуйтесь любыми другими символами, чтобы отфильтровать потом вашу переменную.
а) [yt-permalink]
– выводит ссылку на текущую запись.
б) [yt-title]
– выводит заголовок текущей записи.
Если вам необходимы какие-то дополнительные шорткоды, то напишите об этом на форуме. Я обязательно постараюсь их добавить в следующей версии плагина.
Можно использовать код:
function yturbo_replace_src_links( $content ) { $pattern = '/src="\/(.*?)"/i'; $replacement = 'src="' . get_bloginfo('url') . '/$1"'; $content = preg_replace($pattern, $replacement, $content); return $content; } add_filter( 'yturbo_the_content', 'yturbo_replace_src_links' );
Этот код заменит все относительные ссылки на абсолютные.
Яндекс стал ругаться на несоответствие заголовков обычной страницы и ее турбо-версии, поэтому функция использования заголовков из SEO-плагинов была удалена из настроек плагина. Однако, если в вашей теме выводится не стандартный заголовок, а обработанный какими то функциями, то плагин не сможет его вывести – он всегда будет выводить стандартный заголовок, прописанный в редакторе. В этом случае вы можете воспользоваться фильтром yturbo_custom_title
.
Как его использовать? Самый простой вариант:
function my_custom_title_for_turbo( $title ) { //просто пример добавления "Статья: " к заголовку записи $title = 'Статья: ' . get_the_title(); return $title; } add_filter( 'yturbo_custom_title', 'my_custom_title_for_turbo' );
Но советую использовать более полный вариант, учитывающий требования Яндекса к заголовкам записей:
function my_custom_title_for_turbo( $title ) { //просто пример добавления "Статья: " к заголовку записи $title = 'Статья: ' . get_the_title(); //удаляем эмоджи (яндекс выдает на них ошибку) $title = yturbo_remove_emoji($title); //устанавливаем заголовком название сайта, если заголовок пустой $title = yturbo_empty_title($title); //преобразуем спец. символы в html-сущности $title = esc_html($title); //обрезаем заголовок по словам, чтобы не превышать ограничение в 240 символов $title = yturbo_cut_by_words(237, $title); return $title; } add_filter( 'yturbo_custom_title', 'my_custom_title_for_turbo' );
В этом случае будут выполнены все требования Яндекса к заголовкам записей.
По умолчанию в плагине можно удалить теги только из предустановленного списка тегов. В этом списке нет важных тегов вроде <p>
и <ul>
, так как их неосторожное удаление может привести к фатальным последствиям. Однако, в плагине есть фильтр, которым можно расширить список тегов для удаления и включить в него нужные вам теги. Делается это так:
function my_custom_tags_list( $tags ) { //скобки и пробелы недопустимы //не забываем запятую в начале $tags .= ',p,table,ul'; return $tags; } add_filter( 'yturbo_tags_list', 'my_custom_tags_list' );
В список можно включать только парные теги (имеющие тег закрытия). Самозакрывающиеся теги фильтром будут проигнорированы.
В некоторых темах (особенно старых) изображение записи может храниться в своем собственном произвольном поле. Чтобы вывести его на турбо-страницах надо использовать примерно такой код:
function my_yturbo_thumb_imgurl($imgurl) { //вместо 'url-image' подставьте название вашего произвольного //поля с ссылкой на изображение $imgurl = get_post_meta( get_the_ID(), 'url-image', true); return $imgurl; } add_filter('yturbo_thumb_imgurl', 'my_yturbo_thumb_imgurl'); function my_yturbo_thumb_caption($caption) { //вместо 'caption-image' подставьте название вашего произвольного //поля, где хранится подпись к изображению $caption = get_post_meta( get_the_ID(), 'caption-image', true); return $caption; } add_filter('yturbo_thumb_caption', 'my_yturbo_thumb_caption');
Подпись к изображению необязательна и не будет выведена, если ее нет.
Важно! Изображение из произвольного поля будет выводиться только, если включен вывод “Миниатюр в RSS” (любого размера, это не важно) и только если не установлено изображение через “родной” функционал WordPress.