Настраиваем SEO urls для страниц магазина на OpenCart (ЧПУ в OpenCart)

Настраиваем SEO urls для страниц магазина на OpenCart (ЧПУ в OpenCart) Некоторые страницы не обретают красивый вид, даже при включении режима ЧПУ (Обычного или Seo Pro)

Я использую Обычный режим ЧПУ, потому что устанавливал модуль блог и для него вносил правки в файл /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'а.



Другие статьи по этой теме:

Комментарии (15)     Подпишитесь на RSS комментариев к этой статье.

15 комментариев

#331
Андрей говорит:
March 18, 2012 at 09:51 pm
Добрый вечер! Скажите пожалуйста как это настроить в seo pro. У меня не выходит. Заранее благодарен.
#334
almix говорит:
March 18, 2012 at 10:36 pm
Андрей, аналогично. Пока сам воюю... то одно работает, а другое отвалится, то наоборот. Я установил ещё модуль Блог и для категорий модуль с раскрывающимся меню и сам запутался уже. Давайте биться вместе.)
#335
Андрей говорит:
March 18, 2012 at 11:02 pm
вот на этой ветке сделали для обычного модуля ЧПУ _ttp://forum.opencart.com/viewtopic.php?f=20&t=32872. Я лично пробовал все работает. Но вот как это реализовать в SEO PRO без понятия. В пхп не силен. В общем получается в стандартном модуле проблема с ссылками на товары, они получаются вида site.ru/tovar1 вместо site.ru/категория/подкатегория/tovar1, а в SEO PRO проблема с ссылками index.php?route
#336
Андрей говорит:
March 19, 2012 at 01:36 pm
#342
almix говорит:
March 20, 2012 at 09:06 am

Андрей, спасибо. Теперь у контактов и карты сайта ссылки стали со слешем на конце - /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 пути к каким-либо статичным страницам (для которых не указать ЧПУ в админке)

#343
Андрей говорит:
March 20, 2012 at 12:18 pm
На той странице что я указал есть список запросов у базе данных, их нужно выполнить, там происходит как раз замена ЧПУ страниц для которых в админке нельзя указать. Далее нужно заменить файл seo_pro.php. Я сделал так и все ок. Вы на локальном хостинге работаете или на удаленном? 
#361
almix говорит:
March 22, 2012 at 05:18 pm

Да, действительно, забыл что удалил из базы все алиасы.

Но, Андрей остаётся косяк:

так как модифицированный 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

#495
Ринат говорит:
June 8, 2012 at 07:03 pm
Добрый вечер. Я только осваиваю opencart, и  не все пока знаю. Пытаюсь настроить seo url по вашей рекомендации. Скажите, а где находится url  таблица, чтобы добавить в  url_alias. Как в них войти, в таблицы?
#497
almix говорит:
June 9, 2012 at 01:13 pm
url_alias - это таблица в вашей БД MySQL. Заходите в phpMyAdmin, и там выбираете вашу БД и таблицу url_alias, и в неё вставляете новую запись для нужного url.
#650
Вячеслав говорит:
September 25, 2012 at 11:31 pm

У меня товары перестают открываться после внесения указанных изменений.

А указанные замены вроде checkout/cart -> cart проходят успешно, да.

В чем косяк? Как исправить?

#663
almix говорит:
October 5, 2012 at 01:53 am
Вячеслав, аккуратно проверьте все правки для товаров (products) в файле seo_url.php. Выше в комментарии я свой файл указал. Сравните. Не устанавливали других модулей каких?
#674
Елена говорит:
October 7, 2012 at 06:16 pm
Подскажите, плиз, как решить задачу. сейчас урлы выглядят, как домен/рубрика/подрубрика/товар. Хочу сделать как в ВП - просто домен/товар.хтмл
?

#697
Александр говорит:
November 9, 2012 at 04:29 am
А реально это сделать в формате vqmod? Хотя бы изменения в файлы внести? И осмысленно ли это?
#781
Михаил говорит:
February 22, 2013 at 04:44 pm
а есть может у кого нибуть готовые файлы?
#877
Алексей говорит:
May 20, 2013 at 09:49 pm

Вот бы 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>