
Накратко за проекта
В онлайн магазин на OpenCart 2.3.0.2, който продава хранителни добавки, клиентът се сблъска със странен бъг: всеки път когато в SEO URL се използваше буквата „л“, линкът се чупеше. Например /масло
се записваше като /мас?о
и водеше до 404 грешка.
Това е все едно на табелата пред магазина да пише „МАС?О“ вместо „МАСЛО“ – никой клиент не е сигурен дали е на правилното място. За SEO това е катастрофа, защото търсачките виждат счупени адреси, а за потребителите – лошо изживяване.
Ключови подобрения
- Поправяне на кода на OpenCart, така че нови URL-и с „л“ да се записват правилно и да не се чупят.
- SQL автоматизация за поправяне на вече счупените SEO ключове в базата данни.
- Подобряване на UX и SEO, като се премахват грешните 404 и URL-ите стават разбираеми и работещи.
Използвани технологии
- OpenCart 2.3.0.2 – платформата, в която се появи проблемът.
- OCMOD – за корекция на библиотеката
utf8.php
, без да се пипа ядрото на OpenCart. - MySQL – за директна подмяна на грешно записаните символи в таблицата
oc_url_alias
.
Предизвикателства
Проблемът се криеше в това, че OpenCart използваше strtolower()
вместо mb_strtolower()
за работа с UTF-8 символи. Буквата „л“ не се разпознаваше и се записваше като „?“. В резултат новите продукти и категории със „л“ в SEO keyword автоматично ставаха недостъпни.
Това е все едно да напишеш адрес на кирилица и пощальонът да не разпознава буквата „л“ – писмото никога няма да стигне до получателя.
Решение с OCMOD
Създадох OCMOD файл, който замества дефиницията на utf8_strtolower
в system/library/utf8.php
, така че винаги да използва mb_strtolower
при работа с кирилица:
<?xml version="1.0" encoding="utf-8"?>
<modification>
<name>Fix UTF-8 strtolower for Cyrillic</name>
<code>fix_utf8_strtolower</code>
<version>1.0</version>
<author>Станчев</author>
<link>http://your-site.com</link>
<file path="system/library/utf8.php">
<operation>
<search><![CDATA[function utf8_strtolower($str) {]]></search>
<add position="replace"><![CDATA[
function utf8_strtolower($str) {
if (function_exists('mb_strtolower')) {
return mb_strtolower($str, 'UTF-8');
}
return strtolower($str);
}]]></add>
</operation>
</file>
</modification>
След качване през админ панела (Extensions → Modifications → Upload) и натискане на Refresh, всички нови SEO URL-и с „л“ започнаха да се записват правилно.
SQL заявка за поправяне на старите
Старите записи обаче вече бяха счупени (мас?о
вместо масло
). За да ги поправя наведнъж, използвах SQL заявка:
UPDATE oc_url_alias
SET keyword = REPLACE(keyword, '?', 'л')
WHERE keyword LIKE '%?%';
С тази заявка всички „?“ бяха заменени с правилната буква „л“. Това е бързо решение, което пести часове ръчна работа.
Стъпки за репродуциране
- Създайте OCMOD файл с горния код и го качете през админ панела.
- Рефрешнете модификациите и изчистете кеша.
- Стартирайте SQL заявката в phpMyAdmin, за да оправите вече счупените записи.
- Тествайте с нов продукт с име „масло“ – URL-ът вече ще е
/масло
, без да се чупи.
Резултат
След промяната сайтът вече не генерираше счупени линкове. SEO URL-ите на кирилица, включително тези с „л“, се показваха правилно. Потребителите виждаха чисти и работещи адреси, а Google започна да индексира съдържанието без 404 грешки.
Извод
Понякога дори една буква може да счупи цял сайт. В OpenCart 2.3.0.2 липсата на правилна обработка на UTF-8 доведе до масови 404 грешки. Решението беше комбинация от OCMOD за новите URL-и и SQL заявка за старите. Резултатът: стабилен магазин, доволни клиенти и SEO без загуби.