ГлавнаяБлог
SEO на OpenCart: полная оптимизация магазина

SEO на OpenCart: полная оптимизация магазина

SEO на OpenCart: полная оптимизация магазина — иллюстрация к статье блога SEO Мастера
Автор: SEO Мастера · агентство продвижения с 2005 года Дата: 14 июля 2026 Время чтения: 16 мин

OpenCart — движок, который любят за бесплатность, лёгкость и простую админку, и ненавидят за то, что «из коробки» он генерирует дубли пачками, отдаёт кривые адреса, теряет карточки в индексе и тормозит на каталоге в двадцать тысяч товаров. Всё это лечится, но не кнопкой «включить SEO URL» в настройках — а последовательной работой с ядром, шаблоном и модулями. В этой статье разбираем движок по слоям: как реально устроен механизм seo_url, откуда берутся дубли route и path, что делать с фильтрами и пагинацией, как выжать скорость из тяжёлого каталога и какие модули имеет смысл ставить, а какие только вредят. Материал написан по опыту SEO-продвижения магазинов на OpenCart и его форках — ocStore, Opencart 3.x и 4.x.

Коротко

  • Галочка «Использовать ЧПУ» в настройках OpenCart не включает ЧПУ — она включает механизм подстановки, которому нужны заполненные seo_url для каждой сущности, иначе адрес останется техническим.
  • Главный источник дублей — параллельное существование index.php?route=… и человекопонятного адреса, плюс &path=, &limit=, &sort=, &tracking= и хвосты фильтров.
  • Фасетные фильтры без белого списка комбинаций генерируют десятки тысяч мусорных URL и съедают краулинговый бюджет за неделю.
  • Карточка товара в OpenCart по умолчанию доступна минимум по двум адресам — с path и без него; canonical в шаблоне решает это, но только если он проставлен корректно.
  • Скорость упирается не в хостинг, а в count(*) по oc_product в фильтрах, отсутствие кэша и мусорные модификаторы OCMOD.
  • Модули SEO нужны, но два SEO-модуля одновременно — это гарантированный конфликт canonical и метатегов.

Чем OpenCart принципиально отличается от других CMS с точки зрения SEO

OpenCart построен на классической схеме MVC с фронт-контроллером. Любой запрос по умолчанию приходит на index.php и разбирается по параметру route: index.php?route=product/product&product_id=42, index.php?route=product/category&path=20_27. Всё, что вы видите в адресной строке в виде красивого адреса, — это результат работы отдельного слоя, который на входе преобразует ЧПУ обратно в route, а на выходе подменяет route на ЧПУ при генерации ссылок.

Понимать это критично, потому что отсюда растёт большинство проблем. В OpenCart ЧПУ не является нативным адресом страницы — это псевдоним, лежащий в таблице oc_seo_url (в ветке 2.x она называлась oc_url_alias). Технический адрес никуда не исчезает: он продолжает работать, отдавать код 200 и тот же самый контент. Движок не ставит редирект с route-адреса на ЧПУ по умолчанию. Это означает, что каждая страница магазина физически доступна как минимум по двум разным URL, и оба они индексируемы.

Второе отличие — иерархия категорий зашита в параметр path. Товар в OpenCart не привязан жёстко к одной категории: он может принадлежать пяти категориям сразу, и в каждой из них его карточка будет открываться со своим path в адресе. Одна карточка — пять адресов. Для магазина на десять тысяч товаров это десятки тысяч дублей уже на старте, без единого фильтра.

Третье — экосистема модификаторов. OpenCart расширяется через OCMOD/VQMOD: XML-файлы, которые на лету патчат исходники. Это удобно, но приводит к тому, что два модуля начинают править один и тот же кусок кода в шаблоне, и на выходе вы получаете две разные canonical на странице или два тега title. Такие вещи в интерфейсе не видны — их находят только чтением исходного HTML.

ГЛАВНАЯ МЫСЛЬ ПРО OPENCART

OpenCart не «плохой для SEO» — он просто ничего не запрещает. Битрикс навязывает структуру, WordPress навязывает плагин, OpenCart оставляет вас один на один с фронт-контроллером. Все дубли, которые вы найдёте на магазине, движок сгенерировал не по злому умыслу, а потому что ему никто не сказал, какой адрес считать единственно верным.

ЧПУ в OpenCart: как это работает на самом деле

В настройках магазина (Система → Настройки → Сервер) есть чекбокс «Использовать SEO URL». Массовое заблуждение: его включение якобы делает адреса человекопонятными. На деле он лишь активирует слой преобразования. Если для категории или товара не заполнено поле SEO keyword, ссылка на неё останется технической — index.php?route=product/product&product_id=118. То есть после включения чекбокса на непроработанном магазине вы получаете гибрид: часть ссылок красивые, часть — с route.

Чекбокс работает только вместе с правилами перезаписи на веб-сервере. Для Apache в комплекте идёт .htaccess.txt, который нужно переименовать в .htaccess — до этого момента ЧПУ будут отдавать 404. Для nginx правило перезаписи пишется руками в конфиге виртуального хоста: все несуществующие файлы направляются на index.php с сохранением query string. Это частая точка отказа при переезде на новый хостинг: сайт формирует красивые адреса, а сервер их не понимает.

Структура таблицы seo_url и что в ней ломается

В oc_seo_url хранятся связки: ключ (product_id, category_id, information_id), значение и сам keyword. В OpenCart 3.x keyword должен быть уникальным глобально — то есть категория «Аксессуары» и товар «Аксессуары» не могут иметь одинаковый keyword, движок просто не сохранит второй. В 4.x схема изменилась: keyword стал многосегментным и хранит полный путь. Из-за этого при миграции с 3.x на 4.x адреса ломаются массово, и без карты 301 редиректов магазин теряет весь накопленный вес.

Типовые болячки, которые находятся выгрузкой этой таблицы в CSV:

  • Пустые keyword у части товаров — карточки живут на route-адресах и в выдаче выглядят технически.
  • Транслит от плохого модуля: «Смартфоны Xiaomi» превращается в smartfonyi-xiaomi вместо smartfony-xiaomi — движковый транслит ГОСТ даёт «yi» на конце. Мелочь, но повторённая на десяти тысячах адресов.
  • Дубли keyword с числовым суффиксом: chehol-2, chehol-3 — модуль автогенерации, наткнувшись на занятый keyword, дописывает счётчик, и адрес перестаёт нести смысл.
  • Кириллица в keyword — работает, но при передаче ссылок превращается в процентную кодировку и портит анкоры.

Правило простое: keyword задаётся руками для всех категорий и для товаров-локомотивов, автогенерация допустима только для длинного хвоста каталога. Общие принципы формирования адресов подробно разобраны в материале про человекопонятные URL — там же логика вложенности и длины.

Плоские или вложенные адреса категорий

OpenCart умеет обе схемы. По умолчанию в 3.x адрес категории плоский: /smartfony/, даже если она лежит третьим уровнем. Модули SEO обычно добавляют вложенность: /elektronika/telefony/smartfony/. Обе схемы рабочие, но выбрать нужно одну и навсегда: смена схемы на живом магазине — это переезд всех адресов каталога. Вложенная схема лучше передаёт структуру сайта и понятнее пользователю в хлебных крошках; плоская — короче и устойчивее к переносу категории между разделами. Для магазинов с частой перетасовкой каталога плоская схема безопаснее.

Дубли в OpenCart: полная карта проблемы

Это самый большой блок работ на любом магазине под OpenCart. Ниже — все типовые источники дублей и способ закрытия каждого.

Источник дубляПример URLЧто делать
route-адрес рядом с ЧПУ index.php?route=product/product&product_id=42 301 редирект на ЧПУ на уровне контроллера или правил сервера
Товар в разных категориях /telefony/iphone-15/ и /novinki/iphone-15/ canonical на короткий адрес карточки без path
Сортировка и лимит ?sort=p.price&order=ASC&limit=100 canonical на чистую категорию, Clean-param в robots.txt
Пагинация ?page=2, ?page=3 Самореферентный canonical + уникальный title, открыта к индексации
Хвосты фильтров ?filter=12_45_67 noindex по умолчанию, белый список — в индекс как посадочные
UTM и tracking ?tracking=partner&utm_source=… Clean-param, canonical, отсутствие ссылок изнутри сайта
Слеш и его отсутствие /smartfony и /smartfony/ Одно правило на сервере + 301 на выбранный вариант
Главная в двух видах / и /index.php?route=common/home 301 на корень
Служебные разделы /index.php?route=account/login, wishlist, compare Закрыть в robots.txt и снять внутренние ссылки на индексацию

Дубль route ↔ ЧПУ: почему это опаснее, чем кажется

Когда одна и та же страница отдаёт 200 по двум адресам, поисковик обязан выбрать основную сам. Он выберет — но не факт, что тот адрес, который вы продвигаете. На практике встречается ситуация, когда в выдаче Яндекса по коммерческому запросу стоит index.php?route=product/category&path=33, а красивый адрес помечен как дубль. Внешние ссылки, накопленный вес и вся работа над метатегами при этом размазываются между двумя URL.

Лечится это редиректом: любой входящий запрос, содержащий route= и имеющий заполненный seo_url, должен отдавать 301 на человекопонятный адрес. Реализуется либо модулем, либо правкой в catalog/controller/startup/seo_url.php. Важная деталь: исключить из редиректа служебные маршруты — оформление заказа, корзину, ajax-обработчики, api. Если завернуть их редиректом, оформление заказа сломается, и вы узнаете об этом от клиента, а не от аналитики.

Товар в нескольких категориях

Схема с path в адресе карточки выглядит логично («хлебные крошки в URL»), но плодит дубли в геометрической прогрессии. Единственно верное решение: карточка живёт по одному короткому адресу /iphone-15/ или /product/iphone-15/, все варианты с path отдают либо 301, либо содержат canonical на короткий вариант. В OpenCart 3.x canonical выводится в catalog/controller/product/product.php — проверьте, что он там вообще есть: в некоторых сборках и в большинстве кастомных шаблонов его вырезали. Механика canonical и способы диагностики склеек подробно разобраны в статье про canonical и дубли страниц.

Фильтры и фасетная навигация: где магазин теряет краулинговый бюджет

Штатный фильтр OpenCart формирует адрес вида ?filter=12_45_67 — набор идентификаторов через подчёркивание. Такой URL нечитаем, не масштабируется и не годится под посадочную страницу. Популярные модули фильтров переписывают адреса в человекопонятный вид: /smartfony/filter/xiaomi/pamyat-256gb/. Это правильное направление, но оно же создаёт главную угрозу.

Посчитайте комбинаторику: категория с 6 фильтрами по 8 значений каждый даёт теоретически более 16 миллионов сочетаний. Робот, дойдя до такой категории, начинает обходить их одно за другим. Реальный каталог из трёх тысяч товаров при этом остаётся необойдённым — весь краулинговый бюджет уходит на страницы вида «Xiaomi + красный + 256 ГБ + рассрочка + в наличии», где ноль товаров и ноль спроса.

Правило 1

Белый список, а не чёрный

По умолчанию все фильтрационные URL закрыты от индексации. Открывается вручную только то, что подтверждено спросом в Вордстате. Обратная логика — закрывать мусор по мере обнаружения — на фасете не работает: мусор растёт быстрее, чем вы его закрываете.

Правило 2

Одно значение, максимум два

В индекс идут связки «категория + бренд», «категория + ключевой параметр», изредка тройки. Комбинации из трёх и более фильтров почти никогда не имеют частотности и не окупают обхода.

Правило 3

Порог по количеству товаров

Страница фильтра с 1–2 товарами — плохая посадочная. Разумный порог — от 5–8 позиций. Меньше — отдаём noindex или 404, чтобы не плодить тонкие страницы.

Правило 4

Свои метатеги и текст

Открытая в индекс страница фильтра обязана иметь уникальные H1, title, description по шаблону и желательно короткое описание. Иначе это дубль категории с другим набором карточек.

Отдельно про rel="nofollow" на ссылках фильтра: это не запрет индексации, а лишь сигнал не передавать вес. Робот всё равно может дойти до адреса из sitemap или внешней ссылки. Надёжнее связка: метатег robots noindex в шаблоне для «серых» комбинаций + правило в robots.txt для параметров + отсутствие таких адресов в карте сайта. Общая методика проектирования фасета, включая работу с директивой Clean-param, разобрана в материале про фасетную навигацию и SEO-фильтры.

Sort, order, limit — тихие пожиратели бюджета

Эти три параметра есть в каждой категории OpenCart и генерируют комбинации автоматически: 6 вариантов сортировки × 2 направления × 4 значения лимита = 48 адресов на каждую категорию, плюс умножение на пагинацию. Для магазина с 400 категориями это почти 20 тысяч дублей, каждый из которых содержит те же товары в другом порядке. Решение: canonical с чистой категории на всех вариантах и Clean-param в robots.txt для Яндекса — эта директива не просто закрывает адрес, а склеивает его показатели с основным, в отличие от Disallow.

Пагинация в OpenCart

Штатная пагинация формирует ?page=2 и добавляет к title суффикс вида «(страница 2)» — в зависимости от шаблона. Что здесь ломается чаще всего:

  • Canonical со всех страниц на первую. Классическая ошибка, унаследованная от старых рекомендаций. Итог: товары со страниц 2–10 выпадают из индекса, потому что робот считает эти страницы дублями первой и перестаёт с них ходить по ссылкам на карточки. На магазине с 40 товарами на странице и глубоким каталогом так теряется 70–80 % ассортимента.
  • Первая страница доступна как /category/ и /category/?page=1 — прямой дубль, лечится 301 на адрес без параметра.
  • Одинаковые title и H1 на всех страницах пагинации.
  • Кнопка «Показать ещё» на AJAX без ссылок с href — робот не видит вторую страницу вовсе.

Рабочая схема: страницы пагинации открыты к индексации, canonical самореферентный (страница 2 канонична сама себе), title и description с номером страницы, текст-описание категории — только на первой странице, чтобы не дублировать его в десять раз. Ссылки на страницы — честные <a href>, а не JS-обработчики. Детали и споры вокруг rel=prev/next разобраны в статье про пагинацию и SEO.

Карточка товара: что править в шаблоне

Дефолтный шаблон OpenCart (Journal, Default, любой форк) выводит карточку функционально, но с точки зрения SEO в ней не хватает половины. Разберём по элементам.

Title и H1. В OpenCart H1 карточки — это название товара из поля Name, и оно же по умолчанию подставляется в title, если поле «Meta Tag Title» пустое. На большом каталоге поля метатегов пустые почти всегда. Решение — шаблонизация через модуль: Купить {name} в {city} — цена {price} ₽ | {store} для title, и отдельный шаблон для description с указанием на наличие, доставку и гарантию. Ручная простановка имеет смысл только для верхних 100–300 товаров.

Описание. Стандартная беда магазинов на OpenCart — описания, выгруженные из прайса поставщика в поле Description один в один. Такое описание есть у пятидесяти конкурентов, и карточка получает статус малополезной. Не нужно переписывать все десять тысяч карточек: начните с товаров, которые дают 80 % спроса, и дописывайте по 400–800 знаков собственного текста — условия применения, отличия от соседней модели, комплектность.

Характеристики (Attributes). В OpenCart это отдельная вкладка, и в дефолтном шаблоне она грузится сразу в DOM — это хорошо. Но если шаблон подгружает вкладку по AJAX (частая кастомизация ради скорости), характеристики выпадают из индекса. Проверяется по Ctrl+U: если таблицы характеристик нет в исходном HTML — контент невидим.

Наличие и цена. Оба параметра обязаны попадать в микроразметку. Отсутствие цены в Schema.org лишает карточку расширенного сниппета, а «Нет в наличии», отданное как InStock, приводит к отклонению товарного фида.

ПРО ОТСУТСТВУЮЩИЕ ТОВАРЫ

Не удаляйте карточки закончившихся товаров. Удаление даёт 404, потерю накопленного веса и обрыв внешних ссылок. Правильно: оставить карточку доступной, поменять статус на «Нет в наличии», показать срок поступления и блок с 4–6 аналогами. Если товар снят с производства навсегда — 301 на ближайший аналог или на категорию, но не на главную: массовый редирект на главную поисковик трактует как soft 404.

Скорость OpenCart: где реально теряются секунды

Магазин на OpenCart с каталогом до 500 товаров летает почти на любом хостинге. С 20 тысячами товаров и включённым фильтром он начинает отдавать первый байт за 2–4 секунды. Причина почти никогда не в «слабом сервере» — она в архитектуре запросов.

Проблема №1 — подсчёт товаров. Модель категории вызывает getTotalProducts(), который делает COUNT по объединению oc_product, oc_product_to_category, oc_product_to_store и oc_product_description. На фильтре к этому добавляется джойн с oc_product_filter. Запрос выполняется на каждой странице, включая пагинацию, и на большом каталоге занимает сотни миллисекунд. Лечится кэшированием счётчиков и денормализацией.

Проблема №2 — отсутствующий кэш. Штатный файловый кэш OpenCart слабый. На боевом магазине нужен Redis или Memcached для объектного кэша плюс полностраничное кэширование категорий и карточек для гостей. Разница на первом байте — обычно в разы.

Проблема №3 — OCMOD-накопление. Каждый модификатор при генерации кэша модификаций перезаписывает исходники. Двадцать установленных за годы модулей, половина из которых давно не используется, превращают загрузку любого контроллера в разбор гигантского склеенного файла. Правило гигиены: удалять неиспользуемые модификаторы, а не просто выключать.

Проблема №4 — изображения. OpenCart генерирует превью через GD и складывает в image/cache. Если товар загружен исходником на 4000 пикселей и 3 МБ, движок будет отдавать ресайз, но исходник всё равно останется на диске, а качество ресайза по умолчанию посредственное. Плюс — никакого WebP из коробки. Подключение WebP/AVIF, корректных width/height и loading="lazy" ниже первого экрана даёт заметный выигрыш по LCP; механика — в материале про оптимизацию изображений.

После этих четырёх пунктов имеет смысл заниматься фронтендом: минификацией, отложенной загрузкой скриптов, шрифтами. Целевые ориентиры по Core Web Vitals для e-commerce — LCP до 2,5 с, INP до 200 мс, CLS до 0,1; общая методика ускорения разобрана в статье про скорость загрузки сайта.

Микроразметка и товарные данные

OpenCart из коробки не выводит Schema.org — ни в карточке, ни в категории, ни в хлебных крошках. Это нужно добавлять. Минимальный обязательный набор для магазина:

  • Product с вложенным Offer: name, image, description, sku, brand, price, priceCurrency, availability, url. Без цены и наличия разметка бесполезна.
  • AggregateRating и Review — только если отзывы реальные и есть на странице. Разметка отзывов, которых нет в видимом контенте, трактуется как обман разметки и приводит к её игнорированию.
  • BreadcrumbList — хлебные крошки в OpenCart есть визуально, но без разметки. Даёт путь навигации в сниппете.
  • Organization с контактами, ИНН, адресом — работает на коммерческие факторы.

Формат — JSON-LD в шаблоне, а не микроданные в атрибутах: его проще поддерживать и он не ломается при смене вёрстки. Подробный разбор синтаксиса и типовых ошибок — в статье про микроразметку Schema.org. Отдельно стоит выгружать YML-фид для товарных площадок: OpenCart умеет это только модулями, и корректный фид открывает и товарную выдачу, и контекстную рекламу с динамическими объявлениями.

Модули SEO для OpenCart: что ставить и чего избегать

Экосистема модулей — сильная сторона движка и его же слабость. Осмысленный набор для магазина выглядит так: один комплексный SEO-модуль (ЧПУ + шаблоны метатегов + canonical + управление фильтрами), модуль карты сайта, модуль кэширования, модуль товарного фида. Всё.

Чего делать нельзя. Ставить два SEO-модуля одновременно — самая частая причина «необъяснимых» проблем: оба выводят canonical, оба правят title, робот получает противоречивые сигналы. Перед установкой второго модуля первый удаляется полностью, вместе с модификатором и его следами в базе.

Обязательная проверка после установки любого модуля: открыть исходный код категории, карточки и главной, найти количество тегов canonical, title, meta description, h1. Каждого должно быть ровно по одному. Это пятиминутная проверка, которая экономит месяцы.

ЗадачаРешается модулемРешается правкой шаблона / сервера
ЧПУ с вложенностью Да, комплексный SEO-модуль Возможно, но трудоёмко
Шаблоны метатегов на каталог Да Нет смысла
Canonical на карточке Да Да, 3 строки в контроллере
301 с route на ЧПУ Иногда Да, надёжнее
Слеш в конце адреса Нет Да, правило nginx/Apache
Микроразметка JSON-LD Да Да, предпочтительнее
Кэширование Redis Да Требует настройки сервера
Управление индексацией фильтров Да, в модуле фильтров Частично, robots.txt

Пошаговый план оптимизации магазина на OpenCart

Последовательность важна: если начать с текстов, а потом чинить дубли, тексты придётся переписывать под новые адреса. Порядок такой.

1

Инвентаризация адресов

Полный обход магазина краулером с включённым обходом параметров. Выгрузка oc_seo_url в CSV. Цель — увидеть реальное число URL и сравнить его с числом товаров и категорий. Разница в 5–20 раз — норма для непочиненного OpenCart.

2

Фиксация схемы адресов

Решаем раз и навсегда: со слешем или без, вложенные категории или плоские, карточка с path или короткая. Дальше это не меняется. Все прочие варианты — 301 на выбранный.

3

Закрытие route-дублей

301 с index.php?route=… на ЧПУ с исключением служебных маршрутов. Проверка оформления заказа и корзины сразу после внедрения — обязательно вручную, полным сценарием покупки.

4

Canonical и параметры

Самореферентный canonical на категориях и пагинации, canonical на короткий адрес карточки, Clean-param для sort, order, limit, tracking, utm. Проверка: ровно один тег canonical на страницу.

5

Разбор фильтров

Собираем спрос по связкам «категория + фильтр», открываем в индекс только частотные комбинации с достаточным числом товаров, остальное — noindex. Открытые страницы получают шаблон метатегов и H1.

6

Метатеги и структура каталога

Шаблоны title/description на все типы страниц, уникальные H1, вычистка H1 из логотипа и баннеров шаблона — в OpenCart-темах это встречается регулярно. Категории приводятся в соответствие с кластерами семантики.

7

Скорость и кэш

Redis, полностраничный кэш для гостей, чистка OCMOD, WebP, ленивая загрузка ниже первого экрана. Замер до и после, ориентир — TTFB до 500 мс.

8

Разметка, фиды и контент

JSON-LD на карточку и крошки, YML-фид, уникализация описаний топовых товаров, тексты категорий, отзывы. Затем — контроль индексации в Вебмастере и постепенное расширение.

На всех этапах, где меняются адреса, нужна карта соответствия старых и новых URL и контроль отчёта об индексации. Если магазин параллельно переезжает на новую версию движка или домен, порядок действий и страховки описаны в материале про миграцию сайта без потери трафика. Общая логика продвижения e-commerce, включая работу с ассортиментом и коммерческими факторами, — в гиде по SEO для интернет-магазина.

Типичные ошибки, которые мы находим на аудитах OpenCart

  • Включён режим отладки или Maintenance mode на боевом сайте — весь магазин отдаёт заглушку, робот выкидывает страницы из индекса за неделю.
  • robots.txt из демо-сборки с закрытым /image/ и /catalog/view/ — робот не может отрендерить страницу и загрузить товарные изображения.
  • Sitemap штатного модуля, который отдаёт route-адреса вместо ЧПУ и включает служебные страницы.
  • Дубль главной по адресу /index.php — живёт годами и часто становится основной версией в индексе.
  • Два H1 в шаблоне: один в логотипе, второй в контенте. Проверяется по структуре заголовков за одну минуту.
  • Страницы «Сравнение» и «Закладки» в индексе — генерируются по пользовательским действиям, содержимое случайное.
  • Открытая тестовая копия магазина на поддомене dev или new — полный дубль всего каталога.
  • Смешанный протокол после перехода на HTTPS: конфиг задан в admin, но config.php и admin/config.php остались с http, ссылки формируются по http и уходят в редирект-цепочку.

Каждая из этих ошибок находится за пять минут и стоит магазину месяцы органики. Если вы ведёте магазин сами, прогоняйте этот список раз в квартал — особенно после установки новых модулей и обновления шаблона. Сравнить, как те же задачи решаются на других движках, можно в материалах про SEO на 1С-Битрикс и SEO на WordPress: логика дублей везде одна, отличается только способ починки.

Частые вопросы

OpenCart вообще пригоден для серьёзного SEO или лучше сразу переезжать?

Пригоден. Магазины на OpenCart стабильно занимают ТОП в конкурентных нишах — движок не имеет архитектурных ограничений, которые нельзя обойти. Вопрос в объёме подготовительной работы: там, где Битрикс даёт готовые SEO-инструменты из коробки, на OpenCart их придётся собрать. Переезд оправдан, если каталог перевалил за 50–100 тысяч позиций и упирается в производительность, или если магазин собран на устаревшей версии 1.5 с горой несовместимых модулей — тогда починка обойдётся дороже переноса.

Включил ЧПУ, а часть страниц всё равно с index.php?route=. Почему?

Потому что чекбокс включает механизм подстановки, но подставлять ему нечего: у этих сущностей не заполнено поле SEO keyword. Проверьте таблицу oc_seo_url — там будут пробелы. Заполните keyword у всех категорий, товаров, производителей и информационных страниц. Второй вариант причины — ссылка формируется модулем или сторонним шаблоном напрямую, минуя штатный url-класс. Такое видно по исходному коду страницы.

Нужно ли закрывать страницы фильтров от индексации полностью?

Нет, но открывать всё подряд ещё хуже. Работает белый список: закрыты все комбинации по умолчанию, открыты только те, под которые есть подтверждённый частотный спрос и достаточное количество товаров (ориентир — от 5–8 позиций). Обычно это связки «категория + бренд» и «категория + ключевой параметр». Открытая страница обязана иметь свои H1, title и description — иначе она просто дубль категории.

Ставить canonical со страниц пагинации на первую страницу?

Нет, это устаревшая рекомендация, которая до сих пор кочует по форумам. Такой canonical сообщает роботу, что страницы 2, 3, 4 — дубли первой, робот перестаёт с них переходить по ссылкам, и товары с глубоких страниц выпадают из индекса. Правильно: canonical на каждой странице пагинации указывает сам на себя, title и H1 содержат номер страницы, текст категории показывается только на первой.

Что делать с товарами, которые лежат в нескольких категориях?

Оставить как есть в админке — множественная привязка полезна для навигации. Но адрес карточки должен быть один: короткий, без path. Все варианты с path либо отдают 301 на короткий адрес, либо содержат canonical на него. Проверить просто: откройте карточку из двух разных категорий и сравните адрес в строке браузера и тег canonical в исходном коде — они должны совпадать.

Какой модуль ЧПУ выбрать и можно ли поставить два SEO-модуля?

Два — нельзя ни при каких условиях. Они конфликтуют на уровне модификаторов, дублируют canonical и метатеги, и найти источник проблемы потом крайне трудно. Выбирайте один комплексный модуль, который закрывает ЧПУ, шаблоны метатегов, canonical и управление индексацией фильтров, и совместим с вашей версией движка (3.x и 4.x несовместимы между собой). После установки обязательно проверьте исходный код: по одному тегу canonical, title, description и H1 на страницу.

Магазин на OpenCart тормозит. С чего начать ускорение?

Не с хостинга. Сначала померьте TTFB и посмотрите профиль запросов: почти всегда виноват COUNT товаров в категории и фильтре плюс отсутствие нормального кэша. Порядок действий: подключить Redis или Memcached, включить полностраничное кэширование для неавторизованных, вычистить неиспользуемые OCMOD-модификаторы, привести изображения в WebP с корректными размерами. Переезд на более мощный сервер без этих шагов даёт выигрыш в доли секунды и деньги на ветер.

Как перейти с OpenCart 3 на 4 без потери позиций?

Главный риск — изменившаяся схема seo_url: в 4.x keyword хранит полный путь, и адреса меняются массово. Перед переездом выгрузите полный список текущих URL краулером, после переезда соберите новый список и постройте карту 301-редиректов старый → новый, один в один, без массовых редиректов на главную. Дальше — проверка кодов ответа по всему списку, обновление sitemap, отправка на переобход в Вебмастере и контроль индексации в течение 4–8 недель.

SEO-продвижение сайтов с 2005 года

Приведём магазин на OpenCart в ТОП Яндекса

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

  • Пакет «Старт» от 55 000 ₽/мес
  • Пакет «Стандарт» 75 000 ₽/мес
  • Пакет «Премиум» 95 000 ₽/мес
  • Бесплатный аудит и прогноз
  • Договор с гарантией результата
  • Отчёты каждую неделю

Комментарии (14)

Андрей Л.

Кусок про то, что галочка «Использовать SEO URL» ничего сама не включает, а только активирует слой подстановки — это надо в рамку и вешать над столом. Два года был уверен, что ЧПУ у меня настроено, а половина каталога жила на route-адресах.

Марина_К

Выгрузила oc_seo_url в CSV, как советуете в первом шаге плана. Из 6800 товаров keyword пустой у 1900. Теперь понятно, почему в выдаче болтались адреса с product_id. Спасибо за конкретику, а не за общие слова.

AdminSEO Мастер

Марина, для 1900 позиций руками смысла нет — прогоните автогенерацию, но обязательно проверьте транслит на выборке из полусотни адресов, движковый ГОСТ любит выдавать «yi» на конце. А верхние 200-300 товаров-локомотивов задайте вручную, они того стоят.

vladimir77

Про два SEO-модуля — святая правда. Поставил второй «на попробовать», получил две canonical на карточке и месяц искал, откуда.

Ольга П.

Вопрос по фильтрам. У нас категория с 6 фильтрами, модуль переписывает адреса в человекопонятный вид. Если я закрою всё по умолчанию через noindex, а потом открою штук двадцать связок «категория + бренд» — робот эти двадцать вообще быстро найдёт? Или их надо как-то отдельно проталкивать?

AdminSEO Мастер

Ольга, сами по себе не найдёт быстро — им нужны честные внутренние ссылки. Сделайте на странице категории блок «Популярные подборки» со ссылками на открытые комбинации и добавьте эти двадцать адресов в sitemap. Обход тогда занимает недели, а не месяцы.

Дмитрий

Немного поспорю насчёт «причина не в слабом сервере». Да, COUNT по oc_product это боль, но на дешёвом шареде с общим MySQL вы этот COUNT никаким Redis не спасёте. Иногда переезд на нормальный VPS — это первый шаг, а не последний.

Ирина

Проверила по Ctrl+U — характеристики у нас грузятся по AJAX. Разработчик когда-то «ускорил» карточку. Пошла возвращать в DOM.

Сергей_бизнес

Собираюсь с 3.x на 4.x. Пишете, что keyword в четвёрке хранит полный путь и адреса ломаются массово. А если я на тройке уже сижу на вложенной схеме через модуль — адреса совпадут или всё равно всё поедет?

AdminSEO Мастер

Сергей, визуально могут выглядеть похоже, но собирает их другой механизм, и совпадение один-в-один — везение, а не правило. Снимите полный список URL краулером до переезда, после — второй список, и стройте карту 301 по факту, а не по ожиданиям. На несовпадениях как раз и теряют позиции.

Анна Т.

Абзац про canonical со всех страниц пагинации на первую попал прямо в меня. Именно так нам и настроил прошлый подрядчик, «по рекомендациям». Каталог глубокий, товары со вторых-третьих страниц из индекса действительно повыпадали.

Максим

Про чистку OCMOD отдельное спасибо. Выключенные модификаторы у нас копились с 2019 года, никто их не трогал.

Егор_ocStore

А что если сделать 301 с route на ЧПУ прямо правилом в nginx, не трогая seo_url.php? Меньше шансов сломать при обновлении движка вроде бы.

AdminSEO Мастер

Егор, идея рабочая, но nginx не знает содержимое oc_seo_url — он не сможет понять, есть ли у товара keyword, и куда именно редиректить. На сервере удобно закрывать простые вещи вроде слеша и /index.php, а связку route → ЧПУ логичнее держать в контроллере, где доступна база. И обязательно исключите checkout, cart и api.

Лариса

Мы полтора года потихоньку чистили дубли и переписывали описания у ходовых позиций. Вышли на пару тысяч визитов в месяц из поиска, для нашей узкой ниши это нормально. Магия не нужна, нужна дисциплина.

Тимур

Нашёл у себя открытую dev-копию на поддомене из вашего списка ошибок. Полный дубль каталога, висел два года. Закрыл за пять минут, как вы и написали.

Юля_контент

Совет не удалять карточки закончившихся товаров, а ставить статус и показывать аналоги — согласна на сто процентов. У нас менеджеры годами чистили каталог руками и убивали посадочные.

Константин Ж.

Скептический вопрос. Вы предлагаете фиксировать схему адресов «раз и навсегда» на втором шаге. Но бизнес живой, каталог перетасовывают. Не получится ли, что через год всё равно всё переедет и работа насмарку?

AdminSEO Мастер

Константин, возражение по делу — именно поэтому в статье и сказано, что при частой перетасовке каталога плоская схема безопаснее: перенос категории между разделами не меняет адрес. Вложенность красивее, но платите вы за неё переездом при каждой правке структуры. Если сомневаетесь, какую схему брать под ваш каталог, приходите на бесплатный аудит — посмотрим на цифрах.

Оставить комментарий

Спасибо! Ваш комментарий отправлен на модерацию и появится после проверки.