Як переписувати користувальницькі посилання в OpenCart

333

Від автора: у цьому курсі ми дізнаємося все про користувача SEO friendly посиланнях в OpenCart. Вкрай важливий аспект при розробці нових модулів, який також впливає на рейтинг в пошуковій видачі. Ми будемо працювати з останньою версією OpenCart. Встановіть також останню версію, щоб ви могли слідувати за нашу коду.

Коротко про нашу задачі

Я склав список кроків, які необхідно виконати для створення користувацьких url’ов в OpenCart:

Спершу необхідно зрозуміти принцип роботи посилань в ядрі.

Потім ми розберемо всі потрібні зміни в ядрі.

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

Як переписувати користувальницькі посилання в OpenCart

Інтернет-магазин на OpenCart!

Створити інтернет-магазин на самій популярної CMS OpenCart з нуля!

Приступити до створення

А також дізнаємося, як працювати з вбудованою функцією перезапису.

Приблизно цим ви зараз і займемося. Перейдемо до першої теми.

Зіставлення URL-адреси в базі даних

Насамперед необхідно зрозуміти, як SEO ДО и працюють в ядрі 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. Після цього парс параметр запиту, і повертається внутрішня посилання.

Як переписувати користувальницькі посилання в OpenCart

Інтернет-магазин на OpenCart!

Створити інтернет-магазин на самій популярної CMS OpenCart з нуля!

Приступити до створення

Це і є базовий принцип роботи. На жаль, це працює тільки для звичайних посилань – для користувацьких 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 код:

url->link(‘custom/custom’);
$this->response->setOutput(‘Custom URL Rewrite Link’);
}
}

На стороні front-end’а відкрийте посилання http://www.yourstore.com/index.php?route=custom/custom.

За посиланням ви побачите просто білий екран і посилання. Подивіться на цю посилання, вона тепер SEO дружелюбна! Якщо клікнути на неї, завантажиться та ж сама сторінка, так як ми додали посилання на неї в таблицю url_alias. Це була проста демонстрація даної концепції. Її можна розширити і створити модель для вставки SEO дружніх посилань для свого модуля.

Висновок

Сьогодні ми розібрали важливу тему в OpenCart – користувальницькі SEO доброзичливі посилання. Для повної ясності ми розібрали найпростіший спосіб. Сподіваюся, він був вам корисний.

Як переписувати користувальницькі посилання в OpenCart

Інтернет-магазин на OpenCart!

Створити інтернет-магазин на самій популярної CMS OpenCart з нуля!

Приступити до створення