Турбо-страницы для MODx Evolution, MODx Revolution
Не секрет, что Турбо-страницы для вебсайта, которому нужен поисковый трафик и хорошие ПФ на мобильных, становятся обязательным признаком качества, а, возможно, стали еще в 2017-2018 гг.
Простейший фид для текстовых страниц создать достаточно легко.
Нужно создать страницу с пустым шаблоном примерно такого содержания:
<?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>Веб-студия - агентство маркетинга - CapWeb</title> <link>https://capweb.ru/</link> <description>Рекламное агентство CapWeb - интернет-маркетинг полного цикла - веб-разработка - веб-дизайн - 8(968)000-10-11</description> <turbo:cms_plugin>C125AEEC6018B4A0EF9BF40E6615DD1791</turbo:cms_plugin> <turbo:analytics id="34865895" type="Yandex"></turbo:analytics> <turbo:analytics id="UA-58169051-1" type="Google"></turbo:analytics> <language>ru</language>[[Ditto? &start=`0` &total=`500` &parents=`3595` &filter=`id,3669,2` &tpl=`tpl.turbo` &language=`english-UTF8` &display=`all` &total=`all` &depth=`2` &showInMenuOnly=`0` &showPublishedOnly=`1` &sortBy=`pubdate` &sortDir=`ASC` &where=`type IN ('document')`]]
В настройках страницы нужно указать тип содержимого rss+xml
Теперь что касается шапки фида.
В строки аналитики нужно вставить идентификаторы Яндекс.Метрики и Google Analytics.
С title, description все понятно - можно взять их с главной страницы вашего сайта или добавить фразу - turbo-страницы.
В тег link можно просто вбить адрес сайта, но этот вариант менее гибкий, хотя при переходе на https или смене доменного имени так или иначе нужно будет править адреса в базе.
Рассмотрим параметры Ditto. start и total определяют начало и конец выборки. Если документов более 500, лучше создать несколько страниц с фидами по 500 в каждом. Это связано с ограничениями Яндекса https://yandex.ru/dev/turbo/doc/rss/quota-docpage/
[[Ditto? &start=`0` &total=`500` &parents=`3595` &filter=`id,3669,2` &tpl=`tpl.turbo` &language=`english-UTF8` &display=`all` &total=`all` &depth=`2` &showInMenuOnly=`0` &showPublishedOnly=`1` &sortBy=`pubdate` &sortDir=`ASC` &where=`type IN ('document')`]]
В этом примере я выбираю документы из ветки "Услуги", id родителя 3595, помимо документов в ветке есть ссылки, поэтому использую параметр where, задающий тип документа. Как вариант можно задать также номер шаблона, если в фиде нужно выбрать, например, все товары, хотя Яндекс рекомендует для товаров использовать YML-фид вместо RSS. Параметры глубины выборки, отображения отключенных для показа в меню и отключенных для публикации могут задаваться в зависимости от особенностей ваших веток.
[!Ditto? &start=`0` &total=`500` &parents=`3540` &depth=`1` &tpl=`tpl.turbo-m` &language=`english-UTF8` &display=`all` &total=`all` &showInMenuOnly=`0` &showPublishedOnly=`1` &sortBy=`pubdate` &sortDir=`ASC` &where=`template=8`!]
Обратите внимание на английский язык в языковых настройках сниппета. Это не опечатка, а необходимость для правильности формата даты.
Теперь что касается шаблона элементов RSS-канала tpl.turbo.
<item turbo="true"> <title>[+pagetitle+]</title> <link>https://capweb.ru[!urlturbo? &id=`[+id+]`!]</link> <turbo:topic>[+pagetitle+]</turbo:topic> <turbo:source>https://capweb.ru[!urlturbo? &id=`[+id+]`!]</turbo:source> <pubDate>[+editedon:date=`%a, %d %b %Y %H:%M:%S`+] +3000</pubDate> <turbo:content> <![CDATA[ <header> <h1>[+pagetitle+]</h1> </header> [+content+] {{turbo-add}} ]]></turbo:content> </item>
Чанк turbo-add содержит все, что рекомендует Яндекс: кнопку звонка, кнопки соцсетей, форму обратной связи и т. д. Примеры есть в справке Яндекса.
<button formaction="tel:+7(123)456-78-90" data-background-color="#5B97B0" data-color="white" data-primary="true">Заказать столик</button> <div data-block="widget-feedback" data-stick="false"> <div data-block="chat" data-type="whatsapp" data-url="https://whatsapp.com"></div> <div data-block="chat" data-type="telegram" data-url="http://telegram.com/"></div> <div data-block="chat" data-type="vkontakte" data-url="https://vk.com/"></div> <div data-block="chat" data-type="facebook" data-url="https://facebook.com"></div> <div data-block="chat" data-type="viber" data-url="https://viber.com"></div> </div> <p>Наш адрес: <a href="#">Nullam dolor massa, porta a nulla in, ultricies vehicula arcu.</a></p> <p>Фотографии — https://capweb.ru/lookbook.html</p>
Вот как это упрощенно сделано у меня:
<button formaction="tel:+8(968)000-10-11" data-background-color="#5B97B0" data-color="white" data-primary="true">Позвонить</button> <div data-block="widget-feedback" data-stick="false"> <div data-block="chat" data-type="whatsapp" data-url="https://api.whatsapp.com/send?phone=79101405090"></div> <div data-block="chat" data-type="viber" data-url="https://viber://chat?number=79101405090"></div> <div data-block="chat" data-type="vkontakte" data-url="https://vk.com/capweb"></div> <div data-block="chat" data-type="facebook" data-url="https://www.facebook.com/capweb"></div> </div>
Если в число перебираемых Ditto документов входит главная страница, пригодится мой сниппет для избавления от /index.html. Возможно, у вас эта задачка решена лучше, но я применил такой костыль.
Код сниппета urlturbo:
<?php //$s = (!empty($_GET['id']) && is_numeric($_GET['id'])) ? (int) $_GET['id'] : $s; $s = (isset($id)) ? $id : $modx->documentIdentifier; $s = (int)$s; $do=$modx->getDocument($s); //var_dump($do["type"]); //echo $do["alias"]; //echo $modx->documentIdentifier; //echo "Now viewing :".$modx->documentIdentifier; if(($s==1)|($s==3070)) echo ''; else //echo '/'.$modx->getDocument($s)["alias"].'.html'; //echo $modx->getDocument($s)["alias"]; echo "/".$do["alias"].".html"; ?>
Если таких сложностей в вашем случае нет, адрес в ссылке задается стандартно: https://capweb.ru/[~[+id+]~]
Когда нужно исключить отображение определенных страниц в фиде, просто переберите их в отдельном Ditto и используйте аналогичный чанк tpl.turbo с шаблоном, где прописано turbo="false" вместо turbo="true". Лишние элементы, конечно, из этого шаблона можно удалить.
Теперь адрес созданной xml-страница можно подгружать в качестве источника в Вебмастер, а также ввести необходимые настройки: загрузить логотип, заполнить название, описание, идентификаторы счетчиков. Обратите внимание на настройки ленты. Они применяются ко всему фиду, поэтому если у вас интернет-магазин и вы хотите, например, включить ленту для информационных страниц и отключить для товарных, нужно использовать RSS-фид для одного типа страниц и YML — для другого.
Цитата из переписки с Яндексом:
2) Турбо-версии информационных страниц сайта следует формировать с помощью RSS-канала (https://yandex.ru/dev/turbo/doc/quick-start/articles-docpage/ ) , а карточки товаров - с помощью YML (https://yandex.ru/dev/turbo/doc/quick-start/markets-docpage/ ). Вы можете сформировать Турбо-версию лишь для отдельных страниц сайта, а для остальных страниц оставить обычную версию.
3) Увы, но изменить надпись на данной кнопке не получится. Возможно, такая функция появится в будущем.
При загрузке фида возможны три варианта: "Без ошибок", "Ошибка обновления", "Предупреждение обновления".
Для отладки есть кнопки "Подробнее" (показывает номера строк фида с ошибками, позволяет открыть страницу в режиме отладки), "Перепроверить источник".
Если ошибки возникают из-за того, что дата все же выводится на русском, поможет простой лайфхак.
Сниппет data-en:
<?php setlocale(LC_ALL, 'en_US.UTF-8'); if ( $val == '' ) $val=time(); if ($format == '' ) $format = "%a, %d %b %Y %H:%M:%S"; return strftime($format, $val); ?>
Вызов в чанке tpl-turbo:
<pubDate?>[[data-en? &val=`[+editedon+]`]] +3000</pubDate?>
RSS для MODx Revolution: все то же самое
Код документа:
<?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>3D-печать в Нижнем Новгороде</title> <link>[[++site_url]]</link> <description>Услуги 3D-печати в Нижнем Новгороде - 8(969)601-61-11</description> <turbo:cms_plugin>C125AEEC6018B4A0EF9BF40E6615DD1791</turbo:cms_plugin> <turbo:analytics id="34865895" type="Yandex"></turbo:analytics> <turbo:analytics id="UA-109522369-1" type="Google"></turbo:analytics> <language>ru</language> [[!getResources? &tpl=`turbo` &parents=`1,121` &depth=`2` &limit=`40` &includeContent=`1` &includeTVs=`1` &showHidden=`0` &hideContainers=`0` ]] </channel> </rss>
Код чанка turbo:
<item turbo="true"> <title>[[+pagetitle]]</title> <link>https://3d-52.ru/[[~[[+id]]]]</link> <turbo:topic>[[+pagetitle]]</turbo:topic> <turbo:source>https://3d-52.ru/[[~[[+id]]]]</turbo:source> <pubDate>[[+createdon:strtotime:date=`%a, %d %b %Y %H:%M:%S`]] +3000</pubDate> <turbo:content> <![CDATA[ <header> <h1>[[+pagetitle]]</h1> </header> [[+content]] <button formaction="tel:+7(969)601-61-11" data-background-color="#5B97B0" data-color="white" data-primary="true">Позвонить</button> ]]></turbo:content> </item>
Подводные камни
Не видел ни одного мануала по getResources pdoResources, где бы толково объяснялось, как фильтровать документы, в каком случае родительская папка включается в выборку, в каком нет. Всё приходится тестировать и отлаживать для конкретной версии движка, и каждый раз встречаются сюрпризы. Например, может отказаться отображаться дата.
Для версии движка MODX Revolution 2.7.1-pl (advanced) мне пришлось использовать такое решение.
<pubDate>[[data-en? &val=`[[+editedon:is=``:then=`[[+editedon]]`:else=`[[+createdon]]`]]`]] +3000</pubDate>
По каким-то причинам для прохождения валидации дата в данном случае выводится на английском, дополнительно идет страховка от пустого поля editedon.
Подробнее про сложности с выводом дат — тут.
Код сниппета data-en:
<?php setlocale(LC_ALL, 'en_US.UTF-8'); if ( $val == '' ) $val=time(); if ($format == '' ) $format = "%a, %d %b %Y %H:%M:%S"; return strftime($format, $val);
Возвращаясь к вопросу фильтрации документов, вот полезный материал про использование where: https://www.riwkus.pro/notes/web/back-end/modx/where-examples-of-the-condition-records-to-fetch/.
На том же движке MODX Revolution 2.7.1-pl (advanced) у меня установлены pdoTools, и используется pdoResources getResources.
Для вывода документов тут используется неочевидная логика: документы не выводятся только указанием resources, нужно обязательно указываьт родителя, затем следующей строкой можно вычеркнуть какие-либо документы:
[[pdoResources? &tpl=`turbo-d` &parents=`27` &resources=`-28,-30` &depth=`2` &limit=`540` &showHidden=`0` &includeContent=`1` &includeTVs=`1` &showHidden=`0` &hideContainers=`0` &where=`class_key NOT IN ('modWebLink')` ]]
Также можно использовать удаление документов через where: &where=`id NOT IN (77,115)`.
В примере выше я использую where для отсеивания ссылок.
Сюрпризом была также необходимость явно указывать лимит, без этого параметра система очень ленится выводить все документы.
Напоследок ещё один момент: если, например, нужно исключить из режима турбо главную страницу, не нужно ждать чуда от Яндекса, необходимо указать для вывода шаблон с item turbo="false", включив вызов соответствующего чанка в код страницы фида, назвав этот чанк, например, turbo-no-m-main, и максимально его упростив и сократив.
Спасибо тебе, единственный в мире читатель моей заметки, долиставший до этой строки!
Следующая статья: Тренды логотипов 2021 https://capweb.ru/trendy-logotipov-2021.html
Предыдущая статья: Влияние https на ранжирование в поисковых системах https://capweb.ru/vliyanie-https-na-ranzhirovanie-v-poiskovyih-sistemah.html