Здравствуй родное сообщество. Я наконец вылезла из адового загруза работой, почти вышла из жуткой депрессии и снова решила поделиться парой своих наблюдений по части технической поисковой оптимизации сайтов. Конечно, на примере REVO.

Последние годы я активно сотрудничаю со многими SEO – фирмами и частными продвиженцами. Каждый раз, когда к ним попадает кто-то из наших «детей» — они традиционно присылают мне списки работ. Включив логику и свою собственную любовь к поисковой оптимизации, я решила поделиться с миром «тайнами», ну или просто общими требованиями к сайтам весны 2018 года.

1. Description

А знали ли вы, что относительно недавно количество символов в описании сайта выросло до 255? Так вот, для наших REVO (пардон, эвисты) в свежих версиях уже не нужно прыгать по файлам и базе, чтобы увеличить лимит. На самой свежей версии 2.6.3 можно смело писать больше текста в этом поле. У Вас версия старше? А почему не обновляетесь ;)

2. Keyword

Вот самое забавное, что есть сеошники, которые доказывают, что это поле себя отжило и не имеет место быть. Ха! Крупнейшие SEO-компании Беларуси, присылая мне ТЗ, четко пишут, что это поле им нужно. Вывод – это как лыжи, вроде пылятся на балконе, но, наверное, все таки нужны.

3. Заголовки

На странице должен быть один H1 и он должен быть в 100% случаев. Ну, это знают все (надеюсь, что все). Но. Есть еще и иные заголовки. Так вот, H2 и H3 имеет место быть только в тексте (наше поле content) и на важных фразах. Нельзя оформлять заголовками служебные фразы, используемые как элементы шаблона или навигации.

Например: у нас есть footer и в нем структура из 4 блоков. В каждом что-то есть: контакты, ссылки на разделы, логотип, соц. Сети и пр. Так вот, часто сие место подписывается
<h2>Связаться с нами</h2>
или
<h3>Оставить отзыв</h3>
И так делать нельзя. Самое забавное, что верстальщики именно так и возвращают макеты. Что делать? Заменить на
<div class='h2'>Отзыв от Иннокентия</div>
или
<p class='h3'>Советуем прочитать</p>
Возможно придется влезть в css. Или «промыть голову верстальщику» (иногда помогает).

Заметила я, что крайне редко встречаются в тексте и H4. А вот пятого и шестого заголовка на сайтах, которые в работе у оптимизаторов, просто нигде нет – все через стили.

4. Last Modified

Вывод информации о том, когда был изменен документ важен. Но тут проще простого, решение уже есть и дал нам его наш Илья — modx.com/extras/package/modlastmodified.

5. Rel canonical

Не забываем про канонический адрес страницы. Но, незабываем и про то, что у нас будет два канонический адреса, если мы вызовем pdoPage без 'setMeta' => 0. Причем второй будет, откровенно говоря, не комильфо.

6. Noindex и nofollow


Часто наш брат не заморачивается над этим метатегом и везде в чанк head пишет
<meta name="robots" content="index, follow">
Но тут мы забываем про основную суть данным фраз. Напомню, что значение no / follow – это управление запретом индексации ссылок на странице, а no / index – управление индексацией текста на странице.

Так вот, управление страницами пагинации должно быть следующее noindex и follow (не индексировать текст, но учитывать вес ссылок). У меня для этого есть миниатюрный сниппет, который я так и обозвала index _follow (вызывать в head для основных страниц сайта).

$robots = '<meta name="robots" content="index, follow">';
$norobots = '<meta name="robots" content="noindex,follow">';

$meta = $robots;
$request_uri = $_SERVER['REQUEST_URI'];
if(!empty($_GET['page'])) $meta = $norobots;
if(!empty($_GET['sort'])) $meta = $norobots;
return $meta;


Для служебных страниц свой шаблон обычно (это мы про простые сайты, без личного кабинета и прочего) и там можно уже руками прописать и этот мета тег, и иные.

7. Микроразметка и Open Graph Protocol

Да-да, очень-очень важна именно она. И для страницы товара/услуги, и для контактов, и для статей, и для хлебных крошек. Обычно нам лень лезть и смотреть ее параметры, но все таки она важна для ПС. Для ленивых вот copy / past.
{'pdoCrumbs' | snippet : [
    'limit' => 5,
    'tpl' => '@INLINE <li itemscope="" itemprop="itemListElement" itemtype="http://schema.org/ListItem">
    <a title="{$menutitle}" itemprop="item" href="{$link}">{$menutitle}</a>
    <meta itemprop="name" content="{$menutitle}"> <meta itemprop="position" content="{$idx}"></li>',
    'tplHome' => '@INLINE <li itemscope="" itemprop="itemListElement" itemtype="http://schema.org/ListItem">
    <a title="{$menutitle}" itemprop="item" href="{$link}">
    Главная</a>
    <meta itemprop="name" content="{$menutitle}"> <meta itemprop="position" content="{$idx}">
	</li>',
    'tplCurrent' => '@INLINE 
         <li itemscope="" itemprop="itemListElement" itemtype="http://schema.org/ListItem">
        <span itemprop="name">{$menutitle}</span>
        <meta itemprop="position" content="{$idx}">
        </li>',
    'tplWrapper' => '@INLINE <ul class="breadcrumb" itemscope="" itemtype="http://schema.org/BreadcrumbList">
	 {$output}</ul>',
    'showHome' => 1,
    'showAtHome' => 0  
    ]}


Ну, или так, если понятнее будет:
[[pdoCrumbs?
    &limit=`5`
    &tpl= `@INLINE <li itemscope="" itemprop="itemListElement" itemtype="http://schema.org/ListItem">
    <a title="{$menutitle}" itemprop="item" href="{$link}">{$menutitle}</a>
    <meta itemprop="name" content="{$menutitle}"> <meta itemprop="position" content="{$idx}"></li>`
    &tplHome=`@INLINE <li  itemscope="" itemprop="itemListElement" itemtype="http://schema.org/ListItem">
    <a title="{$menutitle}" itemprop="item" href="{$link}">
    Главная</a>
    <meta itemprop="name" content="{$menutitle}"> <meta itemprop="position" content="{$idx}">
	</li>`
    &tplCurrent=`@INLINE 
         <li itemscope="" itemprop="itemListElement" itemtype="http://schema.org/ListItem">
        <span itemprop="name">{$menutitle}</span>
        <meta itemprop="position" content="{$idx}">
        </li>`
    &tplWrapper=`@INLINE <ul class="breadcrumb" itemscope="" itemtype="http://schema.org/BreadcrumbList">
	 {$output}</ul>`
    &showHome=`1`
    &showAtHome=`0`  
    ]]


Примера Open Graph Protocol не привожу, но тут точно сами нагуглите, как его делать :)

8. Title у ссылок


Ну, alt тоже безумно важен у картинок, но я верю, что вы про него помните всегда. А вот у нашего любимого pdotools в пагинации есть «небольшой грешок» по этой теме и, если забыть, можно пропустить на сайт ссылки без этого важного аттрибута. Можно прописать сразу в вызове шаблоны, а можно в настройках сниппета, как удобнее. Но обратите внимание на tplPage, tplPageActive, tplPagePrev и tplPageNext.

Если используете pdoNeighbors, у него также в tplNext, tplPrev и tplUp нет описаний у ссылки. Да даже у pdoMenu, увы, tpl без него. В общем – тут будьте внимательны.

9. Цикличные ссылки

Попадая на сайт, большинство пользователей знают, что, кликнув на логотип, они смогут перейти на начальную страницу сайта. Так как кликабельный логотип уже давно стал стандартом. Но единственная ошибка – это то, что на главной странице логотип также кликабелен, то есть мы получаем цикличную ссылку, страница ссылается сама на себя. Лечение просто:

{if $_modx->resource.id != 1}
      <a href="{$_modx->makeUrl(1)}" title="Перейти на главную страницу" >
     <img src="/templates/img/logo.png" alt="{$_modx->config.site_name}, перейти на главную"></a>
     {else}
     <img src="/templates/img/logo.png" alt="{$_modx->config.site_name}, перейти на главную">
     {/if}


Или так:

[[*id:is=`1`:then=`
      <img src="/templates/img/logo.png" alt="[[++site_name]], перейти на главную">
 `:else=`
  <a href="[[~1]]" title="Перейти на главную страницу">
     <img src="/templates/img/logo.png" alt="[[++site_name]], перейти на главную">
     </a>
 `]]


10. Страницы ошибок

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

Бонус: две «плюшки» для MODX REVO

И на последок два Лайфхака, от которых я просто «тащусь» последние месяцы. Первое – это системные настройки для пользователя.

Не секрет, что вызов системной настройки быстрее, чем вызов дополнительного поля у страницы. И, если нам нужно засунуть куда-то данные телефонов, адресов и фраз из «подвала» или «шапки», то самым «шустрым» решением будет их размещение в системных настройках.

Но! Нам же нельзя туда пускать руко…х менеджеров. Что делаем?
  1. Ставим классный компонент settingsWidget с modstore.pro (https://modstore.pro/packages/utilities/settingswidget) от пока лично не знакомого мне DocentBF. Пишем в него наши, созданные ранее настройки. У автора описана инструкция, там легко разберетесь.
  2. Идем в управление панелями и создаем новую панель. Старую затрет при обновлении MODX, поверьте. В нее создаем и добавляем данный виджет. Именуем по своему. Назначаем виджет политике менеджера. Но! Не запрещаем в политике доступ к системным настройкам, иначе он их не увидит.
  3. Настройки прячем иным способом. Идем в настройки меню и из верхнего меню вкладку «Админ» отправляем в управление. Так она скроется с глаз, но не скроется с панели. Свою рабочую политику менеджера прикладываю в ссылке. Но сделайте это в конце работы. Вас выбесит, когда меню будет переломанным. Реально выбесит.




Лайфхак два. Открываем любой шаблон, например Главная. В поле Значок (после Имя и Описания) пишем icon-home. Сохраняем, обновляем. Открываем вкладку Ресурсы. Прикольно, да? :) А это из бутсрапа, просто название иконок. Балуйтесь.

На этом пока все. Может будет вторая часть, но позже. У меня снова два ТЗ на рабочем окне, плюс еще надо оправиться после сложного периода депрессии. Так что пару месяцев я тут вряд ли снова вдохновенно накатаю статейку. Но я по прежнему люблю вас, сообщество MODX и EVO CMS.