Проекти

Case Study: Fix на счупени SEO URL-и с „л“ в OpenCart 2.3.0.2

26 август 2025 г.

Накратко за проекта

В онлайн магазин на 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
<?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 заявка:

Sql
UPDATE oc_url_alias
SET keyword = REPLACE(keyword, '?', 'л')
WHERE keyword LIKE '%?%';

С тази заявка всички „?“ бяха заменени с правилната буква „л“. Това е бързо решение, което пести часове ръчна работа.

Стъпки за репродуциране

  1. Създайте OCMOD файл с горния код и го качете през админ панела.
  2. Рефрешнете модификациите и изчистете кеша.
  3. Стартирайте SQL заявката в phpMyAdmin, за да оправите вече счупените записи.
  4. Тествайте с нов продукт с име „масло“ – URL-ът вече ще е /масло, без да се чупи.

Резултат

След промяната сайтът вече не генерираше счупени линкове. SEO URL-ите на кирилица, включително тези с „л“, се показваха правилно. Потребителите виждаха чисти и работещи адреси, а Google започна да индексира съдържанието без 404 грешки.

Извод

Понякога дори една буква може да счупи цял сайт. В OpenCart 2.3.0.2 липсата на правилна обработка на UTF-8 доведе до масови 404 грешки. Решението беше комбинация от OCMOD за новите URL-и и SQL заявка за старите. Резултатът: стабилен магазин, доволни клиенти и SEO без загуби.