Настраиваем SEO urls для страниц магазина на OpenCart (ЧПУ в OpenCart)
Я использую Обычный режим ЧПУ, потому что устанавливал модуль блог и для него вносил правки в файл /catalog/controller/common/seo_url.php (можно по аналогии это делать и для seo_pro.php). Снова лезем в этот файл и вносим дополнения в пару мест.
Например в стандартном режиме ЧПУ осталась ссылка http://example.com/index.php?route=checkout/cart надо же её привести к виду http://example.com/cart. В catalog/controller/common/seo_url.php вносим следующий код:
... if (isset($this->request->get['record_id'])) { $this->request->get['route'] = 'record/record'; } elseif (isset($this->request->get['blog_id'])) { $this->request->get['route'] = 'record/blog'; } /* SEO Custom URL 1 */ else { $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE keyword = '" . $this->db->escape($this->request->get['_route_']) . "'"); if ($query->num_rows) { $this->request->get['route'] = $query->row['query']; } } /* SEO Custom URL 1 */ if (isset($this->request->get['route'])) { return $this->forward($this->request->get['route']); } } } public function rewrite($link) { if ($this->config->get('config_seo_url')) { $url_data = parse_url(str_replace('&', '&', $link)); ...
и здесь:
... if (($data['route'] == 'record/record' && $key == 'record_id') ) { $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = '" . $this->db->escape($key . '=' . (int)$value) . "'"); if ($query->num_rows) { $url .= '/' . $query->row['keyword']; unset($data[$key]); } } elseif ($key == 'blog_id') { $categories = explode('_', $value); foreach ($categories as $category) { $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = 'blog_id=" . (int)$category . "'"); if ($query->num_rows) { $url .= '/' . $query->row['keyword']; } } unset($data[$key]); } /* SEO Custom URL 2 */ else { $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = '" . $this->db->escape($data['route']) . "'"); if ($query->num_rows) { $url .= '/' . $query->row['keyword']; unset($data[$key]); } } /* SEO Custom URL 2 */ } } if ($url) { //echo $url."<br>"; unset($data['route']); ...
Первая правка касается index()
функции, чтобы она смотрела в таблицу url_alias
на совпадении url в адресной строке и роута $this->request->get['_route_']
.
Вторая правка расширяет функцию rewrite()
, чтобы она проверяла все маршруты url_alias
а не только для products, manufacturers и страницы information.
Теперь осталось добавить необходимые url в таблицу url_alias:
/*INSERT INTO `url_alias` (`url_alias_id`, `query`, `keyword`) VALUES (NULL, 'checkout/cart', 'cart');*/
INSERT INTO url_alias (query, keyword) VALUES ('common/home', ''); INSERT INTO url_alias (query, keyword) VALUES ('account/wishlist', 'wishlist'); INSERT INTO url_alias (query, keyword) VALUES ('account/account', 'my-account'); INSERT INTO url_alias (query, keyword) VALUES ('checkout/cart', 'cart'); INSERT INTO url_alias (query, keyword) VALUES ('checkout/checkout', 'checkout'); INSERT INTO url_alias (query, keyword) VALUES ('account/login', 'login'); INSERT INTO url_alias (query, keyword) VALUES ('account/logout', 'logout'); INSERT INTO url_alias (query, keyword) VALUES ('account/order', 'order-history'); INSERT INTO url_alias (query, keyword) VALUES ('account/newsletter', 'newsletter'); INSERT INTO url_alias (query, keyword) VALUES ('product/special', 'specials'); INSERT INTO url_alias (query, keyword) VALUES ('affiliate/account', 'affiliates'); INSERT INTO url_alias (query, keyword) VALUES ('checkout/voucher', 'gift-vouchers'); INSERT INTO url_alias (query, keyword) VALUES ('product/manufacturer', 'brands'); INSERT INTO url_alias (query, keyword) VALUES ('information/contact', 'contact-us'); INSERT INTO url_alias (query, keyword) VALUES ('account/return/insert', 'request-return'); INSERT INTO url_alias (query, keyword) VALUES ('information/sitemap', 'sitemap'); INSERT INTO url_alias (query, keyword) VALUES ('account/forgotten', 'forgot-password'); INSERT INTO url_alias (query, keyword) VALUES ('account/download', 'downloads'); INSERT INTO url_alias (query, keyword) VALUES ('account/return', 'returns'); INSERT INTO url_alias (query, keyword) VALUES ('account/transaction', 'transactions'); INSERT INTO url_alias (query, keyword) VALUES ('account/register', 'create-account'); INSERT INTO url_alias (query, keyword) VALUES ('product/compare', 'compare-products'); INSERT INTO url_alias (query, keyword) VALUES ('product/search', 'search'); INSERT INTO url_alias (query, keyword) VALUES ('account/edit', 'edit-account'); INSERT INTO url_alias (query, keyword) VALUES ('account/password', 'change-password'); INSERT INTO url_alias (query, keyword) VALUES ('account/address', 'address-book'); INSERT INTO url_alias (query, keyword) VALUES ('account/reward', 'reward-points'); INSERT INTO url_alias (query, keyword) VALUES ('affiliate/edit', 'edit-affiliate-account'); INSERT INTO url_alias (query, keyword) VALUES ('affiliate/password', 'change-affiliate-password'); INSERT INTO url_alias (query, keyword) VALUES ('affiliate/payment', 'affiliate-payment-options'); INSERT INTO url_alias (query, keyword) VALUES ('affiliate/tracking', 'affiliate-tracking-code'); INSERT INTO url_alias (query, keyword) VALUES ('affiliate/transaction', 'affiliate-transactions'); INSERT INTO url_alias (query, keyword) VALUES ('affiliate/logout', 'affiliate-logout'); INSERT INTO url_alias (query, keyword) VALUES ('affiliate/forgotten', 'affiliate-forgot-password'); INSERT INTO url_alias (query, keyword) VALUES ('affiliate/register', 'create-affiliate-account'); INSERT INTO url_alias (query, keyword) VALUES ('affiliate/login', 'affiliate-login');
Вот. http://example.com/cart должен возвращать то же что и http://example.com/index.php?route=checkout/cart, а OpenCart узнаёт $this->url->link('checkout/cart');
и возвращает ссылку в красивом виде http://example.com/cart
almix
Разработчик Loco, автор статей по веб-разработке на Yii, CodeIgniter, MODx и прочих инструментах. Создатель Team Sense.
Вы можете почитать все статьи от almix'а.
- 0 Opencart: Скидки для пользователей, надо указывать в колонке "количество" значение, отличное от нуля! (02.07.2014)
- 0 Как оперативно создать интернет-магазин на основе шаблона OpenCart? (05.06.2014)
- 0 Opencart: Установка мета тега Keywords для главной страницы через админку (05.12.2013)
- 0 Opencart: война модулей FilterPro mega, Intelligent Product Labels, AStickers - Ajax стикеры (24.10.2013)
- 0 Opencart: Модуль Filter Product OpenCart_v1.5.x: Как скрывать недоступные опции в фильтре (23.10.2013)
- 0 Ошибка xml файла Opencart для Яндекс Маркета: <b>Notice</b>: iconv(): Detected an illegal character in input string... (04.09.2013)
- 0 Opencart: Выводить изображения подкатегорий на странице категории. (11.07.2013)
- 0 Opencart: Вывод атрибутов вместо описания в категориях. (23.10.2013)
- 0 Opencart: Обновление движка с версии 1.4.9 до 1.5.1.3! (05.02.2015)
- 0 Даб-даб-даб. Просто прикольная девушка по имени Майле Охуе в гугле хорошо объясняет. (24.04.2013)
- 0 Opencart: Вставляем имя покупателя в модуле JV_QuickOrder - быстрый заказ товара (22.04.2013)
- 0 Добавляем в <title> название категории Joomla (22.08.2013)
- 0 OpenCart: Fancybox (или colorbox)+"cloud-zoom" одновременно. Значок-ссылка поверх изображения товара на просмотр в полный вид (03.06.2013)
- 0 OpenCart: Делаем шаблон растягиваемым и добавляем отступы. (10.01.2014)
- Как включить SSL и сделать редирект на HTTPS. На примере Opencart 2 (03.12.2017)
- Opencart 2: Цена за квадратный метр, за штуку и др. (05.10.2017)
- Opencart 2: Cлайдер Owl Carousel в OcStore 2.1.0.2. Что делать, если слайдер не работает? (10.05.2017)
- Opencart 2: Добавляем новую позицию в макет для вывода модуля (27.04.2017)
- SEO оптимизация хлебных крошек breadcrumbs в Opencart 2 (27.04.2017)
- Opencart 2: Закладки без регистрации (Wishlist without registration) (26.04.2017)
- Opencart 2: сделать разные валюты в админке и на сайте (24.04.2017)
- Opencart 2: OCMOD замена нескольких строк (12.04.2017)
- Как установить расширение в Opencart 2 (27.04.2017)
- Загрузка файлов (картинок) по ajax через форму для Opencart (04.09.2016)
- Opencart: Как не показывать какой-либо товар в списке на странице производителей? (29.07.2015)
15 комментариев
Андрей, спасибо. Теперь у контактов и карты сайта ссылки стали со слешем на конце - /contacts/, страница открывается, но вверху пишется замечание:
Notice: Undefined offset: 1 in .../catalog/controller/common/seo_pro.php on line 37
это строка: $this->request->get[$url[0]] = $url[1];
но другие статичные страницы (доставка товара, возврат, производители, акции) из нижнего меню остались с index.php?route. Это всё в случае SEO PRO
У вас как? и добавляли ли вы в таблицу url_alias пути к каким-либо статичным страницам (для которых не указать ЧПУ в админке)
Да, действительно, забыл что удалил из базы все алиасы.
Но, Андрей остаётся косяк:
так как модифицированный seo_url.php добавляет на конце слэш, то ссылка на главную становится - http://ocstore:8888// (в конец добавляется второй слеш).
и строка - Notice: Undefined offset: 1 in /Users/macbook/Sites/ocstore/catalog/controller/common/seo_pro.php on line 37 остаётся
EDIT: закомментировал строку
//$this->request->get[$url[0]] = $url[1];
убралась ошибки - Notice: Undefined offset: 1 in /Users/macbook/Sites/ocstore/catalog/controller/common/seo_pro.php on line 37
и Warning: Cannot modify header information - headers already sent by
Были ещё ошибки (из-за нестыковки с модулем Блог 3.0.7), вот мой исправленный методом проб файл seo_url.php: seo_url.php.zip
У меня товары перестают открываться после внесения указанных изменений.
А указанные замены вроде checkout/cart -> cart проходят успешно, да.
В чем косяк? Как исправить?
?
Вот бы VQmod под эту тему забабахать.. Я сделал xml по инструкции на версию 1.5.5.1 и добавил алиасы в базу, но не пашет :(
Делюсь своим кодом xml-файла для vqmod (кто поправит ошибки - большая просьба тоже поделиться):
<modification>
<id>SEO URL Replace</id>
<version>1.5.5</version>
<vqmver>1.0</vqmver>
<author>Me</author>
<file name="catalog/controller/common/seo_url.php">
<operation error="log">
<search position="before" >
<![CDATA[if (isset($this->request->get['route']))]]></search>
<add><![CDATA[
/* SEO Custom URL 1 */
else {
$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE keyword = '" . $this->db->escape($this->request->get['_route_']) . "'");
if ($query->num_rows) {
$this->request->get['route'] = $query->row['query'];
}
}
/* SEO Custom URL 1 */
]]></add>
</operation>
<operation error="log">
<search position="after" >
<![CDATA[unset($data[$key]);
}]]></search>
<add><![CDATA[
/* SEO Custom URL 2 */
else {
$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = '" . $this->db->escape($data['route']) . "'");
if ($query->num_rows) {
$url .= '/' . $query->row['keyword'];
unset($data[$key]);
}
}
/* SEO Custom URL 2 */
]]></add>
</operation>
</file>
</modification>