Opencart - Как Переписывать Пользовательские Ссылки

Тема в разделе "Общие вопросы", создана пользователем admin, 10 фев 2018.

  1. TopicStarter Overlay
    Offline

    admin Команда форума Администратор

    Сообщения:
    2.595
    Симпатии:
    111.138
    Репутация:
    175
    в этом курсе мы узнаем все о пользовательских SEO-friendly ссылках в OpenCart. Крайне важный аспект при разработке новых модулей, который также влияет на рейтинг в поисковой выдаче. Мы будем работать с последней версией OpenCart. Установите также последнюю версию, чтобы вы могли следовать по нашему коду.

    Коротко о нашей задаче
    Я составил список шагов, которые необходимо выполнить для создания пользовательских URL’ов в OpenCart:

    Сперва необходимо понять принцип работы ссылок в ядре.

    Потом мы разберем все нужные изменения в ядре.

    Поверхностно изучим SQL запросы для вставки пользовательских URL.

    А также узнаем, как работать со встроенной функцией перезаписи.

    Примерно этим вы сейчас и займемся. Перейдем к первой теме.

    Сопоставление URL в базе данных
    Первым делом необходимо понять, как SEO URL’ы работают в ядре OpenCart. В phpMyAdmin откройте MySQL таблицу url_alias, вы увидите что-то похожее.

    Код:
    product_id=48 ipod-classic
    category_id=20 desktops
    manufacturer_id=8 apple
    information_id=6 delivery
    Внимание нужно обратить на две колонки. Первая query, в ней хранится ссылка, и вторая колонка keyword, в которой хранятся SEO ключевые слова для ссылки.

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

    На стороне front-end’а, когда пользователь запрашивает определенный URL, OpenCart находит соответствующие ему «кирпичики» из таблицы url_alias. Таким образом составные части в целом представляют собой SEO дружелюбную ссылку. Откройте файл catalog/controller/common/seo_url.php, давайте разберем код метода index.

    Код:
    public function index() {
    // Добавляем слово rewrite к классу ссылки
    if ($this->config->get('config_seo_url')) {
    $this->url->addRewrite($this);
    }
    // Декодируем URL
    if (isset($this->request->get['_route_'])) {
    $parts = explode('/', $this->request->get['_route_']);
    // удаляем пустые массивы
    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'] .= '_' . $url[1];
    }
    }
    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’ов нам придется переписать код ядра. Об этом и будет наша следующая секция.

    Изменения в файлах ядра
    Откройте файл catalog/controller/common/seo_url.php и замените метод rewrite на код ниже.

    Код:
    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 .= '/' . $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` = '" . $data['route'] . "'");
    if ($query->num_rows && $query->row['keyword']) {
    $url .= '/' . $query->row['keyword'];
    } else {
    $url = '';
    break;
    }
    }
    // НАШ КОД
    }
    }
    if ($url) {
    unset($data['route']);
    $query = '';
    if ($data) {
    foreach ($data as $key => $value) {
    $query .= '&' . rawurlencode((string)$key) . '=' . rawurlencode((string)$value);
    }
    if ($query) {
    $query = '?' . str_replace('&', '&', trim($query, '&'));
    }
    }
    return $url_info['scheme'] . '://' . $url_info['host'] . (isset($url_info['port']) ? ':' . $url_info['port'] : '') . str_replace('/index.php', '', $url_info['path']) . $url . $query;
    } else {
    return $link;
    }
    }
    Метод rewrite используется для конвертации внутренних ссылок в SEO дружелюбные ссылки, но он работает только для внутренних ссылок. Поэтому для работы с пользовательскими модулями нам придется добавить свой код. В нашем методе rewrite в последнем условии мы добавили else, в котором прописан код для нашего кастомного модуля. Мы еще не добавили кастомные ссылки, этим и займемся в следующей части.

    Для простоты мы редактировали файл ядра напрямую. На самом деле необходимо работать через OCMOD, чтобы не затронуть код ядра.

    Добавляем ключевые слова MySQL
    В этой части мы добавим SEO дружелюбные ссылки в наш модуль. И опять для простоты мы пишем на чистом SQL – сделать то же самое можно с помощью скриптов установки модуля.

    Код:
    INSERT INTO `url_alias` (`query`, `keyword`) VALUES ('custom/custom', 'custom-rewrite');
    Запустите код выше в базе данных OpenCart. В последней секции мы посмотрим, как использовать хелпер функцию для создания SEO дружелюбных ссылок.

    Как это работает
    Создайте новый файл catalog/controller/custom/custom.php с кодом:

    Код:
    <?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>');
    }
    }
    На стороне front-end’а откройте ссылку сайт.ру/index.php?route=custom/custom.

    По ссылке вы увидите просто белый экран и ссылку. Посмотрите на эту ссылку, она теперь SEO дружелюбна! Если кликнуть на нее, загрузится та же самая страница, так как мы добавили ссылку на нее в таблицу url_alias. Это была простая демонстрация данной концепции. Ее можно расширить и создать модель для вставки SEO дружелюбных ссылок для своего модуля.

    Заключение
    Сегодня мы разобрали важную тему в OpenCart – пользовательские SEO дружелюбные ссылки. Для полной ясности мы разобрали самый простой способ. Надеюсь, он был вам полезен.
     
    gobsagi нравится это.