Тэг canonical и нелюбимая мной Joomla 3.6.x

Тэг canonical и нелюбимая мной Joomla

А все так хорошо начиналось! Ранжирование клиентского сайта (тематика «проведение газа и газификация домов» http://gazkomfort.by) показывало рост позиций с начала наших активных действий, семантика разрастается, целевой поисковый трафик также увеличивается… но вот одна заковыка портила все настроение — ведь есть же такое слово «перфекционизм»! И в борьбе с ней я принял решение: «Используем тэг canonical!»

Историческая справка — что такое <canonical> и зачем его использовать в SEO?

Как пишет сам Google в справке своей Search Console, этот тэг призван помочь лучше ранжировать одинаковый контент, расположенный на разных страницах (или по разным адресам).

То есть — или это ваш сайт, но за счет разных факторов (CMS, криворукость, UX и прочее) одна и та же страница показывается с разными адресами; или Вы честно сперли материал с другого ресурса и не хотите его отдавать в руки хитрых рерайтеров и менять. В любом случае с помощью размещенной в секции <head>…</head> конструкции типа


<head>
....
....
<link rel="canonical" href="https://tca.by/uslugi/seo-poiskovaya-optimizacziya.html" />
....
....
</head>

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

Цитируя уважаемого Сергея Кокшарова, известного также как devaka:

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

В случае упомянутого сайта (делала его не моя компания) применено «специфическое» решение: на главную страницу выводятся отзывы (пока что там даже нет разделителя, чтобы показать, что выводить, а что оставить на самой странице отзыва; да и слайдер отзывов не менее «нестандартно» придуман — но это уже иная история), и эти же отзывы есть на странице своего раздела /otzyvy/, а кроме того у каждого отзыва есть отдельная страничка с собственным URL и с аналогичным главной странице содержанием. То есть мы имеем дублирование контента по полной программе!

Решение первое: написать разработчику. Ответ:

В джумле есть возможность переопределить макеты для вывода категории и материала. Сейчас там используются стандартные стилизованные темплейты (для категории и материала), но я бы под эту задачу сделал бы, видимо, свои. В этих уже темплейтах я бы отслеживал условие, когда категория равна «Отзывы» и менял бы канонический линк.

Более подробно по поводу переопределения можно почитать вот тут: https://docs.joomla.org/Layout_Overrides_in_Joomla

Суть в том, чтобы по определённому пути внутри темы подложить копии файлов системного темплейта. Тогда джумла найдёт его и будет использовать. Можно вносить, конечно, правки прямо внутри системного темплейта, но тогда при обновлении ядра джумлы эти правки могут пропасть.

Возможно, есть ещё какой-то путь с настройкой каких-нибудь SEO-плагинов джумлы, но это нужно искать.

Совет не понравился — бюджет на программиста не предусмотрен; оставили вариант «на закуску».

Joomla 3.6 Компоненты Easy Frontend SEO
Joomla 3.6 Компоненты Easy Frontend SEO

Решение второе: Решили смотреть в сторону SEO-плагинов для Joomla 3.x. Просмотрены варианты: SEOSimple, Sh404SEF, JoomSEF, SEO Boss, SEO-Generator, Easy Frontend SEO… снова облом. Или не делает нужного, или платный (надо согласовывать с Заказчиком, проводить оплаты и терять время), или и то и другое :)

Решение третье: Наши руки не для скуки! Ведь в «параметрах публикации» есть неиспользуемые (в данном проекте) поля; а мы их используем!

В частности, есть параметр «Внешняя ссылка» — если в него вписать URL, он генерирует в секции head метатэг meta name=»xreference» — но он нам не нужен; а вот формат ввода его информации очень даже подходит!

Joomla 3.6 - задание Внешней ссылки
Joomla 3.6 — задание Внешней ссылки

Следующим действием — берем файл head.php — только обратите внимание, чтобы взять нужный! В частности, у нашего клиента на ftp их есть 2: в папке /libraries/joomla/document/renderer/html/ и в папке /libraries/joomla/document/html/renderer/.

Ну а теперь в этом файле надо задать проверку одного параметра, и генерацию вместо него другого.

Для облегчения поиска нужного места редактирования ищем комментарий

// Generate META tags (needs to happen as early as possible in the head)

И в блоке кода

 
foreach ($document-&gt;_metaTags as $type =&gt; $tag)
{
   foreach ($tag as $name =&gt; $content)
   {
      if ($type == 'http-equiv' &amp;&amp; !($document-&gt;isHtml5() &amp;&amp; $name == 'content-type'))
      {
         $buffer .= $tab . '&lt;meta http-equiv="' . $name . '" content="' . htmlspecialchars($content, ENT_COMPAT, 'UTF-8') . '" /&gt;' . $lnEnd;
      }
      elseif ($type != 'http-equiv' &amp;&amp; !empty($content))
      {
         $buffer .= $tab . '&lt;meta ' . $type . '="' . $name . '" content="' . htmlspecialchars($content, ENT_COMPAT, 'UTF-8') . '" /&gt;' . $lnEnd;
      }
   }
}

делаем замену строки 11 на собственный блок:


foreach ($document-&gt;_metaTags as $type =&gt; $tag)
{
   foreach ($tag as $name =&gt; $content)
   {
      if ($type == 'http-equiv' &amp;&amp; !($document-&gt;isHtml5() &amp;&amp; $name == 'content-type'))
      {
         $buffer .= $tab . '&lt;meta http-equiv="' . $name . '" content="' . htmlspecialchars($content, ENT_COMPAT, 'UTF-8') . '" /&gt;' . $lnEnd;
      }
      elseif ($type != 'http-equiv' &amp;&amp; !empty($content))
      {
//canonical
         if ($content) {
            if ($name=='xreference') {
               $buffer .= $tab . '&lt;link rel="canonical" href="' . htmlspecialchars($content) . '" /&gt;' . $lnEnd;
               continue;
            }
            $buffer .= $tab . '&lt;meta name="' . $name . '" content="' . htmlspecialchars($content) . '" /&gt;' . $lnEnd;
         }
      }
   }
}

Вот так мы и кастомизировали генерацию и вывод тэга <canonical> в Joomla 3.6 только в тех материалах, которые нам нужны — малой кровью.

Разумеется, тут есть и минус — при обновлении Joomla этот файл head.php скорее всего затрет; так что стоит сделать себе копию.

К слову сказать, сама папка /otzyvy/ этот трюк не поняла — так что «Будем искать!» ©
P.S. Несмотря на приятное чувство «победы», больше любить Joomla я от этого не стал…