Итак, решение для ЧПУ для 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 Вы получите, использовав мое решение?

  1. Ссылка категории товаров для ЧПУ Virtuemart: [адрес Вашего сайта]/category/[id-категории]-имя категории[в транслите].html
  2. Ссылка для сведений о продукте для ЧПУ 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, что влечет за собой появление дублей.

  3. Ссылка на производителя для ЧПУ Virtuemart: [адрес Вашего сайта]/manufacturer/[id-производителя]-имя производителя[в транслите].html
  4. Ссылка на RSS ленту для ЧПУ Virtuemart: [адрес Вашего сайта]/feed/[id-категории]-имя категории[в транслите].html
  5. Ссылка задать вопрос о товаре в ЧПУ Virtuemart (товар в наличии?): [адрес Вашего сайта]/ enquiry/[id-товара]-имя товара[в транслите].html
  6. Cсылка на расширенный поиск по характеристикам и типам товара для ЧПУ Virtuemart: [адрес Вашего сайта]/component/virtuemart/search
  7. Адрес оформления заказа в ЧПУ 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

роутер virtuemart joomla

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

Больше информации о веб технологиях можно узнать из нашего перечня всех статей на сайте:

Скачать файл:

Комментарии   

 
0 #43 Александр 20.12.2014 08:19
Прошу помочь исправить сбой в пагинации.
Joomla 1.5.26
Virtuemart 1.1.9

В основном заработало, но возникла ошибка в пагинации внутри каталога virtuemart.

На 2 страницу не попасть, то есть ссылка, формирующаяся автоматически, не работает:
http://www.q-watch.ru/ruchki-i-karandashi/parker/category/2317-parker.html&limit=30&limitstart=30
зато методом "тыка" нашел, что работает такая ссылка:
http://www.q-watch.ru/ruchki-i-karandashi/parker/category/2317-parker.html?limit=30&limitstart=30

То есть система перестает воспринимать символ "&" и воспринимает только символ "?"

И это все при включенных суффиксах к URL/ При выключении суффиксов вообще страница не меняется - остается на первой странице пагинации.

При этом пагинация в фильтре товаров продолжает работать по стандартным ссылкам (с использованием знака "&").
Цитировать
 
 
0 #42 Sfera 09.03.2014 16:11
Есть сайт на Joomla http://sebenado.ru/
Нужна только форма заказа из икеа
Как сделать вот так?
http://idea-sr.ru/checkout/
или вот так?
http://shopikea.ru/checkout.html
Цитировать
 
 
0 #41 Игорь 21.10.2013 09:56
Этот метод работает, только в seo_vm, нужно оставить поле транслита пустым
Артем Карпенко
нашел такой выход
указал ъ|q, ь|q
а после $return = preg_replace('~([\-])?([\-]+)~','-',$return);
дописал $return = preg_replace('~ (q)~','',$retur n);
Цитировать
 
 
0 #40 Игорь 19.10.2013 07:55
Тоже столкнулся с этой проблемой, никак не получается убрать мягкий знак, в url вместо него ставит тире. Как это исправить?
Цитировать
 
 
+1 #39 Филипп 12.10.2013 06:10
Цитирую Administrator:
Цитирую Alex:
Замечен небольшой косячок. Мягкий знак в алиасах генерируется в тире, т.е. алиас из допустим из слова бульдог - /buldog получается /dul-dog.

Это не косячок. Это ГОСТ 7.79-2000, поправьте на Ваш вкус в настройках плагина. Напротив мягкого знака стоит -, поставьте любой другой знак или исключите мягкий знак.


А как его исключить?
вроде б как прописано ь|, но при этом в пути пишется с тире "dizel-nye-push ki-proizvodstva " или "apel-sin"
Цитировать
 
 
0 #38 Administrator 19.07.2012 13:43
Цитирую Alex:
Обнаружил данную проблемку, которую указывал уважаемый ikea market, но только в управлении учетной записи. Если заказов у постоянного покупателя много и он захочет их просмотреть, то с первой страницы на последующие перейти не получается, т.е. не работает пагинация полностью (поле показать 20,30,50 тоже не работает). При попытке перейти на последующие страницы адрес вида site.ru/catalog/account.html остается неизменным.

Это не ко мне. И дело здесь не в роутере. Страницы там и будут неизменными, так как каждый щелчок по форме пагинации вызывает submit формы и установку limitstart,limi t (переустановку) , в моем случае все это замечательно работает и переходит по следующим страницам заказа. Почему в этом случае они сделали формой пагинацию, я не знаю. Наверно, так захотели. Оба параметра передаются через post. Я же прошу: указывайте версию Virtuemart, Joomla. У меня: virtuemart 1.1.9, joomla 1.5.26 (на 4 сайтах, магазины модификации не подвергал).
Цитировать
 
 
0 #37 Alex 19.07.2012 11:56
Обнаружил данную проблемку, которую указывал уважаемый ikea market, но только в управлении учетной записи. Если заказов у постоянного покупателя много и он захочет их просмотреть, то с первой страницы на последующие перейти не получается, т.е. не работает пагинация полностью (поле показать 20,30,50 тоже не работает). При попытке перейти на последующие страницы адрес вида site.ru/catalog /account.html остается неизменным.
Цитировать
 
 
0 #36 Administrator 18.07.2012 16:08
Цитирую ikea market:
У меня вопрос, все отлично работает, но есть одно большое НО -- если в разделе товара много товаров (больше одной страницы), то на другие страницы перейти невозможно ???

http://powercomp.com.ua/portativnaiatexnika/noutbukiiplanshetu/category/7038-noutbuki-i-netbuki.html?limit=15&limitstart=15
все работает отлично. Версия virutemart, joomla, ваш сайт? Давайте более подробную информацию.
Цитировать
 
 
0 #35 ikea market 18.07.2012 13:34
У меня вопрос, все отлично работает, но есть одно большое НО -- если в разделе товара много товаров (больше одной страницы), то на другие страницы перейти невозможно ???
Цитировать
 
 
+1 #34 Administrator 12.07.2012 22:35
Цитирую Alex:
Замечен небольшой косячок. Мягкий знак в алиасах генерируется в тире, т.е. алиас из допустим из слова бульдог - /buldog получается /dul-dog.

Это не косячок. Это ГОСТ 7.79-2000, поправьте на Ваш вкус в настройках плагина. Напротив мягкого знака стоит -, поставьте любой другой знак или исключите мягкий знак.
Цитировать
 

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


Яндекс.Метрика