Статьи

Как переписать пользовательские URL в OpenCart

В этом уроке мы рассмотрим детали пользовательских SEO-дружественных URL. Это важный аспект, на который следует обратить внимание при разработке пользовательских модулей, и он также влияет на общий рейтинг в поисковых системах.

Мы будем использовать последнюю версию OpenCart, поэтому убедитесь, что вы установили ее, чтобы следовать коду.

Вот краткое изложение шагов, которые нам необходимо предпринять для создания пользовательских URL-адресов в OpenCart:

  • Во-первых, нам нужно понять, как это работает в ядре.
  • Мы пройдем через изменения, необходимые в основных файлах.
  • Мы кратко рассмотрим запросы SQL, чтобы вставить наши пользовательские сопоставления URL.
  • Мы рассмотрим, как использовать встроенные функции перезаписи.

Итак, это быстрый взгляд на то, что будет дальше. Давайте перейдем к первой теме.

Прежде всего, важно понять, как работают URL-адреса SEO в ядре OpenCart.

Идите дальше и изучите записи в таблице MySQL «url_alias», используя phpMyAdmin или что-то подобное. Вы увидите такие отображения.

1
2
3
4
product_id=48 ipod-classic
category_id=20 desktops
manufacturer_id=8 apple
information_id=6 delivery

Здесь нужно отметить два важных столбца. Первый столбец запроса содержит фактический путь, а второй — ключевое слово , в котором хранится псевдоним SEO для этого URL.

Как видите, существуют сопоставления для различных объектов, таких как продукт, категория, информация и производитель. Всякий раз, когда какая-либо сущность сохраняется в серверной части OpenCart, в эту таблицу добавляется связанная запись.

Во внешнем интерфейсе, когда пользователь обращается к URL-адресу, OpenCart находит соответствующее отображение из таблицы «url_alias». Таким образом, фактическая сущность сопоставляется с SEO-дружественным URL.

Давайте откроем файл catalog/controller/common/seo_url.php и рассмотрим следующий фрагмент из метода index .

01
02
03
04
05
06
07
08
09
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
public function index() {
    // Add rewrite to url class
    if ($this->config->get(‘config_seo_url’)) {
        $this->url->addRewrite($this);
    }
 
    // Decode URL
    if (isset($this->request->get[‘_route_’])) {
        $parts = explode(‘/’, $this->request->get[‘_route_’]);
 
        // remove any empty arrays from trailing
        if (utf8_strlen(end($parts)) == 0) {
            array_pop($parts);
        }
 
        foreach ($parts as $part) {
            $query = $this->db->query(«SELECT * FROM » . DB_PREFIX . «url_alias WHERE keyword = ‘» . $this->db->escape($part) . «‘»);
 
            if ($query->num_rows) {
                $url = explode(‘=’, $query->row[‘query’]);
 
                if ($url[0] == ‘product_id’) {
                    $this->request->get[‘product_id’] = $url[1];
                }
 
                if ($url[0] == ‘category_id’) {
                    if (!isset($this->request->get[‘path’])) {
                        $this->request->get[‘path’] = $url[1];
                    } else {
                        $this->request->get[‘path’] .= ‘_’ .
                    }
                }
 
                if ($url[0] == ‘manufacturer_id’) {
                    $this->request->get[‘manufacturer_id’] = $url[1];
                }
 
                if ($url[0] == ‘information_id’) {
                    $this->request->get[‘information_id’] = $url[1];
                }
 
                if ($query->row[‘query’] && $url[0] != ‘information_id’ && $url[0] != ‘manufacturer_id’ && $url[0] != ‘category_id’ && $url[0] != ‘product_id’) {
                    $this->request->get[‘route’] = $query->row[‘query’];
                }
            } else {
                $this->request->get[‘route’] = ‘error/not_found’;
 
                break;
            }
        }
 
        if (!isset($this->request->get[‘route’])) {
            if (isset($this->request->get[‘product_id’])) {
                $this->request->get[‘route’] = ‘product/product’;
            } elseif (isset($this->request->get[‘path’])) {
                $this->request->get[‘route’] = ‘product/category’;
            } elseif (isset($this->request->get[‘manufacturer_id’])) {
                $this->request->get[‘route’] = ‘product/manufacturer/info’;
            } elseif (isset($this->request->get[‘information_id’])) {
                $this->request->get[‘route’] = ‘information/information’;
            }
        }
 
        if (isset($this->request->get[‘route’])) {
            return new Action($this->request->get[‘route’]);
        }
    }
}

Как вы можете видеть, мы выбираем соответствующую запись из таблицы «url_alias». После этого параметр запроса анализируется и возвращается соответствующий внутренний путь.

Так вот, как это работает в ядре. К сожалению, настройка работает только для основных URL-адресов — для пользовательских URL-адресов нам необходимо изменить основной код. Это рецепт нашего следующего раздела.

Откройте файл catalog/controller/common/seo_url.php и замените метод rewrite следующим.

01
02
03
04
05
06
07
08
09
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
public function rewrite($link) {
    $url_info = parse_url(str_replace(‘&’, ‘&’, $link));
 
    $url = »;
 
    $data = array();
    parse_str($url_info[‘query’], $data);
 
    foreach ($data as $key => $value) {
        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 .= ‘/’ .
 
                    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 .= ‘/’ .
                    } else {
                        $url = »;
 
                        break;
                    }
                }
 
                unset($data[$key]);
            // OUR CUSTOM CODE
            } else {
                $query = $this->db->query(«SELECT * FROM » . DB_PREFIX . «url_alias WHERE `query` = ‘» . $data[‘route’] . «‘»);
 
                if ($query->num_rows && $query->row[‘keyword’]) {
                    $url .= ‘/’ .
                } else {
                    $url = »;
                     
                    break;
                }
            }
            // OUR CUSTOM CODE
        }
    }
 
    if ($url) {
        unset($data[‘route’]);
            $query = »;
 
        if ($data) {
            foreach ($data as $key => $value) {
                $query .= ‘&’ .
            }
 
            if ($query) {
                $query = ‘?’
            }
        }
 
        return $url_info[‘scheme’] .
    } else {
        return $link;
    }
}

Метод rewrite используется для преобразования внутреннего URL-адреса в оптимизированный для SEO. Но он делает это только для внутренних URL. Следовательно, нам нужно добавить собственный код, чтобы он работал и для наших пользовательских модулей. В наших изменениях кода мы предоставили последний случай, который загружает отображение для нашего пользовательского модуля. Мы еще не добавили наше пользовательское сопоставление, поэтому давайте сделаем это в следующем разделе.

Хотя мы изменили файл ядра напрямую, это просто ради простоты. Вы должны использовать OCMOD, чтобы изменить файл ядра без его фактического изменения.

В этом разделе мы добавим SEO-сопоставление URL для нашего пользовательского модуля. Опять же, это простой SQL для примера — вы можете добиться этого с помощью скриптов установки модуля.

1
INSERT INTO `url_alias` (`query`, `keyword`) VALUES (‘custom/custom’, ‘custom-rewrite’);

Иди вперед и запусти его в своей базе данных OpenCart.

В следующем и последнем разделе мы увидим, как использовать вспомогательную функцию для создания SEO-дружественных ссылок.

Создайте новый файл catalog/controller/custom/custom.php со следующим содержимым.

1
2
3
4
5
6
7
<?php
class ControllerCustomCustom extends Controller {
    function index() {
        $data[‘customlink’] = $this->url->link(‘custom/custom’);
        $this->response->setOutput(‘<a href=»‘.$data[‘customlink’].'»>Custom URL Rewrite Link</a>’);
    }
}

Теперь в интерфейсе откройте URL-адрес http://www.yourstore.com/index.php?route=custom/custom .

Да, это простой белый экран только с одной ссылкой, и это то, что мы намеревались. Здесь важно отметить URL этой ссылки — теперь она оптимизирована для SEO! Нажмите на него, и он загрузит ту же страницу, так как мы добавили отображение для этого в таблицу «url_alias».

Итак, вот и вся концепция, продемонстрированная простым способом. Вы можете расширить его и создать модель для вставки SEO-дружественных ссылок для вашего пользовательского модуля.

Сегодня мы обсудили важную тему в OpenCart — настраиваемые оптимизированные для SEO URL-адреса. Мы использовали очень простой подход, чтобы объяснить это, и я надеюсь, что это было полезно для вас.

Если вы ищете дополнительные инструменты OpenCart, утилиты, расширения и т. Д., Которые вы можете использовать в своих собственных проектах или для собственного образования, не забудьте посмотреть, что у нас есть на рынке .

Не стесняйтесь оставлять свои запросы и предложения, используя канал ниже.