Итак, решение для ЧПУ для Virtuemart 1.1 и Joomla 1.5 на основании router.php (написано и проверено на virtuemart 1.1.9, но должно работать и на более ранних версиях) без внедрения сторонних компонентов, всего лишь добавлением одного файла router.php в директорию /components/com_virtuemart/.
Каковы преимущества router ЧПУ Virtuemart?
Итак, что же делать? Спросите Вы? Вариантов, к сожалению, немного. Первым из них является способ «использования» стороннего расширения, и здесь нам могут придти на помощь компоненты: sh404SEF, artio joomSef и т.п.
Но, сколько же неоправданной мороки с этими компонентами, да и расширения для ЧПУ у VM стоят денег (основная морока с глючными, неработающими страницами, и отсутствием redirect а для страниц без ЧПУ, в итоге с огромной базой ссылок, по пять-шесть ссылок на один и тот же товар, а дальше проблемы с: vmchk = 1 и т.п. и т.д.).
Еще очевидным преимуществом является то, что, благодаря router.php абсолютно все ссылки в практически любом компоненте/модуле, отображающем товары для Virtuemart, даже сторонних разработчиков, превращаются в SEO ЧПУ ссылки (там, где используется ст. функция JRoute::_())
Но, вот чудо! С начала версии virtuemart 1.1.9 предложили router.php (который входит в поставку стандартного пакета). Заглянул я в этот роутер, и (извините), чур меня! ЧПУ ссылки там формируются перечислением параметров, например /page/shop.browse/ и куча мусора. В итоге – одни и те же страницы имеют огромную массу дублей (по разным адресам открывается одна и та же страница) и вообще не предназначены для «понимания» посетителем.
В итоге пришлось написать самому router.php для применения в SEF ЧПУ Virtuemart.
Какие ЧПУ ссылки в Virtuemart Вы получите, использовав мое решение?
- Ссылка категории товаров для ЧПУ Virtuemart: [адрес Вашего сайта]/category/[id-категории]-имя категории[в транслите].html
-
Ссылка для сведений о продукте для ЧПУ Virtuemart: [адрес Вашего сайта]/product-details/[id-товара]-имя товара[в транслите].html
Примечание автора: возможно также включение ссылок вида /product-details/[id-категории]-имя категории[в транслите]/[id-товара]-имя товара[в транслите].html, для этого требуется установить константу в файле router.php
define("DETAIL_PAGE_EXLUDE_CATEGORIES",false);Но, учтите, наряду с тем Virtuemart будет сам создавать две ссылки на одно и то же детальное описание товара: [адрес Вашего сайта]/product-details/[id-товара]-имя товара[в транслите].html – например: для страниц следующий/предыдущий товар в категории Virtuemart. А в категориях товаров будет формироваться ссылка : [адрес Вашего сайта]/product-details/[id-товара]-имя товара[в транслите].html, что влечет за собой появление дублей.
- Ссылка на производителя для ЧПУ Virtuemart: [адрес Вашего сайта]/manufacturer/[id-производителя]-имя производителя[в транслите].html
- Ссылка на RSS ленту для ЧПУ Virtuemart: [адрес Вашего сайта]/feed/[id-категории]-имя категории[в транслите].html
- Ссылка задать вопрос о товаре в ЧПУ Virtuemart (товар в наличии?): [адрес Вашего сайта]/ enquiry/[id-товара]-имя товара[в транслите].html
- Cсылка на расширенный поиск по характеристикам и типам товара для ЧПУ Virtuemart: [адрес Вашего сайта]/component/virtuemart/search
- Адрес оформления заказа в ЧПУ Virtuemart: [адрес Вашего сайта]/component/virtuemart/checkout/
Выше пречисленные настройки Вы можете изменить при помощи констант, указав любой другой префикс, состоящий из букв английского алфавита нижнего регистра (маленьких букв), цифр, тире и подчеркивания в router.php:
$table_prefix = 'vm';
//если префикс таблиц virtuemart а отличается от
//vm - исправьте его здесь на правильный
//см. /administrator/components/com_virtuemart/virtuemart.cfg.php VM_TABLEPREFIX
if(!defined('DETAIL_PAGE_EXLUDE_CATEGORIES'))
define('DETAIL_PAGE_EXLUDE_CATEGORIES',true);
//исключить категории из /product-details? ссылок?
//Уменьшит количество дублей
if(!defined('REDIRECT_WITHOUT_SEO_URLS'))
define('REDIRECT_WITHOUT_SEO_URLS',true);
//true - автоматически перенаправлять со ссылок без ЧПУ
//на ссылки с ЧПУ: true - разрешить, false - запретить,
//тоесть при заходе на ссылку page=shop.browse&category_id=6987
//301 редирект на category/6987-elektronnye-knigi.html
//и у посетителя откроется та же страница но с ЧПУ ссылкой:
//category/6987-elektronnye-knigi.html
if(!defined('SIMPLE_SEO'))
define('SIMPLE_SEO',false);
//false - включить простой режим seo, без альясов,
//только с id: ссылки вида category/6987, product-details/6987
//и т.п., если хотите включить, назначьте true
if(!defined('CHECK_IF_CAN_REDIRECT'))
define('CHECK_IF_CAN_REDIRECT',true);
//проверять перед редиректом 301, не приведет ли это к
//бесконечному редиректу, при помощи curl? избегаем
//циклических редиректов
//еще не написано))
if(!defined('PAGE_SHOP_BROWSE'))
define('PAGE_SHOP_BROWSE', 'category');
//префикс категорий /category - меняем на любой
//нужный английский префикс из английских букв и цифр
//(можно использовать также -_)
if(!defined('PAGE_SHOP_MANUFACTURER'))
define('PAGE_SHOP_MANUFACTURER', 'manufacturer');
//префикс производителя /manufacturer - меняем на любой
//нужный английский префикс из английских букв и цифр
//(можно использовать также -_)
if(!defined('PAGE_SHOP_FEED'))
define('PAGE_SHOP_FEED', 'feed');
//префикс RSS ленты /feed - меняем на любой нужный
//английский префикс из английских букв и цифр
//(можно использовать также -_)
if(!defined('PAGE_PRODUCT_DETAILS'))
define('PAGE_PRODUCT_DETAILS', 'product-details');
//префикс детального описания продукта /product-details -
//меняем на любой нужный английский префикс из английских букв и цифр
//(можно использовать также -_)
if(!defined('PAGE_PRODUCT_ENQUIRY'))
define('PAGE_PRODUCT_ENQUIRY', 'enquiry');
//префикс страницы запроса наличия товара /enquiry -
//меняем на любой нужный английский префикс из английских букв и цифр
//(можно использовать также -_)
if(!defined('PAGE_CHECKOUT_INDEX'))
define('PAGE_CHECKOUT_INDEX', 'checkout');
//префикс страницы оформления заказа? /checkout -
//меняем на любой нужный английский префикс из английских букв и цифр
//(можно использовать также -_)
if(!defined('PAGE_ADVANCE_SEARCH'))
define('PAGE_ADVANCE_SEARCH', 'search');
//префикс страницы поиска (по параметрам?) /search -
//меняем на любой нужный английский префикс из английских букв и цифр
//(можно использовать также -_)
if(!defined('MB_ARRAY_TO_CONVERT'))
define('MB_ARRAY_TO_CONVERT','а|a, б|b, в|v, г|g, д|d, е|e, ё|yo, з|z, и|i, й|j, к|k, л|l, м|m, н|n, о|o, п|p, р|r, с|s, т|t, у|u, ф|f, х|x, ъ|, ы|y, э|e, _|-, |-, ж|zh, ц|c, ч|ch, ш|sh, щ|shh, ь|, ю|yu, я|ya, ї|yi, є|ye, ґ|g, ў|u'); //массив перекодировки, вида: б|b - где, б - буква для конвертации в транслит,
//разделитель |, b - буква, в которую будет перекодирован симнвол (английские
//буквы от a до z, можете указывать несколько символов до или после,
//после каждой строчки обязательно ставить , для указания следующей
Также будут сформированы ссылки для SEO Virtuemart страниц аккаунта, информации о заказах, регистрации через virtuemart для посетителя,/корзины/, информации о магазине и главной страницы с перечислением всех товаров
Перенаправление со ссылок без ЧПу на ссылки с ЧПУ для Virtuemart
Это все конечно хорошо, но что же делать со старыми страницами? Ведь тоже хотелось бы преподать их в виде ЧПУ для посетителей и поисковиков.
О чем это я?
Вот, например, ссылка проиндексировалась до этого Поисковым Роботом так: http://powercomp.com.ua/produkcziya-apple.html?page=shop.browse&category_id=6987
А при переходе на указанную страницу она для посетителя будет отображаться в адрессной строке браузера уже с применением ЧПУ: http://powercomp.com.ua/produkcziya-apple/category/6987-elektronnye-knigi.html
Зачем это нужно?
Исключаем дубли страниц при помощи 301 redirect а: 1 товар, 1 категория = 1 ссылка, у уже существующих товаров и категорий в магазине, и делаем старые ссылки Virtuemart понятными для посетителей
Для этого я написал несколько строк кода, которые срабатывают при подключении router.php и делают редирект 301 на ЧПУ преобразованную страницу Virtuemat, если посетитель/поисковой робот пришли по ссылке без ЧПУ.
Для этого необходимо включить:
define('REDIRECT_WITHOUT_SEO_URLS',true);
Как же установить router.php SEF ЧПУ для Virtuemart?
Достаточно скачать router.php, открыть, настроить его, пользуясь предыдущей инструкцией, после чего скопировать router.php в папку /components/com_virtuemart, зайти в панель администрирования [адрес Вашего сайта]/administrator/. Далее: в верхнем меню выбрать Сайт – Общие настройки - Включить SEO - да, использовать mod_rewrite – да, Добавить суффикс к URL – да. Кроме этого в корневой папке Вашего сайта должен присутствовать файл .htaccess. Если его нет, переименуйте htaccess.txt в .htaccess (для серверов Apache)
Теперь префикс таблиц vm вычисляется автоматически на основании файла конфигурации virtuemart, но если возникнут ошибки базы данных, тогда переопределите вручную
В том случае, если префикс таблиц баз данных для Virtuemart а отличен от vm: переопределите переменную вначале route.php
$table_prefix = 'vm';
Как узнать префикс таблицы Virtuemart?
Откройте файл /administrator/components/com_virtuemart/virtuemart.cfg.php и найдите значение константы VM_TABLEPREFIX
define('VM_TABLEPREFIX', 'vm'); //в данном случае это vm
Итак, где же тестировалось ЧПУ для Virtuemart (router.php)?
Магазин компьютерной техники powercomp.com.ua
С какими языками будет работать router.php: русский, украинский, английский, белорусский (хороший транслит чпу)
Снижаем нагрузку для router.php при генерации ЧПУ
Категории и производители выгружаются в массив одним запросом к базе данных. Так как по сути нам нужно только имя/идентификатор производителя/категории, то даже для большого количества таких данных занимаемая память будет несущественна, а нагрузка на базу данных упадет в разы: в результате всего два запроса вместо: по одному запросу на Категорию и по одному на производителя, а если учесть, что на каждой странице формируется еще и дерево категорий товаров, то экономим от 50 до 100 запросов на страницу при таком подходе.
Для избежания дублирования запросов, связанных с формированием ЧПУ товаров после запроса о конкретном товаре данные о имени товара выгружаются в массив, после чего массив проверяется на присутствие идентификатора товара, в этом случае данные берутся из массива без повторного запроса к Б.Д., что также помогает нам сэкономить пару запросов при повторении товаров на одной странице.
Ошибки и баги router.php для Virtuemart:
На данный момент 12.07.2012 не выявлено
12.07.2012 router был обновлен, добавлено несколько новых настроек, убраны все баги, известные на данный момент, добавлено добавление канонической ссылки, добавлена возможность включения простого seo (только id ссылки, без alias), написан дополнительно плагин настроек нашего router - vm_seo, который решает следующие проблемы: дает настроить роутер без правки кода, дает изменить массив транслитерации, позволяет включить исключение дублей страниц (на данный момент исключены все известные дубли со строгим редиректом и добавления ссылки rel="canonical" в секцию <head>, решает проблему с редактированием с лицевой части, и всплывающими окнами печати, замените роутер и скачайте и установите плагин vm_seo, следующая версия будет переложена на 2.5. Файл router.php теперь в кодировке utf-8 изначально.
Плагин vm_seo, настраиваем router virtuemart
Скачайте и установите плагин seo, для этого зайдите в панель администрирования, перейдите в Расширения - Установить/Удалить - нажмите кнопку Обзор, укажите путь к архиву vm_seo.zip, установите, после установки перейдите в панели администрирования в Расширения - Плагины, найдите vm_seo (по названию), щелкните по ссылке в столбце Название Плагина, и сохраните
Обратите внимание: кроме настроек, плагин vm_seo решает следующие проблемы (они не связаны с роутером, это баги virtuemart, но удалось их исправить средствами плагина): редактирование товаров с лицевой части магазина, окна печати и другие окна virtuemart, открывающиеся через index2.php
Какие настройки router вынесены в плагин vm_seo?
Исключить категории из product-details ссылок - исключить alias категорий из ссылок на подробные товары (по умолчанию - исключить), сократит дубли ссылок для товаров, которые находятся в разных категориях, а также при формировании ссылок на следующий, предыдущий товар одной категории
Исключить дубли страниц: со страниц без чпу, со страниц с неполными ссылками, или устаревшими ссылками (если, например, имя товара изменилось), будут обязательно преобразованы с перенаправлением к единственной полной ссылке, содержащей новый альяс, такая ссылка будет считаться канонической. И будет добавлена ссылка <rel="canonical" href="/product-details/24533-printer-samsung-ml-1861.html" />, которая является авторитетной ссылкой на первоисточник для yandex, google поисковых систем. При этом router не генерирует ни одного дополнительного запроса к б.д., а разбирается с тем, что у него под рукой. В ссылку также будет включен домен Вашего сайта. Проверка текущего url включается по событию onAfterRoute до вывода основного содержимого, так что ни пользователь, ни поисковик теперь ничего лишнего не увидят.
Примечание автора: все не преобразованные в чпу параметры будут при этом сохранены в ссылке
Включить сео без альясов: по просьбам трудящихся предусмотрен вариант без альясов, не производит ни одного запроса к базе данных, но при этом довольно сложен в понимании, ссылки выглядят вида: /[id-категории]/[id-товара].html. Ссылки более короткие, но менее понятные
Массив для перекодировки: теперь мы даем Вам полностью возможность управлять транслитерацией на Ваш вкус и делаем возможной поддержку любых языков в транслитерации. Для этого Вам достаточно составить пары значения вида символ-для-транслитерации|замена-на-английском (разделенные |, например: б|b), и разделить эти пары значений запятой. Чтобы увидеть массив по умолчанию, достаточно один раз сохранить плагин.
По умолчанию массив транслитерации для русского, английского, украинского языков:
а|a, б|b, в|v, г|g, д|d, е|e, ё|yo, з|z, и|i, й|j, к|k, л|l, м|m, н|n, о|o, п|p, р|r, с|s, т|t, у|u, ф|f, х|x, ъ|, ы|y, э|e, _|-, |-, ж|zh, ц|c, ч|ch, ш|sh, щ|shh, ь|, ю|yu, я|ya, ї|yi, є|ye, ґ|g, ў|u
- если оставить поле пустым, будет восстановлено значение по умолчанию
Префикс ссылки страницы категорий: category - префикс url для категорий (по умолчанию: category)
Префикс ссылки страницы производителя: manufacturer - префикс url для производителей (по умолчанию: manufacturer)
Префикс ссылки страницы RSS ленты: feed - префикс url для лент новостей(по умолчанию: feed)
Префикс ссылки страницы продукта: product-details - префикс url для страницы детальной информации о продукте(по умолчанию: product-details)
Префикс ссылки страницы запроса наличия товара: enquiry - префикс url для страницы запроса наличия товара (по умолчанию: enquiry)
Префикс ссылки страницы оформления заказа: checkout - префикс url для страницы оформления заказа (по умолчанию: checkout)
Префикс ссылки страницы поиска (по параметрам): search - префикс url для поиска по параметрам (по умолчанию: search)
Настройки плагина для router а virutemart

[update] - 16.07.2012 - vmcheck - удаляем из rel="canonical", next_page - небольшой фикс;

Комментарии
Это не ко мне. И дело здесь не в роутере. Страницы там и будут неизменными, так как каждый щелчок по форме пагинации вызывает submit формы и установку limitstart,limi t (переустановку) , в моем случае все это замечательно работает и переходит по следующим страницам заказа. Почему в этом случае они сделали формой пагинацию, я не знаю. Наверно, так захотели. Оба параметра передаются через post. Я же прошу: указывайте версию Virtuemart, Joomla. У меня: virtuemart 1.1.9, joomla 1.5.26 (на 4 сайтах, магазины модификации не подвергал).
http://powercomp.com.ua/portativnaiatexnika/noutbukiiplanshetu/category/7038-noutbuki-i-netbuki.html?limit=15&limitstart=15
все работает отлично. Версия virutemart, joomla, ваш сайт? Давайте более подробную информацию.
Это не косячок. Это ГОСТ 7.79-2000, поправьте на Ваш вкус в настройках плагина. Напротив мягкого знака стоит -, поставьте любой другой знак или исключите мягкий знак.
Скрипт достиг логического завершения в плане возможностей, в ближайшее время перенесу на 2.5 и 2.0.
Проверил гугл вэб мастер и яндекс вэб мастер, все хорошо, нет у меня таких дублей на пяти проектах. Но сейчас внесу изменения в роутер для редиректа, если не совпадают url, это вообще не проблема:)
Это вполне нормальная ссылка:) Какая разница, где стоит Itemid, лишь бы он был. 301 редирект сработает все равно.
RSS лента комментариев этой записи