Оптимизация SEO-параметров, исправление дублирующихся страниц, тонкая настройка robots.txt и интеграция Системы быстрых платежей (СБП) для современного интернет-магазина домашнего текстиля.
data-forms="bid", что позволило взаимодействовать с кнопками.<style> для обеспечения корректного отображения на десктопах и мобильных экранах. Внедрен фильтр Twig |raw для вывода заголовков и описаний баннеров без HTML-экранирования.html_entity_decode) для заголовков (title) и описаний (description) перед передачей в шаблон. Это позволяет использовать в админке HTML-теги переноса строк (<br>) и другие элементы разметки.data-forms="freefabric")./vse_komplekty или по указанной в админке ссылке).Wishlist, которая динамически сбрасывала надпись обратно на «Быстрый просмотр».app.min.js) с помощью Webpack/Gulp.yandex_fid.yml (737 товаров) и нового динамического фида index.php?route=extension/feed/yandex_market2 (6677 товаров).<offers> нового фида (все ссылки ведут строго на страницы товаров и их модификации по размерам).image в схеме Product JSON-LD с одиночного объекта ImageObject на плоский массив прямых URL-ссылок всех картинок товара (главное фото + дополнительные ракурсы из галереи). Это соответствует требованиям Справки Яндекса для мерчантов и устраняет ошибку распознавания изображений роботом «Поиска по товарам».image.url и image.image в разметке @type: Product содержало массив ["webp" => ..., "default" => ...] вместо одной строки-ссылки, что вызывало ошибку "Недопустимый тип значения в поле url". Изменен вывод: теперь в Schema.org передается строковый URL по умолчанию (default).image внутри ImageObject.Store с индивидуальными отзывами (Review) и средним рейтингом (AggregateRating) на базе реальных отзывов из категории main.ItemList + Product с ценами, валютой, ссылками и наличием) на страницах категорий.BreadcrumbList и структуры блога Blog со списком превью-статей BlogPosting.BreadcrumbList и структуры статьи BlogPosting (с указанием автора, даты, заголовка и изображения).FAQPage (уже была оптимизирована) и дополнительно внедрен вывод хлебных крошек BreadcrumbList для полной консистентности.JSON_UNESCAPED_UNICODE и JSON_UNESCAPED_SLASHES для читаемости кириллического текста в исходном коде страницы и чистоты сгенерированных ссылок (без экранирования символов \u04... и /).header.php (для оригинального файла и кэша модификатора OCMod).header.twig (оригинальный и кэшированный) добавлены мета-теги og:title, og:description, og:url, og:image, og:site_name и og:locale.Loadmore.js для автоматического сохранения состояния каталога в sessionStorage (HTML-код подгруженных карточек, активный индекс пагинации, состояние кнопки «Показать еще» и текущая координата скролла).sessionStorage при переходе на другие страницы/категории каталога или при принудительной перезагрузке (F5). Это устранило баг, при котором пользователя выкидывало в начало списка при возврате из карточки товара.npm run build).seo_url_generator). Установлено, что модуль перехватывает сохранение товара в модели addProduct через обход массива product_seo_url.csv_update массив $product собирается без ключа product_seo_url, из-за чего модуль пропускает генерацию. Также обнаружена проблема сброса ЧПУ в пустой массив при копировании товара в админ-панели (метод copyProduct). Составлен технический отчет.Dadata.js на новый активный ключ: 97c916f5761f3e2abb8435092b7aa172e637c543. Это восстановило автоматические подсказки городов, улиц и домов при оформлении заказа покупателями в корзине.npm run build), чтобы обновить дистрибутивные бандлы app.min.js.display: block для .header-top.scrolled только для экранов шириной более 600px (десктопы).display: none; для .header-top.scrolled, чтобы при скролле верхний бар не появлялся на экранах смартфонов. Это убрало баг отображения верхней панели на телефонах и исправило конфликт приоритета !important со стилями темы.Checkout.js в безопасную проверку существования свойств и добавлены обработчики .catch. Это защищает страницу оформления заказа от падения и мертвых зависаний JavaScript, если токен Dadata заблокирован или превышен лимит.validate() в checkout.php — теперь при наличии ошибок возвращается false (вместо неявного null), а при их отсутствии возвращается true (вместо return null;). Это восстановило корректное выполнение проверки if ($this->validate()) при финальном подтверждении заказа, исключая создание заказов без адреса и ПВЗ.npm run build.GridGallery в обработчик Loadmore.js.new GridGallery('.js-grid-gallery-navs', item) для каждого динамически подгружаемого товара. Это привязывает события наведения и клика к новым карточкам товаров, возвращая работоспособность смены фотографий и перехода по клику в товар.npm run build для компиляции изменений в app.min.js.body.animate, приводившая к скачкам верстки и сбоям скролла. Добавлен JS-перехватчик метода animate на document.body, нейтрализующий данные сдвиги..header-top.scrolled { display: none; }) при скролле с помощью добавления CSS-правила display: block !important; в стили шаблона header.twig. Теперь вся шапка сайта (обе строки) ведет себя как стабильная липкая панель без изменения высоты документа и без визуальных скачков.ds_product_description_name.ds_product_description_name и выполнение последующих замен поверх нее. Если запись существует, происходит UPDATE, иначе – INSERT.min(), чтобы предотвратить ошибки выхода за границы массива при количестве найденных совпадений меньше запрошенного числа замен.CatalogColors.js для динамической AJAX-подгрузки обновленной карточки товара при выборе цвета.GridGallery.js для поддержки инициализации галереи внутри конкретного контейнера новой карточки и защиты от повторного навешивания обработчиков.Wishlist.js на делегирование событий клика для стабильного добавления товаров в избранное на AJAX-замененных карточках.CatalogColors в app.js. Все скрипты скомпилированы в app.min.js с помощью Gulp и скопированы в рабочую папку app/assets для продакшена.512px (256*2) до 1800px (900*2), чтобы исключить его размытие при растягивании CSS-стилями на всю ширину страницы.blog.twig) исправлена опечатка в имени переменной (заменена несуществующая thumb.webp на image.webp), что позволило восстановить загрузку качественных WebP-изображений. Также исправлена опечатка blog.title -> title в атрибутах alt и title главного изображения.getMainPageTags(). Теперь вывод всех тегов библиотеки по умолчанию при отсутствии привязок срабатывает исключительно для главной страницы (common/home). На страницах категорий и промо-статей нижний блок тегов теперь отображается только при наличии ручных настроек привязок в админке. Это скрыло нежелательный огромный блок тегов над подвалом во всех категориях и статьях на сайте, где они не настраивались.fetch для проверки процесса склеивания адреса (UUID + физический адрес) в базе данных и AmoCRM. Проект пересобран с помощью gulp build.gulp build.return. Восстановлен оригинальный рабочий AJAX-запрос fetch на бэкенд-контроллер index.php?route=checkout/confirm для создания реального заказа. Проект успешно пересобран командой gulp build для генерации обновленного дистрибутивного файла app.min.js.payment_address_1 запишется только технический UUID (например, как делает модуль Boxberry: # c4218736-422d-...), бэкенд в контроллерах checkout.php (при валидации) и confirm.php (при создании заказа) автоматически обнаружит это и прикрепит физический адрес точки из поля street (которое хранит ПВЗ на фронте). В результате в созданный заказ всегда будет попадать полный адрес вида # UUID Физический адрес точки.apiship.php (включая методы set_point(), getQuote(), а также методы формирования списков точек и сохранения заказа в БД) вызовы $this->apiship->get_address($point) заменены на $point['address'] (или соответствующую проверку isset). Метод get_address() на бэкенде предназначен для форматирования адреса покупателя и ожидал структуру с полями областей и регионов, тогда как объект точки выдачи ПВЗ имеет другую структуру, из-за чего адрес стирался в пустую строку.checkout.php полностью удален проблемный блок, который стирал технический ID адреса. Раскомментированы проверки валидации: теперь система строго требует улицу и дом для курьера, и выдает ошибку, если точка ПВЗ на карте не выбрана. В confirm.php Яндекс (apiship) добавлен в список исключений вместе с Boxberry и СДЭК для предотвращения перезаписи адреса.npm run build).confirm.php добавлено исключение для apiship, boxberry и cdek, чтобы при сохранении заказа к адресу ПВЗ с решеткой (#) не приклеивались пустые "г." и "ул.".apiship.js и apiship.php реализована генерация и передача полного физического адреса точки (# UUID Адрес) в скрытое поле [data-checkout-address], вместо пустого значения.Sdek.js исправлено очищение адреса (которое затирало инпут пробелом). Теперь при клике на ПВЗ генерируется полная строка адреса.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), даже если список дочерних категорий пуст.
| № | НАЗВАНИЕ ЗАДАЧИ |
|---|---|
| 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 задачи выполнены |