OpenCart 2. Настройка ЧПУ (SEF)

Настройка ЧПУ во второй версии известной системы OpenCart достаточно простое и удобное. Но тем не менее, разработчики не доделали некоторые моменты, которые могут доставить некоторые неудобства пользователям. В этой статье, рассмотрим весь процесс настройки ЧПУ в OpenCart 2. Сразу отмечу, что статья писалась и тестировалась с оригинальной сборкой OpenCart Version 2.0.1.1, в других версиях возможно будут небольшие отличия, но общий принцип остается тем же.

Включаем использование ЧПУ в системе OpenCart 2.

Делается это очень просто. Для начала открываем корневой каталог вашего сайта, с помощью FTP-клиента или файлового менеджера в панели управления хостингом. В этом каталоге находим файл .htaccess.txt и меняем его имя на .htaccess (т.е. убираем .txt в конце имени).

OpenCart 2. Настройка ЧПУ

Далее заходим в админку вашего сайта и переходим в раздел настроек магазина.

OpenCart 2.0. Настройка ЧПУ

В разделе настроек переходим на вкладку Сервер (Server) и находим там переключатель «Использовать ЧПУ» (Use SEO URLs) и ставим его в положение «Да» (Yes).

OpenCart 2.0. Настройка ЧПУ.

После чего нажимаем на изображение синей дискетки в верхнем правом углу экрана, для сохранения настроек.
Все, теперь на нашем сайте работает поддержка ЧПУ и почти все адреса, стали выглядеть красиво. Но такие страницы как главная страница, корзина, страница авторизации, регистрации и т.д. остались с адресами вида 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');

OpenCart 2.0. Настройка ЧПУ.

И нажимаете на кнопку «Ок».

Обратите внимание на то, что при url_alias — это название таблицы в которой будут происходить вышеуказанные изменения и у вас эта таблица может быть с префиксом в начале названия, обычно это oc_url_alias. В этом случае допишите ваш префикс в каждой строке, в название таблици.

OpenCart 2.0. Настройка ЧПУ.

После того как все сделано, перейдите в каталог system/cache и удалите в нем все файлы кроме index.html, таким образом вы очистите кеш.

Вот собственно и все. Если вы все сделали как описано в данной статье, то в результате вы получите красивые адреса системных страниц OpenCart 2.

Так же для экономии времени и более быстрого редактирования товаров и категорий, рекомендуем использовать OpenCart Quick Editor. Подробнее >>

 

38 Comments to “OpenCart 2. Настройка ЧПУ (SEF)”

  1. Posche 911:

    Спасибо, очень помогла ваша статья! Сейчас очень мало информации по версии 2.0.1.1. Спасибо!

  2. Владислав:

    Подскажите, поменял .htaccess.txt на .htaccess но ЧПУ не заработало, а выдает ошибку 500
    что не так?

    • admin:

      Попробуйте найти в .htaccess строку:
      Options +FollowSymlinks
      и закомментируйте (поставьте в начале строки знак решетка), у вас должно получиться вот так:
      #Options +FollowSymlinks
      Или просто удалите эту строку. Должно заработать.

  3. Влад:

    Здравствуйте! Следовал всем вашим шагам, но: 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

    Буду благодарен за помощь.

    • admin:

      Здравствуйте!
      Проверьте есть ли у вас таблица url_alias. Возможно она имеет какой-то префикс, например oc_url_alias.
      Если имя таблицы у вас указано правильно, то проверьте существуют ли в ней колонка «keyword».

  4. Денис:

    Подскажите как реализовать аналогичную штуку на opencart 1.5.5.1 стандартное сео (не seo_pro)
    Дело в том что в БД я алиасы внес, но результата ноль. Установил паладин сео менеджер, попытался через него добавить, аналогичная проблема алиасы в Бд вносятся но на сайте без измененний. (кеш чистил .htaccess переименован)

    • admin:

      Как вариант, Вы можете заменить код стандартного модуля для ЧПУ, на код seo_pro. Но если у Вас нет опыта работы с PHP, то могут возникнуть трудности. В следующей статье я пошагово опишу как это правильно сделать.

  5. Stas:

    Спасибо большое!

  6. Алексей:

    Благодарю автора за информацию. Правда, очень сложно найти инфу по работе с этой версией движка.
    Примите мою благодарность.

  7. Светлана:

    Доброго времени суток!

    У мня нет таблицы url_alias и oc_url_alias. Что делать?

    • Светлана:

      Прошу прощения, oc_url_alias нашла, все получилось. Подскажите, как сделать, чтобы товар везде открывался http://www.адрес_сайта/категория/подкатегория/url_товара с любой страницы. А то с главной открывается по адресу http://www.адрес_сайта/url_товара, с категории http://www.адрес_сайта/категория/url_товара, а с подкатегории http://www.адрес_сайта/категория/подкатегория/url_товара. Это же такой бардак! Как с ним разобраться?

    • admin:

      Здравствуйте, Светлана!
      На Ваш вопрос в двух словах не ответить. Возможно в дальнейшем опубликуем статью описывающую решение данного вопроса. Или же мы можем решить Вашу проблему индивидуально в рамках платного обслуживания. E-mail: или Skype: info.madnet

  8. Светлана Ковалева:

    Спасибо, конечно! Только проблема отпала. После изменений, которые я внесла с вашего сообщения, вдруг заработал модуль Seo Pro. А то все ошибки выдавал.

  9. Сергей:

    Здравствуйте. Сделал все по Ваше инструкции, вроде все получилось, но сайт теперь не открывается. (белый экран). Перезагрузка страницы ни к чему не приводит. Помогите(

    P.S еще выдавал ошибку — Ошибка при указании соединения для controluser в конфигурации.

    • admin:

      Здравствуйте!
      Видимо Вы что-то сделали неправильно. Без доступа к сайту и проверки его трудно что-то сказать.
      Попробуйте включить отображение ошибок и предупреждений в настройках хостинг и посмотрите, какие ошибки выдаст сайт. И напишите эти ошибки сюда, попробуем разобраться.

  10. Евгений:

    Здравствуйте! Спасибо помогло!
    Административную часть исправило.Но ссылки к товарам и категориям вернуло как при отключеном ЧПУ
    index.php?route=product/category&path=20_60.Что делать?Помогите пожалуйста.

    • admin:

      Здравствуйте!

      Попробуйте зайти в каталог system/cache и удалить там все файлы кроме index.html

  11. Евгений:

    Я это делал,не помогло.У меня ЧПУ в админке теперь отключает ссылки index.php?route регистрацию,вход и т.д..а в категориях и товаров нет.

    • admin:

      А у Вас для товаров ЧПУ прописаны? Т.е. в самих карточках товара в админке.

  12. Евгений:

    Да прописано все! Если востановляю исходный файл seo_url то в категориях и товарах нормальные ссылки /tehnikadliakrasi/hairdressing

    • admin:

      А какая у вас версия OpenCart? И у Вас OpenCart или сборка ocStore?

  13. Евгений:

    Скинуть ссылку на сайт посмотрите?

    • admin:

      К сожалению нет возможности проверять правильность выполнения данной инструкции и исправлять ошибки каждому читателю индивидуально, но я могу помочь Вам решить возникшую проблему и настроить ЧПУ как нужно в рамках платного обслуживания.

  14. Евгений:

    Спасибо Вам огромное.Все отлично,разобрался.)

  15. Юрий Дегтяр:

    Отличная статья, можно добавить, что если опенкарт лежит не в корню, в .htaccess нужно прописать путь в RewriteBase.

  16. Юрий:

    Тоже при выполнении всех шагов была ошибка 500.
    Решение вот:
    Попробуйте найти в .htaccess строку:
    Options +FollowSymlinks
    и закомментируйте (поставьте в начале строки знак решетка), у вас должно получиться вот так:
    #Options +FollowSymlinks
    Или просто удалите эту строку. Должно заработать.

    Большое спасибо.

    • Sanya:

      Options +FollowSymlinks
      попробуй замени на
      Options +SymLinksIfOwnerMatch
      (для ukraine.com.ua заработало)

  17. Александр:

    Добрый день. Все сделал как надо но в момент когда я меняю выше указанный код в этой странице \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’)) {

    • admin:

      При публикации кода, некоторые символы были переведены в неправильный формат. Сейчас это исправлено. Попробуйте теперь скопировать код с сайта.

  18. Alex:

    подскажите. при включении ЧПУ у товаров появляются урлы типа /cat/podcat?product_id=11

    а в брендах /brendy/cat?product_id=11 и при этом сама страница с карточкой товара не открывается а открывается опять же страница со списком брендов как на /brendy/podcat

  19. Sanya:

    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 с префиксом по умолчанию

  20. Sten:

    Автор спасибище тебе! Все работает агонь!

  21. Максим:

    Спасибо огромное Вам!!! Все работает!

  22. Александр:

    Спасибо! Долго искал как этот сделать, и вот.. все работает!

  23. Влад:

    Прекрасная статья, спасибо.

  24. Екатерина:

    Отличная, конкретная, правильная инфа без багов. Респект автору )!

Оставить комментарий

Комментарий

Форма заказа



Дополнительная информация ∨


Мы гарантируем 100% конфиденциальность отправленных данных.

×