11

Доработка Joomla для улучшения поисковой оптимизации

Как известно, Joomla — одна из наиболее популярных бесплатных CMS в мире. Популярность эта вполне заслуженная, поскольку у нее есть множество преимуществ — простая и удобная админка, множество бесплатных расширений, с помощью которых можно создавать самые разные сайты. Но ничто не идеально, и, конечно же, у этой системы есть также и множество недостатков. Сегодня я хотел бы, опираясь на свой личный опыт доработки Joomla, поговорить о том, как исправить некоторые ее недостатки, а именно — связанные с SEO.

На данный момент последняя стабильная версия Joomla — это 3.3.6, и описывать я буду в первую очередь ее. Но большинство изменений, о которых пойдет речь, вполне актуальны и для предыдущих версий — таких как 3.0, 3.1 и 3.2, а некоторые из них очень даже подходят для более ранних веток — 2.5.x и старше.

Итак, начнем…

… с переопределения в Joomla!

Как известно, править модули и компоненты Joomla в самом ядре системы — дело неблагодарное. При обновлении файлы перезапишутся, и ваши изменения благополучно улетят коту под хвост. Поэтому по возможности то, что мы правим, нужно переопределять в шаблон (для этого в нем существует даже специальная папочка — html). В Joomla 3 появился очень удобный инструмент переопределения прямо из админки. Для этого нужно зайти по адресу: Расширения — Менеджер шаблонов — Шаблоны — ваш шаблон — вкладка «Создать переопределение», после чего кликнуть по тому модулю, компоненту или макету, который вам нужен. В результате он будет переопределен в папку html шаблона, и править его нужно будет уже там.

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

Переопределение файлов

Переопределение файлов

Заголовки в Joomla!

Изменение тега заголовка на H1Как известно, в Joomla! есть разные типы пунктов меню — это шаблон материала, шаблон блога категории и т.п. В большинстве из них по умолчанию автоматически выводится заголовок страницы. Но практически везде он выводится в теге h2. Почему? Наверно, у разработчиков была своя логика. Так или иначе, для продвижения лучше, чтобы основной заголовок страницы был в теге h1. Поэтому это лучше изменить.

Давайте изменим тег заголовка в наиболее распространенных типах страниц — это материал и блог категории. Для этого нам нужно перенаправить в компоненте com_content папки article и category. Затем для материала нам нужно в файле templates/ваш_шаблон/html/com_content/article в файле default.php найти строчки:

<h2 itemprop="name"><?php if ($params->get('show_title')) : ?>
<?php if ($params->get('link_titles') && !empty($this->item->readmore_link)) : ?>
<a href="<?php echo $this->item->readmore_link; ?>" itemprop="url"> <?php echo $this->escape($this->item->title); ?></a>
<?php else : ?>
<?php echo $this->escape($this->item->title); ?>
<?php endif; ?>
<?php endif; ?></h2>

И заменить здесь h2 на h1.

Для того, чтобы заменить заголовок в блоге категории на h1, мы проделываем аналогичные действия с файлом templates/ваш_шаблон/html/com_content/category/blog.php и находим в нем следующие строки:

<?php if ($this->params->get('show_category_title', 1) or $this->params->get('page_subheading')) : ?>
<h2> <?php echo $this->escape($this->params->get('page_subheading')); ?>
<?php if ($this->params->get('show_category_title')) : ?>
<span class="subheading-category"><?php echo $this->category->title; ?></span>
<?php endif; ?>
</h2>
<?php endif; ?>

Как вы уже могли догадаться, здесь тоже нужно заменить h2 на h1. Стоит однако отметить, что этот заголовок будет выводиться только в том случае, если в настройках отображения категории в пункте меню у вас стоит «Показывать заголовок категории» (по умолчанию эта функция в админке Joomla! отключена).

Еще немного о заголовках в Joomla!

Если мы уж заговорили о заголовках, то хочу упомянуть еще одну проблему Joomla!, которую было бы хорошо исправить. Как известно, в блоге категории текст обычно выводится по шаблону: Заголовок — Вводный текст (плюс-минус дополнительная информация). Причем заголовок выводится в теге h2. На самом деле больше 2-3 заголовков h2 на странице — это ошибка SEO, а в блоге категории этих заголовков часто бывает 10-15 на страницу. Поэтому лучше исправить тег заголовка в блоге категории.

Для этого нам нужно переопределить макет content. Затем в файле /templates/ваш_шаблон/html/layouts/joomla/content/blog_style_default_item_title.php находим строки:

<?php if ($params->get('show_title')) : ?>
<h2 itemprop="name">
<?php if ($params->get('link_titles') && $params->get('access-view')) : ?>
<a href="<?php echo JRoute::_(ContentHelperRoute::getArticleRoute($displayData->slug, $displayData->catid)); ?>" itemprop="url">
<?php echo $this->escape($displayData->title); ?></a>
<?php else : ?>
<?php echo $this->escape($displayData->title); ?>
<?php endif; ?>
</h2>
<?php endif; ?>

и меняем открывающий и закрывающий теги h2, к примеру, на <div class=»title» itemprop=»name»></div>.

Заголовок как ссылка в Joomla!

Как известно, когда мы создаем блог категории, очень хорошо, чтобы заголовки материалов, входящих в этот блог, были ссылками. Для этого в Joomla! имеется даже специальная настройка — «заголовок как ссылка». Все бы хорошо, но вот только когда мы выбираем эту настройку, то, переходя на страницу любого материала, видим, что его основной заголовок тоже стал ссылкой. Т.е. по сути у нас на странице образовалась циклическая ссылка — та, что ссылается на страницу, на которой мы уже находимся. По рекомендации поисковых машин, таких ссылок на странице быть не должно, поскольку они снижают ее вес. Да и вообще, даже с точки зрения пользователя это глупо и неудобно. Поэтому лучше убрать ссылающийся сам на себя заголовок.

Для этого откроем уже знакомый нам файл templates/ваш_шаблон/html/com_content/article/default.php и находим те же строчки, в которых мы уже заменили h2 на h1. Только теперь нам нужно заменить

<?php if ($params->get('show_title')) : ?>
<?php if ($params->get('link_titles') && !empty($this->item->readmore_link)) : ?>
<a href="<?php echo $this->item->readmore_link; ?>" itemprop="url"> <?php echo $this->escape($this->item->title); ?></a>
<?php else : ?>
<?php echo $this->escape($this->item->title); ?>
<?php endif; ?>
<?php endif; ?>

на

<?php if ($params->get('show_title')) : ?>
<?php echo $this->escape($this->item->title); ?>
<?php endif; ?>

После этого заголовок в материале перестает быть ссылкой.

Циклические ссылки в меню

Что делать с циклическими ссылками в меню в Joomla! ?

Циклические ссылки создаются не только заголовками, которые ссылаются сами на себя. Наиболее распространенными источниками таких ссылок являются логотип в шапке сайта, который сейчас традиционно делается ссылкой на главную страницу, а также пункты меню, которые остаются кликабельными, когда они активны. Соответственно, логотип на главной странице рекомендуется делать некликабельным, и активный пункт меню тоже не должен быть ссылкой. Эти тонкости SEO воплощены далеко не на каждом сайте, но если мы посмотрим на сайты крупных компаний, которые серьезно подходят к оптимизации своих сайтов, и известных SEO-агенств, у них все сделано именно так.

Как же сделать это на Joomla? Ну, с заголовком можно поступить банально — вывести в админке 2 модуля, один с некликабельным заголовком, второй с кликабельным, и привязать один к главной странице, а второй ко всем остальным. Но что делать с меню? В настройках Joomla некликабельный активный пункт меню не предусмотрен вообще. Поэтому приходится «допиливать» стандартный модуль меню.

Но и тут не все так просто. Существует простой способ сделать любой активный пункт меню некликабельным, прописав условие вроде «убирать ссылку с пункта класса active», но в этом случае, например, если у нас список материалов категории, и мы зайдем в любой материал, пункт меню по-прежнему останется некликабельным. А вот этого уже не хотелось бы. Поэтому я лично использую более сложный фикс, с логикой «если мы в материале (или где-то еще), пункт меню остается кликабельным». А поскольку страницы в разных компонентах отличаются, то фикс прописан для 3х самых часто используемых из них: это материалы стандартного com_content Joomla, материалы компонента K2 и товары интернет-магазина JoomShopping.

Технически это сделано так. Переопределяем mod_menu Joomla и редактируем файл /templates/ваш_шаблон/html/mod_menu/default_component.php. После строчки

 {
$linktype = $item->title;
}

добавляем:

$activeCustom = false;
$optionCustom = JRequest::getString('option'); // тип контента
$menu    = &JSite::getMenu();
switch ($optionCustom) {
case 'com_content':
if (!JRequest::getInt('catid')) { //в категории показывает 0, в материале категории != 0
$activeCustom = true;
}
break;
case 'com_k2':
if (JRequest::getString('view') && JRequest::getString('view') == 'itemlist') { //в категории К2 нет ИД, в материале К2 - есть
$activeCustom = true;
}
break;
case 'com_jshopping':
if (!JRequest::getInt('product_id')) { //в списке продуктов jshop нет product_id, в самом продукте есть product_id и category_id
$activeCustom = true;
}
break;
}

if ($menu->getActive() == $menu->getDefault()) { //если главная - всегда активная
$activeCustom = true;
}

if ($activeCustom && ($menu->getActive() == $menu->getItem($item->id))) { //если ИД меню == активному меню
$activeCustom = true;
} else {
$activeCustom = false;
}

И дальше, заменяем

{
default:
case 0:
?>
<a <?php echo $class; ?>href="<?php echo $item->flink; ?>" <?php echo $title; ?>><?php echo $linktype; ?></a>

на

switch ($item->browserNav)
{
default:
case 0:
?>

<?php if ($activeCustom){  ?>
<?php echo $linktype; ?>
<?php } else { ?>
<a <?php echo $class; ?>href="<?php echo $item->flink; ?>" <?php echo $title; ?>><?php echo $linktype; ?></a>
<? } ?>

После этого получаем то, что нам нужно.

Пагинация

И пагинация создаст дубли в Joomla!

Еще одна, не самая заметная проблема Joomla 3.x (да и более ранних версий тоже) заключается в пагинации. Симптомы следующие. Заходим на любую страницу, где есть пагинация. Ссылка на нее — это обычно что-то вида www.mysite.com/page.html. Переходим на вторую, третью или любую другую страницу пагинации. А теперь попробуйте вернуться обратно на первую страницу, с которой мы начали! Ссылка приобретает вид www.mysite.com/page.html?limitstart=0. Таким образом, у нас одна и та же страница доступна по двум ссылкам, что, как известно, в SEO крайне не рекомендуется.

Решить эту проблему путем стандартных настроек Joomla невозможно. Она, опять же, решается путем «допиливания». В этом случае придется править ядро системы, файл, который перенаправить невозможно. Он находится по адресу /libraries/cms/pagination/pagination.php. Здесь:

строчку

$data->start->link = JRoute::_($params . '&' . $this->prefix . 'limitstart=0');

заменяем на

$data->start->link = JRoute::_($params . '&' . $this->prefix);

далее строчку

 $data->previous->link = JRoute::_($params . '&' . $this->prefix . 'limitstart=' . $page);

заменяем на

if ($page == 0) {
$data->previous->link = JRoute::_($params . '&' . $this->prefix);
} else {
$data->previous->link = JRoute::_($params . '&' . $this->prefix . 'limitstart=' . $page);
}

и далее, строчку

$data->pages[$i]->link = JRoute::_($params . '&' . $this->prefix . 'limitstart=' . $offset);

заменяем на:

if ($offset == 0) {
$data->pages[$i]->link = JRoute::_($params . '&' . $this->prefix);
} else {
$data->pages[$i]->link = JRoute::_($params . '&' . $this->prefix . 'limitstart=' . $offset);
}

Это решение, к сожалению, имеет один недостаток — после обновления изменения не сохранятся. Поэтому придется менять файл каждый раз. Это, впрочем, не так сложно, если сохранить его себе и перезаливать от случая к случаю.

В общем…

Как обычно, хочу сказать, что этот список проблем и их решений далеко не полный. В Joomla есть еще много недостатков, которые требуют исправления. Я описал несколько из них, одни — очень распространенные и постоянно необходимые к исправлению, другие — решения которых сложно найти в Сети. Очень надеюсь, что это будет полезно как разработчикам, так и рядовым пользователям.

Картинка профиля Kiskenbassker

Kiskenbassker

11 Comments

  1. Молодец, спасибо. Только я немного добавил, чтобы стиль меню остался прежним:

    <span >

    <a href=»flink; ?>» >

  2. Спасибо за материал!
    Исправь кое-что в коде.


    <?php if ($activeCustom){ ?>
    <?php echo $linktype; ?>
    <?php } else { ?>
    <a <?php echo $class; ?>href=" <?php echo $item->flink; ?>" <?php echo $title; ?>> <?php echo $linktype; ?> </a>
    <? } ?>

    Замени в последней строке <? } ?> На <?php } ?>

    Не у всех включены короткие теги. Мне пришлось постараться чтоб понять почему у меня не работает 😉

  3. Здравствуйте! Замечательная статья получилась. Но вот незадача:
    как сделать в Joomla 3 ссылку вида site.ru/tovarnaya-stranica.html ?
    По умолчанию между доменом и материалом вставляется еще и родительский пункт меню.

    Например создал пункт меню «машины». В нем создал подменюшку «легковые машины» и создал тип материала и выбрал из списка нужную статью. В итоге у меня получается ссылка ввида site.ru/mashini/legkovie-mashini.html. Как сделать такого вида site.ru/legkovie-mashini.html
    Спасибо.

  4. Здравствуйте! А если нет такого пути «/templates/ваш_шаблон/html/mod_menu» что делать? Нету папки mod_menu!

  5. Привет Андрей может подскажешь человеку как на joomla ещё один пункт допилить. Как сделать логотип кликабельным только на других страницах, кроме главной. Вот мой код:
    a href=»http://zakazat-sait.ru» class=»art-logo art-logo-1563184117″>
    <img src="/images/logo-1563184117.png» alt=»» />

    • Добрый день.
      На Джумла, самый простой способ — это сделать 2 отдельных модуля, в одном из них вывести лого без ссылки, в другом — со ссылкой, первый привязать к главной, а второй — ко всем остальным страницам, кроме главной.
      Можно также сделать через PHP:
      < ?php if($_SERVER['REQUEST_URI'] == '/') { ?>
      // код лого без ссылки
      < ?php } else { ?>
      // код лого со ссылкой
      < ?php } ?>
      Этот костыль хорошо сработает, если у вас 1 язык на сайте, иначе придется добавлять еще и «или», и вместо ‘/’ писать ссылки на главную каждого языка, например, ‘ru/’ и ‘en/’.

  6. Здравствуйте.
    Подскажите. Имеется сайт на joomla 3.6.5. + framework GANTRY5. Вот пример: http://demo.gantry.org/
    Не получается избавиться от циклических ссылок (например на главной странице в меню присутствует активная индексируемая ссылка на главную).
    Во-первых, в joomla 3.6.5 файл default_component.php имеет другую структуру сейчас и к нему используемые в статье изменения не применимы.
    Во-вторых, GANTRY5 как я понял использует свой вывод меню, но других способом (не могу понять как).
    Пожалуйста, подскажите что делать.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Лимит времени истёк. Пожалуйста, перезагрузите CAPTCHA.