OpenCart 3.0 Июнь 2026

DreamsStore

Оптимизация SEO-параметров, исправление дублирующихся страниц, тонкая настройка robots.txt и интеграция Системы быстрых платежей (СБП) для современного интернет-магазина домашнего текстиля.

Платформа

OpenCart 3.0

Категория

SEO / Оптимизация / СБП

Дата релиза

Июнь 2026

Сайт проекта

https://dreamsstore.ru ↗

changelog.sh

[2026-07-03] - Внедрение двухкнопочного слайдера на главной странице и переименование формы образцов ткани

  • Верстка (home.twig): Интегрирована новая структура слайдов со слоем контента и кнопками поверх изображений, аналогично странице «Шторы на заказ». Фоновое изображение лишилось глобального обработчика data-forms="bid", что позволило взаимодействовать с кнопками.
  • Стилизация (home.twig): Перенесены стили оверлеев, адаптивного позиционирования текста и оформления кнопок в локальный блок <style> для обеспечения корректного отображения на десктопах и мобильных экранах. Внедрен фильтр Twig |raw для вывода заголовков и описаний баннеров без HTML-экранирования.
  • Бэкенд (banner.php): Добавлено декодирование HTML-сущностей (html_entity_decode) для заголовков (title) и описаний (description) перед передачей в шаблон. Это позволяет использовать в админке HTML-теги переноса строк (<br>) и другие элементы разметки.
  • Кнопка 1: Открывает модальную форму заказа бесплатных образцов ткани (data-forms="freefabric").
  • Кнопка 2: Выполняет переход по ссылке (по умолчанию на /vse_komplekty или по указанной в админке ссылке).
  • Форма (freefabric.twig): Изменено внутреннее название темы формы со значения «Заявка на бесплатные образцы ткани» на «Заявка на образцы ткани» (для точной идентификации заявок в почте и CRM).

[2026-07-01] - Переименование кнопки быстрого просмотра товара в «В корзину»

  • Переименована кнопка «Быстрый просмотр» в «В корзину» в разметке карточек товаров с сохранением функционала (кликом вызывается быстрое превью для выбора размера).
  • Скорректирована JS-логика в конструкторе класса Wishlist, которая динамически сбрасывала надпись обратно на «Быстрый просмотр».
  • Произведена сборка и минимизация клиентских ресурсов (app.min.js) с помощью Webpack/Gulp.

[2026-07-01] - Технический аудит и сравнение товарных фидов для Яндекса

  • Проведен сравнительный аудит старого статического фида yandex_fid.yml (737 товаров) и нового динамического фида index.php?route=extension/feed/yandex_market2 (6677 товаров).
  • Выполнена проверка на отсутствие ссылок на категории в разделе <offers> нового фида (все ссылки ведут строго на страницы товаров и их модификации по размерам).
  • Сформулированы рекомендации для клиента по перенаправлению источника данных в кабинете Яндекса и удалению устаревшего XML-файла.

[2026-07-01] - Модернизация разметки картинок товара для Яндекс Поиска по товарам

  • Изменен тип данных поля image в схеме Product JSON-LD с одиночного объекта ImageObject на плоский массив прямых URL-ссылок всех картинок товара (главное фото + дополнительные ракурсы из галереи). Это соответствует требованиям Справки Яндекса для мерчантов и устраняет ошибку распознавания изображений роботом «Поиска по товарам».

[2026-07-01] - Исправление микроразметки Product (ошибка с типом URL в поле image)

  • Исправлена критическая ошибка валидации структурированных данных на страницах товаров. Поле image.url и image.image в разметке @type: Product содержало массив ["webp" => ..., "default" => ...] вместо одной строки-ссылки, что вызывало ошибку "Недопустимый тип значения в поле url". Изменен вывод: теперь в Schema.org передается строковый URL по умолчанию (default).
  • Удалено дублирующее некорректное свойство image внутри ImageObject.

[2026-07-01] - Внедрение микроразметки Schema.org на ключевые страницы сайта

  • Отзывы (Задача 4.5): Реализована разметка Store с индивидуальными отзывами (Review) и средним рейтингом (AggregateRating) на базе реальных отзывов из категории main.
  • Категории (Задача 4.2): Реализована разметка списков товаров (ItemList + Product с ценами, валютой, ссылками и наличием) на страницах категорий.
  • Блог (Задача 4.3): Добавлен вывод хлебных крошек BreadcrumbList и структуры блога Blog со списком превью-статей BlogPosting.
  • Статья (Задача 4.4): Добавлен вывод хлебных крошек BreadcrumbList и структуры статьи BlogPosting (с указанием автора, даты, заголовка и изображения).
  • FAQ (Задача 4.6): Проверена разметка FAQPage (уже была оптимизирована) и дополнительно внедрен вывод хлебных крошек BreadcrumbList для полной консистентности.
  • Контроль версий: Изменения зафиксированы в Git и отправлены в удаленный репозиторий.

[2026-06-30] - Оптимизация микроразметки FAQPage на странице FAQ

  • Бэкенд: Изменена логика сериализации массива FAQPage в формат JSON-LD. Добавлены флаги JSON_UNESCAPED_UNICODE и JSON_UNESCAPED_SLASHES для читаемости кириллического текста в исходном коде страницы и чистоты сгенерированных ссылок (без экранирования символов \u04... и /).
  • Контроль версий: Изменения зафиксированы в Git и отправлены в репозиторий.

[2026-06-30] - Внедрение микроразметки Open Graph (schema.org) на все страницы сайта

  • Бэкенд: Внедрена логика автоматического сбора метаданных Open Graph в контроллере шапки header.php (для оригинального файла и кэша модификатора OCMod).
  • Бэкенд: Настроена динамическая подстановка картинок: для карточек товаров берется первое (основное) фото товара, для статей блога — основное изображение статьи, а для остальных страниц (главная, категории, текстовые разделы) используется логотип интернет-магазина.
  • Фронтенд: В шаблон header.twig (оригинальный и кэшированный) добавлены мета-теги og:title, og:description, og:url, og:image, og:site_name и og:locale.
  • Контроль версий: Изменения зафиксированы в репозитории Git и отправлены на удаленный сервер.

[2026-06-30] - Сохранение состояния каталога товаров и позиции прокрутки при возврате назад

  • Фронтенд: Модернизирован класс Loadmore.js для автоматического сохранения состояния каталога в sessionStorage (HTML-код подгруженных карточек, активный индекс пагинации, состояние кнопки «Показать еще» и текущая координата скролла).
  • Фронтенд: Реализовано восстановление сохраненного состояния при возврате назад (history back navigation) и автоматическая очистка кэша sessionStorage при переходе на другие страницы/категории каталога или при принудительной перезагрузке (F5). Это устранило баг, при котором пользователя выкидывало в начало списка при возврате из карточки товара.
  • Сборка: Запущена компиляция и оптимизация фронтенд-ассетов с помощью Gulp (npm run build).

[2026-06-30] - Технический аудит автоматической генерации ЧПУ (SEO URL) товаров

  • Аудит: Проведен детальный анализ логики работы модуля автогенерации ЧПУ (seo_url_generator). Установлено, что модуль перехватывает сохранение товара в модели addProduct через обход массива product_seo_url.
  • Аудит: Выявлена основная причина отсутствия ЧПУ у части товаров: при автоматическом импорте из CSV-файлов через скрипт csv_update массив $product собирается без ключа product_seo_url, из-за чего модуль пропускает генерацию. Также обнаружена проблема сброса ЧПУ в пустой массив при копировании товара в админ-панели (метод copyProduct). Составлен технический отчет.

[2026-06-27] - Обновление API-ключа DaData для работы подсказок адресов на сайте

  • Фронтенд: Обновлен нерабочий API-ключ (токен) в JS-классе Dadata.js на новый активный ключ: 97c916f5761f3e2abb8435092b7aa172e637c543. Это восстановило автоматические подсказки городов, улиц и домов при оформлении заказа покупателями в корзине.
  • Сборка: Запущена пересборка клиентских скриптов с помощью Gulp (npm run build), чтобы обновить дистрибутивные бандлы app.min.js.

[2026-06-25] - Исправление отображения верхней панели шапки на мобильных устройствах

  • Фронтенд: Локализовано применение стиля display: block для .header-top.scrolled только для экранов шириной более 600px (десктопы).
  • Фронтенд: Для экранов шириной 600px и менее (мобильные) добавлено правило display: none; для .header-top.scrolled, чтобы при скролле верхний бар не появлялся на экранах смартфонов. Это убрало баг отображения верхней панели на телефонах и исправило конфликт приоритета !important со стилями темы.

[2026-06-23] - Защита корзины от зависаний при сбоях Dadata и исправление бэкенд-валидации заказа

  • Фронтенд: Обернут вызов Dadata API в методе Checkout.js в безопасную проверку существования свойств и добавлены обработчики .catch. Это защищает страницу оформления заказа от падения и мертвых зависаний JavaScript, если токен Dadata заблокирован или превышен лимит.
  • Бэкенд: Исправлен метод validate() в checkout.php — теперь при наличии ошибок возвращается false (вместо неявного null), а при их отсутствии возвращается true (вместо return null;). Это восстановило корректное выполнение проверки if ($this->validate()) при финальном подтверждении заказа, исключая создание заказов без адреса и ПВЗ.
  • Сборка: Запущена пересборка скриптов с помощью npm run build.

[2026-06-23] - Инициализация галереи при подгрузке новых товаров (loadmore)

  • Фронтенд: Импортирован класс GridGallery в обработчик Loadmore.js.
  • Фронтенд: Добавлена инициализация new GridGallery('.js-grid-gallery-navs', item) для каждого динамически подгружаемого товара. Это привязывает события наведения и клика к новым карточкам товаров, возвращая работоспособность смены фотографий и перехода по клику в товар.
  • Фронтенд: Проект пересобран с помощью npm run build для компиляции изменений в app.min.js.

[2026-06-21] - Фиксация липкости шапки сайта и устранение скачков при скролле

  • Фронтенд: Отключена проблемная JS-анимация сдвига body.animate, приводившая к скачкам верстки и сбоям скролла. Добавлен JS-перехватчик метода animate на document.body, нейтрализующий данные сдвиги.
  • Фронтенд: Заблокировано скрытие верхнего бара (.header-top.scrolled { display: none; }) при скролле с помощью добавления CSS-правила display: block !important; в стили шаблона header.twig. Теперь вся шапка сайта (обе строки) ведет себя как стабильная липкая панель без изменения высоты документа и без визуальных скачков.

[2026-06-02] - Доработка повторных замен в модуле названий товаров

  • Бэкенд: Изменена логика поиска и замены в контроллере модуля замены названий товаров. Убрано исключение товаров из выборки при наличии существующей записи в таблице ds_product_description_name.
  • Бэкенд: Реализована проверка наличия ранее сохраненной замены в таблице ds_product_description_name и выполнение последующих замен поверх нее. Если запись существует, происходит UPDATE, иначе – INSERT.
  • Бэкенд: Добавлено ограничение количества обрабатываемых товаров функцией min(), чтобы предотвратить ошибки выхода за границы массива при количестве найденных совпадений меньше запрошенного числа замен.

[2026-06-02] - Интерактивный выбор цвета в каталоге товаров

  • Фронтенд: Создан класс CatalogColors.js для динамической AJAX-подгрузки обновленной карточки товара при выборе цвета.
  • Фронтенд: Изменен класс GridGallery.js для поддержки инициализации галереи внутри конкретного контейнера новой карточки и защиты от повторного навешивания обработчиков.
  • Фронтенд: Переведен класс Wishlist.js на делегирование событий клика для стабильного добавления товаров в избранное на AJAX-замененных карточках.
  • Фронтенд: Выполнен импорт и инициализация CatalogColors в app.js. Все скрипты скомпилированы в app.min.js с помощью Gulp и скопированы в рабочую папку app/assets для продакшена.

[2026-06-02] - Повышение качества первой картинки в статьях блога

  • Бэкенд: Увеличен размер сжатия главного изображения статьи в контроллере блога с 512px (256*2) до 1800px (900*2), чтобы исключить его размытие при растягивании CSS-стилями на всю ширину страницы.
  • Фронтенд: В шаблоне статьи (blog.twig) исправлена опечатка в имени переменной (заменена несуществующая thumb.webp на image.webp), что позволило восстановить загрузку качественных WebP-изображений. Также исправлена опечатка blog.title -> title в атрибутах alt и title главного изображения.

[2026-06-02] - Ограничение автоматического вывода всех тегов (фоллбека) только главной страницей

  • Бэкенд: Изменена логика фоллбека метода getMainPageTags(). Теперь вывод всех тегов библиотеки по умолчанию при отсутствии привязок срабатывает исключительно для главной страницы (common/home). На страницах категорий и промо-статей нижний блок тегов теперь отображается только при наличии ручных настроек привязок в админке. Это скрыло нежелательный огромный блок тегов над подвалом во всех категориях и статьях на сайте, где они не настраивались.

[2026-05-23] - Окончательное отключение дебаг-режима для проверки бэкенд-склейки

  • Фронтенд: Отключен тестовый режим на кнопке "Оформить заказ". Восстановлена реальная отправка заказа на бэкенд через метод fetch для проверки процесса склеивания адреса (UUID + физический адрес) в базе данных и AmoCRM. Проект пересобран с помощью gulp build.

[2026-05-23] - Восстановление тестового режима оформления заказа и повторная компиляция

  • Фронтенд: По просьбе заказчика временно восстановлен дебаг-режим на кнопке "Оформить заказ", отменяющий отправку реального заказа и выводящий массив данных формы в консоль. Это необходимо для проведения локальных тестов. Скрипты пересобранны с помощью gulp build.

[2026-05-23] - Отключение тестового режима оформления заказа и компиляция фронтенда

  • Фронтенд: Отключен временный дебаг-режим на кнопке "Оформить заказ", который выводил собранные данные формы в консоль и прерывал дальнейшую логику с помощью return. Восстановлен оригинальный рабочий AJAX-запрос fetch на бэкенд-контроллер index.php?route=checkout/confirm для создания реального заказа. Проект успешно пересобран командой gulp build для генерации обновленного дистрибутивного файла app.min.js.

[2026-05-23] - Автоматическое восстановление физического адреса для ПВЗ (Boxberry, СДЭК, ApiShip) на бэкенде

  • Бэкенд: Реализовано автоматическое восстановление физического адреса для способов доставки типа "Самовывоз из ПВЗ" (Boxberry, СДЭК, Яндекс). Если на фронтенде в поле адреса payment_address_1 запишется только технический UUID (например, как делает модуль Boxberry: # c4218736-422d-...), бэкенд в контроллерах checkout.php (при валидации) и confirm.php (при создании заказа) автоматически обнаружит это и прикрепит физический адрес точки из поля street (которое хранит ПВЗ на фронте). В результате в созданный заказ всегда будет попадать полный адрес вида # UUID Физический адрес точки.

[2026-05-23] - Исправление затирания адреса ПВЗ ApiShip (Яндекс Маркет) на бэкенде

  • Бэкенд: Исправлено критическое затирание адреса ПВЗ ApiShip (Яндекс Маркет). Во всей модели apiship.php (включая методы set_point(), getQuote(), а также методы формирования списков точек и сохранения заказа в БД) вызовы $this->apiship->get_address($point) заменены на $point['address'] (или соответствующую проверку isset). Метод get_address() на бэкенде предназначен для форматирования адреса покупателя и ожидал структуру с полями областей и регионов, тогда как объект точки выдачи ПВЗ имеет другую структуру, из-за чего адрес стирался в пустую строку.

[2026-05-22] - Обязательность полей адреса и фиксация данных ПВЗ

  • Бэкенд: Из checkout.php полностью удален проблемный блок, который стирал технический ID адреса. Раскомментированы проверки валидации: теперь система строго требует улицу и дом для курьера, и выдает ошибку, если точка ПВЗ на карте не выбрана. В confirm.php Яндекс (apiship) добавлен в список исключений вместе с Boxberry и СДЭК для предотвращения перезаписи адреса.
  • Фронтенд: В JS скриптах СДЭК и Яндекса реализована корректная передача строки адреса с техническим идентификатором. Запущена сборка фронтенда (npm run build).

[2026-05-22] - Исправление сохранения полного адреса ПВЗ (Яндекс Маркет и СДЭК)

  • Бэкенд: В confirm.php добавлено исключение для apiship, boxberry и cdek, чтобы при сохранении заказа к адресу ПВЗ с решеткой (#) не приклеивались пустые "г." и "ул.".
  • Фронтенд (Яндекс Маркет): В скриптах apiship.js и apiship.php реализована генерация и передача полного физического адреса точки (# UUID Адрес) в скрытое поле [data-checkout-address], вместо пустого значения.
  • Фронтенд (СДЭК): В классе Sdek.js исправлено очищение адреса (которое затирало инпут пробелом). Теперь при клике на ПВЗ генерируется полная строка адреса.

[2026-05-19] - Вывод фильтров категорий в главное меню (Мега-меню)

  • Модель (category.php): Добавлен метод getCategoryOptionValues($category_id, $option_id) для получения уникальных размеров активных товаров категории. Также добавлен метод getCategoryAttributeValues($category_id, $attribute_id) для получения уникальных наполнителей/тканей с автоматическим разбиением комбинированных значений (разделитель /) и сортировкой.
  • Контроллер (menu_main.php): Интегрирована карта связей категорий с опциями/атрибутами (Подушки, Одеяла, Наматрасники, Покрывала, Пледы, Полотенца). Сформирован массив filter_columns с правильными ссылками на фильтрацию каталога (filter_option и filter_attribute).
  • Шаблон (menu_main.twig): Реализован рендеринг колонок фильтров справа от подразделов мега-меню. Добавлена поддержка вывода фильтров для категорий без подкатегорий (например, «Наматрасники», «Полотенца»), благодаря проверке существования колонок фильтров (category.filter_columns), даже если список дочерних категорий пуст.
https://dreamsstore.ru
Скриншот проекта DreamsStore

Отчет о трудозатратах (Timesheet)

НАЗВАНИЕ ЗАДАЧИ
1 Внедрение двухкнопочного слайдера на главной странице и переименование формы образцов ткани
2 Внедрение микроразметки Schema.org на ключевые страницы сайта
3 Исправление микроразметки Product (ошибка с типом URL в поле image)
4 Модернизация разметки картинок товара для Яндекс Поиска по товарам
5 Технический аудит и сравнение товарных фидов для Яндекса
6 Переименование кнопки быстрого просмотра товара в «В корзину»
7 Аудит автоматической генерации ЧПУ товаров
8 Сохранение состояния каталога при возврате назад
9 Внедрение микроразметки Open Graph
10 Оптимизация микроразметки FAQPage
11 Обновление API-ключа DaData
12 Исправление верхней панели на мобильных
13 Инициализация галереи при подгрузке loadmore
14 Защита от зависаний Dadata и бэкенд-валидация заказа
15 Фиксация липкости шапки сайта
16 Ограничение вывода тегов (сохранение модуля)
17 Качество изображений в статьях блога
18 Выбор цвета на странице каталога
19 Повторные замены в модуле автозамен названий
20 Исправление сохранения полного адреса ПВЗ (Яндекс Маркет и СДЭК)
21 Обязательность полей адреса и фиксация данных ПВЗ
22 Вывод фильтров категорий в главное меню
Итого 22 задачи выполнены