Настройка Турбо страниц для Яндекса (Готовое решение)

Долго разбирался как настроить Турбо страницы для Яндекса. Много разного мануала нашел, в итоге решил поделиться тем, что у меня получилось. Не судите строго.
Может кто-то что-то подскажет, как реализовать проще или что-то улучшить. Может кому-то помогут мои наработки.
Рейтинга не хватило разместить в разделе Готовые решения или Пошаговые инструкции, оставляю в Вопросах.

1) Создаем Шаблон, я назвал его TurboYandex.
2) Код шаблона:
<!--?xml version="1.0" encoding="utf-8"?-->
<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>[[++site_name]]</title>
<link>[[++site_url]]</link>
<description>[[*description]]</description>
<language>ru</language>
[[!pdoPage?
    &parents=`4`
    &tpl=`tpl.turborss`
    &tvPrefix=`tv.`
    &includeTVs=`cover,rubric`
]]
</channel>
</rss>
3) Код чанка tpl.turborss
<item turbo="true">
<link>{$_modx->config.site_url ~ $id | url}</link>
<title>{'!rssText' | snippet : [ 'cnt' => ( $longtitle ?: $pagetitle ) ]}</title>
<pubDate>{$publishedon | date : 'D, d M Y G:i:s +0300'}</pubDate>
<turbo:content>
<![CDATA[
<header>
<figure>
<img src="{$_modx->config.site_url ~ $id | resource : 'cover' | phpthumbon : 'w=640'}" />
</figure>
<h1>{($longtitle ?: $pagetitle)}</h1>
</header>
{'!rssCDATA' | snippet : [ 'cnt' => ( $id | resource : 'content' | replace : '"assets/' : ('"' ~ $_modx->config.site_url ~ 'assets/') ) ]}
]]>
</turbo:content>
</item>
4) Код сниппета rssText:
<?php
if(empty($cnt)) return '';
$output = str_replace( [ '&', '<', '>', '"', '\'' ], [ '&', '>', '<', '"', '\'' ], html_entity_decode($cnt) );
return $output;
5) Код сниппета rssCDATA:
<?php
if(empty($cnt)) return '';
$output = preg_replace( '/<a\s.*class="pseudo".*>(.+)<\/a>/U', '$1', $cnt );
$output = preg_replace( '/<a\s.*><\/a>/', '', $output );
return $output;
6) Создаем ресурс, тип содержимого ему задаем XML и устанавливаем для него наш созданный шаблон TurboYandex. URL я задал для него turborss.xml и заморозил.
7) В коде шаблона:
&parents=`4`
&tpl=`tpl.turborss`
&tvPrefix=`tv.`
&includeTVs=`cover,rubric`
Задаем своего родителя, нужные TV и параметры. И соответственно их подправляем в чанке tpl.turborss
8) В настройках web-мастера яндекса указываем ссылку на наш ресурс turborss.xml

Я делал это для статейного раздела на сайте. Вот как это выглядит в поиске:


Соответственно захламлять и ставить турбо страницы на все, я не советую, лучше вывести так горячие товары, новости, акции или услуги сайта, но это не точно)

Жду критики и конструктивных комментариев.
Андрей Шевяков
30 июня 2019, 15:45
modx.pro
12
9 040
+2
Поблагодарить автора Отправить деньги

Комментарии: 21

Сергей
30 июня 2019, 15:51
+1
Спасибо, решение крутое.
Поблагодарил автора!!))
Павел Романов
30 июня 2019, 15:54
+1
В данном случае нет нужды использовать pdoPage — у Вас же нет пагинации.
Делайте через кешируемый pdoResources и добавьте &limit, а то по умолчанию у Вас 10 ресурсов только выведется.
И коль уж Вы используете для картинки вывод через resource:
<img src="{$_modx->config.site_url ~ $id | resource : 'cover' | phpthumbon : 'w=640'}" />
..., а TV rubric не используете вовсе, уберите из вызова includeTVs — в этом смысла нет (только увеличивает нагрузку).

...
[[pdoResources?
    &parents=`4`
    &tpl=`tpl.turborss`
    &limit=`0`
]]
...
Вячеслав
17 марта 2020, 00:23
0
Обрезает тег /link и автоматически комментирует <![CDATA[, что делать?
    Misha Bulic
    20 мая 2020, 12:52
    0
    Спасибо за решение, всё работает. Настроил под себя.
    Один вопрос возник у меня: как реализовать похожие записи в tpl.turborss. pdoNeighbors не получилось заставить работать. Есть ли какие нибудь решения тут? получается pdoNeighbors мы запускаем внутри pdoResources.
      Андрей Шевяков
      20 мая 2020, 14:01
      0
      Ну сниппет pdoNeighbors должен работать внутри чанка tpl.turborss. Вопрос только в том, что возможно не проходит сама валидность кода для Турбо Яндекса.
      Покажите как выыводите.
        Misha Bulic
        20 мая 2020, 14:10
        0
        из доки надо делать так: yandex.ru/dev/turbo/doc/rss/elements/read-also-docpage/
        {'pdoNeighbors' | snippet : [
        				'limit' => '3',
        				'tvPrefix' => '',
        				'includeTVs' => 'pro,image1',
        				'tplWrapper' => '@INLINE {$prev}{$next}',
        				'tplPrev' => '@FILE elements/chunks/card.tpl',
        				'tplNext' => '@FILE elements/chunks/card.tpl',
        				]}
        card.tpl
        <div data-block="feed-item"
                 data-title="{$pagetitle}"
                 data-href="{$uri}"
                 data-thumb="{$_modx->config.site_url ~ $id | resource : 'image1'}"
                 data-thumb-position="top"
                 data-thumb-ratio="16x10">
            </div>
          Андрей Шевяков
          20 мая 2020, 14:20
          0
          а весь код чанка tpl.turborss?
            Misha Bulic
            20 мая 2020, 14:22
            0
            весь остальной код работает нормально. Тут только в этом проблема. Он не выводит картинку. и очень странно берёт соседей, не от своего родителя, а выше.
              Андрей Шевяков
              20 мая 2020, 14:27
              0
              Попробуйте так:

              {'pdoNeighbors' | snippet : [
                                              'id' => $id,
              				'limit' => '3',
              				'tvPrefix' => '',
              				'includeTVs' => 'pro,image1',
              				'tplWrapper' => '@INLINE {$prev}{$next}',
              				'tplPrev' => '@FILE elements/chunks/card.tpl',
              				'tplNext' => '@FILE elements/chunks/card.tpl',
              				]}

              card.tpl
              <div data-block="feed-item"
                       data-title="{$pagetitle}"
                       data-href="{$uri}"
                       data-thumb="{$image1}"
                       data-thumb-position="top"
                       data-thumb-ratio="16x10">
                  </div>

              И еще важно:
              Корневой div data-block=«feed» должен содержать хотя бы один вложенный div data-block=«feed-item».
                Misha Bulic
                20 мая 2020, 17:25
                +1
                Да, спасибо помогло. Финальный вариант выглядит так:
                <div data-block="feed" data-layout="horizontal" data-title="Похожие">
                            {'pdoNeighbors' | snippet : [
                            'id' => $id,
                            'limit' => '3',
                            'tvPrefix' => '',
                            'includeTVs' => 'image1',
                            'tplWrapper' => '@INLINE {$prev}{$next}',
                            'tplPrev' => '@FILE elements/chunks/turbocard.tpl',
                            'tplNext' => '@FILE elements/chunks/turbocard.tpl',
                            ]}
                        </div>
                turbocard.tpl
                <div data-block="feed-item"
                     data-title="{$pagetitle}"
                     data-href="{$_modx->config.site_url ~ $id | url}"
                     data-thumb="{$_modx->config.site_url ~ $id | resource : 'image1'}"
                     data-thumb-position="top"
                     data-thumb-ratio="16x10">
                </div>
      давид
      08 ноября 2020, 07:09
      0
      " {'pdoNeighbors' | snippet: [
      'id' => $id,
      'limit' => '3',
      'tvPrefix' => '',
      'includeTVs' => 'image1',
      'tplWrapper' => '@INLINE {$prev}{$next}',
      'tplPrev' => '@FILE elements/chunks/turbocard.tpl',
      'tplNext' => '@FILE elements/chunks/turbocard.tpl',
      ]}
      "
      Подскажите пожалуйста этот код нужно добавлять в Сниппет: pdoNeighbors или в шаблон?
        Shedko Denis
        25 января 2021, 13:15
        0
        Настроил согласно этой инструкции, но появился вопрос.

        В текст статьи по этому коду:
        {'!rssCDATA' | snippet : [ 'cnt' => ( $id | resource : 'content' | replace : '"assets/' : ('"' ~ $_modx->config.site_url ~ 'assets/') ) ]}
        уходит экранированный текст, где все тэги «побиты»
        <p><img src="/img/lys.jpg" width="300" alt="Монтаж люстры" align="right"   vspace="0" hspace="5">
        <p>Теперь Вам достаточно просто обратиться в нашу компанию. Больше нет необходимости в поиске электрика, наши специалисты сделают это для Вас.</p>
        <h2>Монтаж люстры</h2>
        <p>Все <b> люстры </b> крепятся практически одинаково, приведем три примера.</p>


        Подскажите, что я сделал не так )
          Shedko Denis
          26 января 2021, 18:58
          0
          Решил созданием сниппета GetPageContent с кодом

          <?php
          $resource = $modx->getObject("modResource", array("id" => "$input"));
          return $resource->get("content");
          и вызовом
          [[!GetPageContent? &input={$id}]]
          Матвей
          02 октября 2021, 02:33
          0
          Яндекс ругается, что не генерирует главную страницу…
          При добавлении её в resources — генерирует только ее...(

          Что может быть?
            Андрей Шевяков
            02 октября 2021, 09:09
            0
            Вы можете посмотреть, что именно не так через вебмастер Яндекс, покажет какие ошибки:
            антон
            19 февраля 2024, 21:04
            0
            пробовал не выводит что не так делаю подскажите
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            21