Настройка ЧПУ во второй версии известной системы OpenCart достаточно простое и удобное. Но тем не менее, разработчики не доделали некоторые моменты, которые могут доставить некоторые неудобства пользователям. В этой статье, рассмотрим весь процесс настройки ЧПУ в OpenCart 2. Сразу отмечу, что статья писалась и тестировалась с оригинальной сборкой OpenCart Version 2.0.1.1, в других версиях возможно будут небольшие отличия, но общий принцип остается тем же.
Включаем использование ЧПУ в системе OpenCart 2.
Делается это очень просто. Для начала открываем корневой каталог вашего сайта, с помощью FTP-клиента или файлового менеджера в панели управления хостингом. В этом каталоге находим файл .htaccess.txt и меняем его имя на .htaccess (т.е. убираем .txt в конце имени).
Далее заходим в админку вашего сайта и переходим в раздел настроек магазина.
В разделе настроек переходим на вкладку Сервер (Server) и находим там переключатель «Использовать ЧПУ» (Use SEO URLs) и ставим его в положение «Да» (Yes).
После чего нажимаем на изображение синей дискетки в верхнем правом углу экрана, для сохранения настроек.
Все, теперь на нашем сайте работает поддержка ЧПУ и почти все адреса, стали выглядеть красиво. Но такие страницы как главная страница, корзина, страница авторизации, регистрации и т.д. остались с адресами вида index.php?route=common/home, не смотря на включенное ЧПУ.
Решение проблем с ЧПУ в OpenCart 2 для системных страниц.
Непонятно по каким причинам, но разработчики второй версии системы OpenCart почему-то не предусмотрели возможность использования ЧПУ для служебных страниц. Давайте рассмотрим, как это можно исправить.
Первым делом, находи файл \catalog\controller\common\seo_url.php — это файл отвечает за работу ЧПУ.
Перед внесением правок в этом файле, обязательно сохраните его резервную копию.
Открываем указанный файл для редактирования и находим в нем следующую часть кода:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
if (isset($data['route'])) { if (($data['route'] == 'product/product' && $key == 'product_id') || (($data['route'] == 'product/manufacturer/info' || $data['route'] == 'product/product') && $key == 'manufacturer_id') || ($data['route'] == 'information/information' && $key == 'information_id')) { $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = '" . $this->db->escape($key . '=' . (int)$value) . "'"); if ($query->num_rows && $query->row['keyword']) { $url .= '/' . $query->row['keyword']; unset($data[$key]); } } elseif ($key == 'path') { $categories = explode('_', $value); foreach ($categories as $category) { $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = 'category_id=" . (int)$category . "'"); if ($query->num_rows && $query->row['keyword']) { $url .= '/' . $query->row['keyword']; } else { $url = ''; break; } } unset($data[$key]); } } |
Этот код вым нужно заменить на:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
if (isset($data['route'])) { if (($data['route'] == 'product/product' && $key == 'product_id') || (($data['route'] == 'product/manufacturer/info' || $data['route'] == 'product/product') && $key == 'manufacturer_id') || ($data['route'] == 'information/information' && $key == 'information_id')) { $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = '" . $this->db->escape($key . '=' . (int)$value) . "'"); if ($query->num_rows && $query->row['keyword']) { $url .= '/' . $query->row['keyword']; unset($data[$key]); } } elseif ($key == 'path') { $categories = explode('_', $value); foreach ($categories as $category) { $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = 'category_id=" . (int)$category . "'"); if ($query->num_rows && $query->row['keyword']) { $url .= '/' . $query->row['keyword']; } else { $url = ''; break; } } unset($data[$key]); }else{ $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = '" . $this->db->escape($value) . "'"); if (($query->num_rows && $query->row['keyword']) or $value == 'common/home') { $url .= '/' . $query->row['keyword']; unset($data[$key]); } } } |
Далее через панель управления хостингом (сервером) заходим в систему управления базой данных(PhpMyAdmin), открываем вкладку SQL и в появившемся поле для ввода текста вводим следующие команды (просто вставляем этот текст):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
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', 'shopping-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'); |
И нажимаете на кнопку «Ок».
Обратите внимание на то, что при url_alias — это название таблицы в которой будут происходить вышеуказанные изменения и у вас эта таблица может быть с префиксом в начале названия, обычно это oc_url_alias. В этом случае допишите ваш префикс в каждой строке, в название таблици.
После того как все сделано, перейдите в каталог system/cache и удалите в нем все файлы кроме index.html, таким образом вы очистите кеш.
Вот собственно и все. Если вы все сделали как описано в данной статье, то в результате вы получите красивые адреса системных страниц OpenCart 2.
Так же для экономии времени и более быстрого редактирования товаров и категорий, рекомендуем использовать OpenCart Quick Editor. Подробнее >>
Спасибо, очень помогла ваша статья! Сейчас очень мало информации по версии 2.0.1.1. Спасибо!
Подскажите, поменял .htaccess.txt на .htaccess но ЧПУ не заработало, а выдает ошибку 500
что не так?
Попробуйте найти в .htaccess строку:
Options +FollowSymlinks
и закомментируйте (поставьте в начале строки знак решетка), у вас должно получиться вот так:
#Options +FollowSymlinks
Или просто удалите эту строку. Должно заработать.
Здравствуйте! Следовал всем вашим шагам, но: 1) Выскакивает такая ошибка Notice: Undefined index: keyword in /Applications/MAMP/htdocs/catalog/controller/common/seo_url.php on line 89Notice: Undefined index: keyword in /Applications/MAMP/htdocs/catalog/controller/common/seo_url.php on line 89Notice: Undefined index: keyword in /Applications/MAMP/htdocs/catalog/controller/common/seo_url.php on line 89
2)Прописывая в PHPMyAdmin команды выдаёт ошибку:»Error
SQL query:
INSERT INTO url_alias (query, keyword) VALUES (‘common/home’, »);
MySQL said: Documentation
#1146 — Table ‘3306.url_alias’ doesn’t exist «.
Работаю на локалке. OC 2.0
Буду благодарен за помощь.
Здравствуйте!
Проверьте есть ли у вас таблица url_alias. Возможно она имеет какой-то префикс, например oc_url_alias.
Если имя таблицы у вас указано правильно, то проверьте существуют ли в ней колонка «keyword».
Подскажите как реализовать аналогичную штуку на opencart 1.5.5.1 стандартное сео (не seo_pro)
Дело в том что в БД я алиасы внес, но результата ноль. Установил паладин сео менеджер, попытался через него добавить, аналогичная проблема алиасы в Бд вносятся но на сайте без измененний. (кеш чистил .htaccess переименован)
Как вариант, Вы можете заменить код стандартного модуля для ЧПУ, на код seo_pro. Но если у Вас нет опыта работы с PHP, то могут возникнуть трудности. В следующей статье я пошагово опишу как это правильно сделать.
Спасибо большое!
Благодарю автора за информацию. Правда, очень сложно найти инфу по работе с этой версией движка.
Примите мою благодарность.
Доброго времени суток!
У мня нет таблицы url_alias и oc_url_alias. Что делать?
Прошу прощения, oc_url_alias нашла, все получилось. Подскажите, как сделать, чтобы товар везде открывался http://www.адрес_сайта/категория/подкатегория/url_товара с любой страницы. А то с главной открывается по адресу http://www.адрес_сайта/url_товара, с категории http://www.адрес_сайта/категория/url_товара, а с подкатегории http://www.адрес_сайта/категория/подкатегория/url_товара. Это же такой бардак! Как с ним разобраться?
Здравствуйте, Светлана!
На Ваш вопрос в двух словах не ответить. Возможно в дальнейшем опубликуем статью описывающую решение данного вопроса. Или же мы можем решить Вашу проблему индивидуально в рамках платного обслуживания. E-mail: или Skype: info.madnet
Спасибо, конечно! Только проблема отпала. После изменений, которые я внесла с вашего сообщения, вдруг заработал модуль Seo Pro. А то все ошибки выдавал.
Здравствуйте. Сделал все по Ваше инструкции, вроде все получилось, но сайт теперь не открывается. (белый экран). Перезагрузка страницы ни к чему не приводит. Помогите(
P.S еще выдавал ошибку — Ошибка при указании соединения для controluser в конфигурации.
Здравствуйте!
Видимо Вы что-то сделали неправильно. Без доступа к сайту и проверки его трудно что-то сказать.
Попробуйте включить отображение ошибок и предупреждений в настройках хостинг и посмотрите, какие ошибки выдаст сайт. И напишите эти ошибки сюда, попробуем разобраться.
Здравствуйте! Спасибо помогло!
Административную часть исправило.Но ссылки к товарам и категориям вернуло как при отключеном ЧПУ
index.php?route=product/category&path=20_60.Что делать?Помогите пожалуйста.
Здравствуйте!
Попробуйте зайти в каталог system/cache и удалить там все файлы кроме index.html
Я это делал,не помогло.У меня ЧПУ в админке теперь отключает ссылки index.php?route регистрацию,вход и т.д..а в категориях и товаров нет.
А у Вас для товаров ЧПУ прописаны? Т.е. в самих карточках товара в админке.
Да прописано все! Если востановляю исходный файл seo_url то в категориях и товарах нормальные ссылки /tehnikadliakrasi/hairdressing
А какая у вас версия OpenCart? И у Вас OpenCart или сборка ocStore?
2.0.1.1
Скинуть ссылку на сайт посмотрите?
К сожалению нет возможности проверять правильность выполнения данной инструкции и исправлять ошибки каждому читателю индивидуально, но я могу помочь Вам решить возникшую проблему и настроить ЧПУ как нужно в рамках платного обслуживания.
Спасибо Вам огромное.Все отлично,разобрался.)
Отличная статья, можно добавить, что если опенкарт лежит не в корню, в .htaccess нужно прописать путь в RewriteBase.
Тоже при выполнении всех шагов была ошибка 500.
Решение вот:
Попробуйте найти в .htaccess строку:
Options +FollowSymlinks
и закомментируйте (поставьте в начале строки знак решетка), у вас должно получиться вот так:
#Options +FollowSymlinks
Или просто удалите эту строку. Должно заработать.
Большое спасибо.
Options +FollowSymlinks
попробуй замени на
Options +SymLinksIfOwnerMatch
(для ukraine.com.ua заработало)
Добрый день. Все сделал как надо но в момент когда я меняю выше указанный код в этой странице \catalog\controller\common\seo_url.php
У меня выскакивает ошибка в редакторе: syntax error unexpected ‘;’ не могу понять где в этой строке ошибка if (($data[‘route’] == ‘product/product’ && $key == ‘product_id’) || (($data[‘route’] == ‘product/manufacturer/info’ || $data[‘route’] == ‘product/product’) && $key == ‘manufacturer_id’) || ($data[‘route’] == ‘information/information’ && $key == ‘information_id’)) {
При публикации кода, некоторые символы были переведены в неправильный формат. Сейчас это исправлено. Попробуйте теперь скопировать код с сайта.
подскажите. при включении ЧПУ у товаров появляются урлы типа /cat/podcat?product_id=11
а в брендах /brendy/cat?product_id=11 и при этом сама страница с карточкой товара не открывается а открывается опять же страница со списком брендов как на /brendy/podcat
хотя разобрался, до меня не так чпу делали, Ваш способ отличный
INSERT INTO oc_url_alias (query, keyword) VALUES (‘common/home’, »);
INSERT INTO oc_url_alias (query, keyword) VALUES (‘account/wishlist’, ‘wishlist’);
INSERT INTO oc_url_alias (query, keyword) VALUES (‘account/account’, ‘my-account’);
INSERT INTO oc_url_alias (query, keyword) VALUES (‘checkout/cart’, ‘shopping-cart’);
INSERT INTO oc_url_alias (query, keyword) VALUES (‘checkout/checkout’, ‘checkout’);
INSERT INTO oc_url_alias (query, keyword) VALUES (‘account/login’, ‘login’);
INSERT INTO oc_url_alias (query, keyword) VALUES (‘account/logout’, ‘logout’);
INSERT INTO oc_url_alias (query, keyword) VALUES (‘account/order’, ‘order-history’);
INSERT INTO oc_url_alias (query, keyword) VALUES (‘account/newsletter’, ‘newsletter’);
INSERT INTO oc_url_alias (query, keyword) VALUES (‘product/special’, ‘specials’);
INSERT INTO oc_url_alias (query, keyword) VALUES (‘affiliate/account’, ‘affiliates’);
INSERT INTO oc_url_alias (query, keyword) VALUES (‘checkout/voucher’, ‘gift-vouchers’);
INSERT INTO oc_url_alias (query, keyword) VALUES (‘product/manufacturer’, ‘brands’);
INSERT INTO oc_url_alias (query, keyword) VALUES (‘information/contact’, ‘contact-us’);
INSERT INTO oc_url_alias (query, keyword) VALUES (‘account/return/insert’, ‘request-return’);
INSERT INTO oc_url_alias (query, keyword) VALUES (‘information/sitemap’, ‘sitemap’);
INSERT INTO oc_url_alias (query, keyword) VALUES (‘account/forgotten’, ‘forgot-password’);
INSERT INTO oc_url_alias (query, keyword) VALUES (‘account/download’, ‘downloads’);
INSERT INTO oc_url_alias (query, keyword) VALUES (‘account/return’, ‘returns’);
INSERT INTO oc_url_alias (query, keyword) VALUES (‘account/transaction’, ‘transactions’);
INSERT INTO oc_url_alias (query, keyword) VALUES (‘account/register’, ‘create-account’);
INSERT INTO oc_url_alias (query, keyword) VALUES (‘product/compare’, ‘compare-products’);
INSERT INTO oc_url_alias (query, keyword) VALUES (‘product/search’, ‘search’);
INSERT INTO oc_url_alias (query, keyword) VALUES (‘account/edit’, ‘edit-account’);
INSERT INTO oc_url_alias (query, keyword) VALUES (‘account/password’, ‘change-password’);
INSERT INTO oc_url_alias (query, keyword) VALUES (‘account/address’, ‘address-book’);
INSERT INTO oc_url_alias (query, keyword) VALUES (‘account/reward’, ‘reward-points’);
INSERT INTO oc_url_alias (query, keyword) VALUES (‘affiliate/edit’, ‘edit-affiliate-account’);
INSERT INTO oc_url_alias (query, keyword) VALUES (‘affiliate/password’, ‘change-affiliate-password’);
INSERT INTO oc_url_alias (query, keyword) VALUES (‘affiliate/payment’, ‘affiliate-payment-options’);
INSERT INTO oc_url_alias (query, keyword) VALUES (‘affiliate/tracking’, ‘affiliate-tracking-code’);
INSERT INTO oc_url_alias (query, keyword) VALUES (‘affiliate/transaction’, ‘affiliate-transactions’);
INSERT INTO oc_url_alias (query, keyword) VALUES (‘affiliate/logout’, ‘affiliate-logout’);
INSERT INTO oc_url_alias (query, keyword) VALUES (‘affiliate/forgotten’, ‘affiliate-forgot-password’);
INSERT INTO oc_url_alias (query, keyword) VALUES (‘affiliate/register’, ‘create-affiliate-account’);
INSERT INTO oc_url_alias (query, keyword) VALUES (‘affiliate/login’, ‘affiliate-login’);
Спс все работает. Запрос для sql с префиксом по умолчанию
Автор спасибище тебе! Все работает агонь!
Спасибо огромное Вам!!! Все работает!
Спасибо! Долго искал как этот сделать, и вот.. все работает!
Прекрасная статья, спасибо.
Отличная, конкретная, правильная инфа без багов. Респект автору )!