OpenCart — модуль пакетного создания ЧПУ

Добрый день, уважаемые читатели!

Сегодня мы поговорим о пакетном создании ЧПУ для вашего сайта.

Первым делом, чтобы заработало ЧПУ на движке OpenCart, нужно включить его в админ-панели.

Для этого проделываем простые манипуляции

1. Заходим в админ-панель

2. Система -> Настройки -> изменить -> вкладка «Сервер» -> «Включить ЧПУ» — да; «Тип ЧПУ» — по умолчанию

3. Редактируем файл .htaccess

3. Редактируем .htaccess

Файл .htaccess.txt должен быть переименован в .htaccess и содержать следующий код:

Options +FollowSymlinksRewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)?*$ index.php?_route_=$1 [L,QSA]
AllowOwerride All

Теперь приступим к написанию самого модуля (пока что как отдельный файл php, позже добавим эту функцию в админ-панель OpenCart).

Создаем новый файл и во избежание проблем с кодировкой первой строчкой отсылаем header:


header('Content-Type: text/html; charset=utf-8');

Далее нам потребуются две функции:

1. Функция транслитерации

2. Функция очистки строки от посторонних символов


// Функция транслита
function rus2translit($string) {

$converter = array(

'а' => 'a', 'б' => 'b', 'в' => 'v',

'г' => 'g', 'д' => 'd', 'е' => 'e',

'ё' => 'e', 'ж' => 'zh', 'з' => 'z',

'и' => 'i', 'й' => 'y', 'к' => 'k',

'л' => 'l', 'м' => 'm', 'н' => 'n',

'о' => 'o', 'п' => 'p', 'р' => 'r',

'с' => 's', 'т' => 't', 'у' => 'u',

'ф' => 'f', 'х' => 'h', 'ц' => 'c',

'ч' => 'ch', 'ш' => 'sh', 'щ' => 'sch',

'ь' => '', 'ы' => 'y', 'ъ' => '',

'э' => 'e', 'ю' => 'yu', 'я' => 'ya',

'А' => 'A', 'Б' => 'B', 'В' => 'V',

'Г' => 'G', 'Д' => 'D', 'Е' => 'E',

'Ё' => 'E', 'Ж' => 'Zh', 'З' => 'Z',

'И' => 'I', 'Й' => 'Y', 'К' => 'K',

'Л' => 'L', 'М' => 'M', 'Н' => 'N',

'О' => 'O', 'П' => 'P', 'Р' => 'R',

'С' => 'S', 'Т' => 'T', 'У' => 'U',

'Ф' => 'F', 'Х' => 'H', 'Ц' => 'C',

'Ч' => 'Ch', 'Ш' => 'Sh', 'Щ' => 'Sch',

'Ь' => '', 'Ы' => 'Y', 'Ъ' => '',

'Э' => 'E', 'Ю' => 'Yu', 'Я' => 'Ya',

);

return strtolower(strtr($string, $converter));

}

// Функция очищения строки от символов
function str2url($str) {

 $str = rus2translit(strtolower($str));

 $str = preg_replace('#[^-a-z0-9_]#u', '-', $str);

 $str = trim($str, '-');

 $str = preg_replace('#[-]{2,}#', '', $str);

 return $str;

}

С первой функцией все понятно — она просто заменяет русские буквы на английские в соответствии с ключом => значением массива.

Немного подробнее остановимся на второй функции: в качестве аргумента она получает строку, которую нужно переделать в ссылку. Далее она переводит русские символы в латиницу и очищает строку от лишних символов, меняя их на тире, оставляя только сам символ тире (-) и подчеркивания ( _ ), буквы (a-z) и цифры (0-9), независимо от регистра. Далее очищает строку от лишних тире (в начале и конце строки).

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

Давайте сразу договоримся, что ЧПУ URL будет иметь вид: [id товара]-[наименование товара]-[артикул(модель)].html

Подключаемся к БД и выводим форму запроса


$hostname = 'localhost';
 $database = 'test';
 $username = 'root';
 $password = '';

$mysql_connect = @mysql_connect($hostname, $username, $password);

echo '<h1 style="font-size:18px;font-weight:bold;">Соединение с БД</h1>';

if(!$mysql_connect) {

 echo 'Подключение к серверу ..... <p style="color: red;"><strong>[FAILED]</strong></p>';
 echo '<br />';
 exit();

} else {

 echo 'Подключение к серверу ..... <p style="color: #008000;"><strong>[OK]</strong></p>';
 echo '<br />';

}

if(!mysql_select_db($database)) {

 echo 'Подключение к БД ..... <p style="color: red;"><strong>[FAILED]</strong></p>';
 echo '<br />';
 exit();

} else {

 echo "Подключение к БД ..... <p style=\"color: #008000;\"><strong>[OK]</strong></p>\r\n";
 echo '<br />';

 // UTF-8
 @mysql_query("SET NAMES 'utf8'", $mysql_connect);
 @mysql_query("SET CHARACTER SET utf8", $mysql_connect);
 @mysql_query("SET CHARACTER_SET_CONNECTION=utf8", $mysql_connect);

}

echo '<br />';
echo '<br />';
echo '<hr />';</pre>
?>
<form name="queries" action="" method="POST">
 <table border="0">
 <tr>
 <td><input id="category" name="query" type="radio" value="category"><label for="category">Вывести запросы по категориям</label></td>
 <td><input id="product" name="query" type="radio" value="product" checked="checked"><label for="product">Вывести запросы по товарам</label></td>
 </tr>
 </table>
 <input type="submit" name="submit" value="Вывести запросы" />
</form>

<?php

И далее пишется сам обработчик

if((isset($_POST['submit']) AND $_POST['submit'] == 'Вывести запросы') AND isset($_POST['query'])) {

 switch ($_POST['query']) {

 case "category":

 $category_query = mysql_query("SELECT * FROM `category_description`");

 $category_result = mysql_fetch_array($category_query);

$i = 0;

do {

$category_keyword = str2url($category_result['name']);

// UPDATE
 // echo "UPDATE `url_alias` SET `url_alias_id`='" . NULL . "', `query`='product_id=" . $product_result['product_id'] . "', `keyword`='" . $product_keyword . "'<br />";

// INSERT
 //echo "INSERT INTO `url_alias` SET `url_alias_id`='" . NULL . "', `query`='category_id=" . $category_result['category_id'] . "', `keyword`='" . $category_keyword . "'<br />";
 if(mysql_num_rows(mysql_query("SELECT * FROM `url_alias` WHERE `query`='category_id=" . $category_result['category_id'] . "'")) == 0) {
 $post = TRUE;
 } else {
 $post = FALSE;
 }

if($post) {

if(mysql_query("INSERT INTO `url_alias` SET `url_alias_id`='" . NULL . "', `query`='category_id=" . $category_result['category_id'] . "', `keyword`='" . $category_keyword . "'")){

$i++;

$datetime = date("Y-m-d H:i");

echo '['.$datetime.'] - ' . $category_result['category_id'] . ' now is ' . $category_keyword . '<br />';

}
 }

} while ($category_result = mysql_fetch_array($category_query));
 echo '<font color="red"><strong>Выполнено: ' . $i . ' запросов</strong></font>';

 break;

 case "product":
 $product_query = mysql_query("SELECT * FROM `product_description`");

 $product_result = mysql_fetch_array($product_query);

 $i = 0;

do {

$product_keyword = str2url($product_result['product_id'] . "-" . $product_result['name']) . ".html";

 // UPDATE
 // echo "UPDATE `url_alias` SET `url_alias_id`='" . NULL . "', `query`='product_id=" . $product_result['product_id'] . "', `keyword`='" . $product_keyword . "'<br />";

 // INSERT
 //echo "INSERT INTO `url_alias` SET `url_alias_id`='" . NULL . "', `query`='product_id=" . $product_result['product_id'] . "', `keyword`='" . $product_keyword . "'<br />";

if(mysql_num_rows(mysql_query("SELECT * FROM `url_alias` WHERE `query`='product_id=" . $product_result['product_id'] . "'")) == 0) {
 $post = TRUE;
 } else {
 $post = FALSE;
 }

if($post) {

if(mysql_query("INSERT INTO `url_alias` SET `url_alias_id`='" . NULL . "', `query`='product_id=" . $product_result['product_id'] . "', `keyword`='" . $product_keyword . "'")){

$i++;

$datetime = date("Y-m-d H:i");

echo '['.$datetime.'] - ' . $product_result['product_id'] . '-' . $product_result['product_name'] . ' now is ' . $product_keyword . '<br />';

}
 }

 } while ($product_result = mysql_fetch_array($product_query));
 echo '<font color="red"><strong>Выполнено: ' . $i . ' запросов</strong></font>';

 break;
 }

}

Скрипт проверяет есть ли такая ссылка в базе и если нет — записывает. Единственное — скрипт не умеет редактировать существующие ссылки, но это вполне можно сделать через админку OpenCart

Теперь закачиваем файл на сервер и запускаем. Выбираем какие запросы вы хотите выполнить и скрипт покажет сколько запросов было выполнено

3 комментария

  1. Это решение актуально для OCStore 1,5,5,1 ?

    Созданный файлик куда пихать, что бы заработало?

    При создании файлика нужно ли воспользоваться этим
    https://opencartforum.com/files/file/1511-%D0%B7%D0%B0%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%BA%D0%B0-%D0%B4%D0%BB%D1%8F-%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F-%D0%BD%D0%BE%D0%B2%D1%8B%D1%85-%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B5%D0%B9/
    ?
    Просто в OCStore есть любые URL и ru и en. Не вполне понятно зачем это и чего оно так улучшит.

    1. это актуально для всех версий OpenCart, где есть поддержка ЧПУ (стандартного).
      Нужно, например, при синхронизации с 1С или другим каталогом товаров, чтобы в момент выгрузки создавались человекочитаемые URL для новых товаров.

Leave a Reply