Задача
Использовалась последняя версия sh404sef линейки 2.0. Надо было сделать SEF-ссылки в Виртуемарт, но так, чтобы они были не очень длинными и вполне корректными. Наиболее подходящий вариант - оставить в URL 1 категорию. Если оставить все, то для большой вложенности категорий (2 и более), URL будут слишком длинными.
Использовались следующие настройки sh404sef.
Так как многие подкатегории Virtuemart имели одинаковые названия (например, названия брендов), то для уникализации ссылок необходимо использование ID категории. В таком случае ссылка получается вида /17-category/product.html. Здорово, что sh404sef умеет генерировать title и метатеги, здесь то и зарылась собака. Разработчики посчитали, что title тоже надо уникализировать за счет ID категории и тайтл выглядел так:
17-Категория 2 | 15-Категория 1 | Товар | Название магазина
При этом в метатеге keywords было следующее:
Товар, Категория 2, Название магазина, URL магазина
Все обнаруженные несоответствия и задачи для решения:
- в title - удалить ID категории и название магазина
- в метатеге keywords - удалить запятые, название магазина и url, все слова перевести в нижний регистр (так правильнее для SEO).
Решение
Необходимо исправлять файл components/com_sh404sef/meta_ext/com_virtuemart.php
1. Меняем строки
$title .= ($sefConfig->shInsertCategoryId ? $tree[ $category_id ]->category_id.$sefConfig->replacement : '') .$tree[ $category_id ]->category_name. ' | '; $category_id = $tree [ $category_id ]->category_parent_id;
на
$title .= $tree[ $category_id ]->category_name. ' | '; $category_id = $tree [ $category_id ]->category_parent_id;
В общем-то, для удаления ID категорий этого уже достаточно. Дальше уже наводим красоту.
2. Меняем
$shCustomTitleTag = $catList ? $catList.' | ':'';
на
$shCustomTitleTag = $catList ? $catList:'';
удалили вертикальную черту после всех категорий
3. Меняем
$shCustomTitleTag .= empty($pageString) ? '' : $pageString .' | '; // shop name $shCustomTitleTag .= $shShopName;
на
$shCustomTitleTag .= empty($pageString) ? '' : $pageString;
то же, что и в п.2, но для многостраничных документов + удаляем название магазина
4. Заменяем
$shCustomKeywordsTag = ($catList ? str_replace('|', ',', $catList).',':'') .$shShopName. ','.$shStoreName;
на
$shCustomKeywordsTag = ($catList ? str_replace(' |', '', $catList):'');
убрали из метатегов запятые, название магазина и продавца (написано продавец, а выводился URL магазина из настроек Virtuemart)
5. Идем дальше и меняем
$shCustomTitleTag = $row->product_name.' | '.($catList ? $catList.' | ':'').$shShopName; $shCustomDescriptionTag = $row->product_s_desc; $shCustomKeywordsTag = $row->product_name.', '.($catList ? str_replace('|', ',', $catList).',':'') .$shShopName. ','.$shStoreName;
на
$shCustomTitleTag = $row->product_name.' | '.($catList ? $catList:''); $shCustomDescriptionTag = $row->product_s_desc; $shCustomKeywordsTag = $row->product_name.' '.($catList ? str_replace(' |', '', $catList):'');
всё описано выше, но эти изменения касаются страницы товара (карточки товара, флаера).
6. Заменяем
if (!empty($catRows)) { forEach ($catRows as $cat) $shCustomKeywordsTag .= $cat->category_name.','; } $shCustomKeywordsTag = $shCustomKeywordsTag.$shShopName. ','.$shStoreName;
на
if (!empty($catRows)) { forEach ($catRows as $cat) $shCustomKeywordsTag .= $cat->category_name.' '; }
7. И наконец, для перевода мететега decription в нижний регистр, добавляем перед ?> код
$shCustomKeywordsTag = JString::strtolower($shCustomKeywordsTag);
На этом всё.
Конечно, правильнее было бы ручками прописать все title и метатеги, но когда товары уже вбиты - можно доверить это SEF-компоненту SH404SEF.




