ЧПУ для Virteumart а — router.php
Итак, многие из Joomla водов знают, что такое virtuemart. И многим, кто знаком с созданием сайтов и интернет–магазинов приходилось иметь дело с этим скриптом. Его слабым местом является полное отсутствие SEO ЧПУ. Вот нет ЧПУ, да и все тут.
В итоге страницы индексируются «со скрипом». Ибо особенно яндекс очень плохо относится к url без чпу и к «длинным» адресам. Сегодня мы поговорим о построении ЧПУ для virtuemart 1.1 и Joomla 1.5. А в ближайших статьях я приведу Вам решение для virtuemart 2.0 и joomla 2.5.
Итак, решение для ЧПУ для 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
Это все конечно хорошо, но что же делать со старыми страницами? Ведь тоже хотелось бы преподать их в виде ЧПУ для посетителей и поисковиков. Исключаем дубли страниц при помощи 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)?
С какими языками будет работать router.php: русский, украинский, английский, белорусский (хороший транслит чпу)
Снижаем нагрузку для router.php при генерации ЧПУ
Категории и производители выгружаются в массив одним запросом к базе данных. Так как по сути нам нужно только имя/идентификатор производителя/категории, то даже для большого количества таких данных занимаемая память будет несущественна, а нагрузка на базу данных упадет в разы.
В результате всего два запроса вместо: по одному запросу на Категорию и по одному на производителя, а если учесть, что на каждой странице формируется еще и дерево категорий товаров, то экономим от 50 до 100 запросов на страницу при таком подходе.
Для избежания дублирования запросов, связанных с формированием ЧПУ товаров после запроса о конкретном товаре данные об имени товара выгружаются в массив, после чего массив проверяется на присутствие идентификатора товара, в этом случае данные берутся из массива без повторного запроса к Б.Д., что также помогает нам сэкономить пару запросов при повторении товаров на одной странице.
Ошибки и баги router.php для Virtuemart:
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 — небольшой фикс.
Как можно получить router.php и vm_seo.zip?