среда, 29 мая 2013 г.

Joomla, Xmap, K2 и дублирующеиеся ссылки без алиасов

Как проще всего создать карту сайта (sitemap) на движке Joomla? Конечно же с помощью бесплатного компонента Xmap (репозиторий)! Он работает сразу "из коробки", имеет дополнения для популярных контент-менеджеров и создает XML-карту для поисковиков! Отлично? Отлично, но..., есть нюансы... 

Внимание! Всё описание ниже относиться к следующим версиям ПО, и, возможно, может быть неактуально для других версий:
Joomla!: 3.0.3 Stable
K2: 2.6.2 
Xmap: 2.3.3 Beta
Xmap - K2 Plugin: 1.2

Для начала хорошие новости. В версии xmap для джумлы 3 уже сразу есть плагин для к2, но по-умолчанию он отключен. Включить его можно через Расширения - Менеджер плагинов. Называется он Xmap - K2 Plugin. Все как на рисунке.
 
 
Теперь немного опишем исходную ситуацию, составим, так сказать, ТЗ.

Дано: сайт на Joomla3, с включенным SEF (ЧПУ). В качестве контент-менеджера выступает K2, в нем созданы все категории и материалы. Главное меню создано штатными средствами джумлы и ссылается как на категории так и на отдельные материалы, но не на все.
Надо: Создать карту сайта (как html для пользователей, так и xml для поисковых роботов), в которой были бы представлены все страницы сайта, и в качестве путей использовались алиасы, определенные в главном меню.

Всё вроде бы просто.
Подробно описывать процесс создания карты сайта я не буду, на эту тему уже написано достаточно статей (например, тут).
Cоздав карту сайта с включенным плагином для k2 по главному меню, получаем вот это:


Стрелками обозначены дублирующие ссылки: одна через алиасы меню, другая - через системное имя component/k2/item/. Т.к. материал фактически один, а с точки зрения поисковика это 2 разные страницы с одинаковым содержимым (что не приветствуется), то на это мы категорически не согласны.
К счастью, избавиться от дублирующих ссылок очень легко. Для этого переходим в Расширения - Менеджер Плагинов - Xmap K2 Plugin - вкладка Basic Settings (Основные Настройки). В ней необходимо выставить следующие настройки:
 

 Именно последняя настройка Suppress Duplicates (Удалить Дубликаты)  и отвечает.. хм, за удаление повторов :) Теперь наша карта сайта примет такой вид:


Как видим, дубликаты исчезли. Но! У нас еще одна проблема. Ссылки на материалы и категории сделаны без использования алиасов главного меню! Это касается всех страниц, которые не имеют ссылки из него прямой ссылки. Материалы, отмеченные красным, должны в своих путях содержать алиасы указанных стрелками категорий. А под категория выделенная зеленым, тоже должна иметь ссылку с алиасом. Долой все эти неудобочитаемые component/k2/item! К тому же, модули в J3 привязываются к алиасам меню и не будут отображаться на странице с такой ссылкой!

Скажу сразу, PHP не мой конек, не люблю я его, да и расширения весьма сложное и раскидано по разным  компонентам и плагинам. Поэтому, я решил идти по кратчайшему пути. Уже на этапе формирования html-страницы или xml документа с ссылками, подменять component/k2/item/ на свои пути с алиасами.
Нас интересуют 2 пхп файла:
  • \public_html\components\com_xmap\views\xml\tmpl\default_class.php - отвечает за отображение xml-карты;
  • \public_html\components\com_xmap\views\html\tmpl\default_class.php - отвечает за отображение html-карты;
В первом файле находим строчку echo '<loc>', $link, '</loc>' . "\n"; Данная строчка как раз вставляет в xml документ ссылку на файл. Сама ссылка живет в переменной $link. Теперь нам надо просто заменить в пути component/k2/item на алиас категории.

Важно!  Чтобы ссылки не получились битыми, нам надо точно определять к какой категории относиться материал. Для этого предлагаю использовать такой трюк:  в псевдониме заголовка (alias) материала использовать ключевое слово. Например, в новостной статье использовать псевдоним topic1-opening. Где topic1 будет указывать на то, что материал относиться к категории новостей. Таким образом, некрасивый путь "http://sitename.ru/component/k2/item/12-topic1-opening" будет заменен на красивый "http://sitename.ru/news/12-topic1-opening". Конечно же, важно чтобы для каждой категории ключевое слово было уникальным и больше нигде в псевдонимах кроме требуемой категории не встречалось!

Для определения есть ли наше ключевое слово в пути будем использовать функцию stripos, а для замены str-ireplace.
В моём случае код будет выглядеть так:

//Заменяем пути материалов
if (stripos($link,'topicleds')!=FALSE) {$link=str_ireplace('component/k2','led/topics-leds',$link);}
if (stripos($link,'topicnews')!=FALSE) {$link=str_ireplace('component/k2','about/news',$link);}
if (stripos($link,'topicpowers')!=FALSE) {$link=str_ireplace('component/k2','powers',$link);//заменяем пути категорий
if (stripos($link,'component/k2/itemlist/category/16-boomlessleds')!=FALSE){$link=str_ireplace('component/k2/itemlist/category/16-boomlessleds','led/boomless-leds',$link);}

Как можно заметить, подкатегория заменяется более явно. Теперь наша xml-карта приобрела просто отличный вид :)


Аналогично, в скрипте формирования html-карты находим строчку switch( $node->browserNav  )
и перед ней добавляем  те же строчки проверки.

Ну вот и всё :) Теперь у нас есть красивая, правильная карта сайта. А это очень важно для SEO (поисковой оптимизации).
Увидеть результат в живую вы можете тут (xml) и тут (html)

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

Отправить комментарий