Перейти к содержанию

Варианты одного товара

У VM-C9 одна продаваемая позиция, а у шлема VM-H1 их две: M и L. Если хранить наличие только на уровне общей карточки, посетитель может увидеть обещание покупки для отсутствующего размера. В этом уроке разделим общие данные модели и свойства варианта, сохранив одну страницу шлема.

Шлем, размеры и цены вымышлены. Модель чёрная, оба размера стоят 2990 ₽; учебный остаток M равен четырём, L — двум. Диапазоны M 54–58 см и L 58–62 см служат примером каталожных данных, а не гарантией посадки или безопасности. Никакого стандарта, сертификации и результата испытаний мы не приписываем товару.

Модель не равна варианту

Модель VM-H1 объединяет название, общий цвет и описание. Варианты имеют SKU VM-H1-M и VM-H1-L, размер, диапазон и остаток. Цена сейчас одинаковая, но принадлежит каждому предложению, поскольку позже может измениться независимо. Если хранить её только у модели, система не сможет корректно выразить такое различие.

Свойство Общая модель Вариант M Вариант L
Идентификатор VM-H1 VM-H1-M VM-H1-L
Цвет Чёрный Наследуется Наследуется
Размер Выбирается M, 54–58 см L, 58–62 см
Цена Определяется вариантом 2990 ₽ 2990 ₽
Учебный остаток Не является обещанием размера 4 2

Сумма остатков равна шести, но число «шесть» не отвечает человеку, которому требуется L. В карточке после выбора нужно показать два, а не общий склад модели. Если один размер станет недоступен, другой останется отдельным предложением. Состояние группы нельзя автоматически переносить на каждый вариант.

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

Один документ и адрес выбранного состояния

Используем одну страницу /shop/products/vm-h1/. Базовый ожидаемый макет выбирает M. Адрес с ?size=M соответствует M, с ?size=L — L. При повторном открытии варианта предполагается сохранение именно этого выбора в URL, видимом SKU и предложении. В архиве представлены отдельные ожидаемые состояния; работающий обработчик параметров не создавался и не выполнялся.

Для этой одностраничной модели выберем общий canonical на базовый адрес карточки. Он обозначает основной документ группы, а параметр — конкретное состояние выбора. Это не универсальная схема для всех магазинов. Если варианты распределены по самостоятельным полноценным страницам, Google описывает другой подход, при котором один общий canonical группы не требуется. Документация Google о вариантах.

В состоянии L текст, выбранный элемент и предлагаемый SKU должны совпадать. Покажем фрагмент ожидаемого HTML, не готовую форму покупки:

<label for="helmet-size">Размер шлема VM-H1</label>
<select id="helmet-size" name="size">
  <option value="M">M: 54–58 см</option>
  <option value="L" selected>L: 58–62 см</option>
</select>
<p>Выбран VM-H1-L. 2990 ₽. Учебный остаток: 2.</p>

Одной подписи selected недостаточно для реализации выбора: изменение поля должно согласованно менять данные интерфейса и будущего заказа. Мы пока описали нужное состояние. Сервер не должен принимать общий VM-H1 вместо конкретного SKU, если оформление требует размер. Неизвестное значение вроде XL надо объяснить, а не молча подменять вариантом M.

Машинное описание группы

Schema.org предоставляет тип ProductGroup и связь hasVariant. Иллюстрация ниже показывает разделение сущностей; изображения и другие сведения не подтверждены, поэтому это неполный пример для платформы, а не готовая разметка расширенного результата. Определение ProductGroup.

{
  "@context": "https://schema.org",
  "@type": "ProductGroup",
  "name": "Чёрный шлем VM-H1",
  "productGroupID": "VM-H1",
  "variesBy": ["https://schema.org/size"],
  "hasVariant": [
    {"@type": "Product", "sku": "VM-H1-M", "size": "M",
     "name": "Шлем VM-H1, M", "url": "https://velomaster.example/shop/products/vm-h1/?size=M"},
    {"@type": "Product", "sku": "VM-H1-L", "size": "L",
     "name": "Шлем VM-H1, L", "url": "https://velomaster.example/shop/products/vm-h1/?size=L"}
  ]
}

Групповой идентификатор устойчив между вариантами. SKU различаются, а URL позволяет указать ожидаемое выбранное состояние. Не следует создавать одну группу для VM-C9 и VM-C10 только потому, что обе позиции называются цепями: в нашем каталоге это разные модели с разным назначением. Связь вариантов должна соответствовать продуктовой модели, а не любому сходству названий.

Отдельные предложения с ценой и наличием можно добавить к соответствующим Product после согласования всех данных. Нельзя оставить один Offer группы с наличием M и надеяться, что он корректно описывает L. Для будущего платформенного фида потребуется та же связь группы и отдельные позиции; его правила рассмотрим в двадцать четвёртом уроке.

Изменение одного остатка

Рассмотрим будущий сценарий: M распродан, L остаётся в количестве двух. В ожидаемом документе M получает явную недоступность, а L сохраняет возможность заказа. URL выбранного M не должен автоматически открывать L и выглядеть доступным. Можно предложить посмотреть другие размеры, но решение о пригодности не принимается за посетителя.

Другой сценарий — цена L изменяется, а M нет. При переходе к L интерфейс показывает новую цену и SKU VM-H1-L; базовая карточка не обещает прежнюю стоимость любого размера. Это демонстрирует, зачем мы разделили цену по вариантам даже при одинаковом исходном значении. Обновление касается товара, предложения и будущей выгрузки одновременно.

Неизвестный размер не является ещё одним вариантом

Адрес с size=XL не соответствует ни одной позиции учебного реестра. Ожидаемый документ должен объяснить, что такого размера нет, и предложить выбрать M или L. Нельзя сохранить надпись XL и отправить в будущий заказ SKU VM-H1-M: человек увидит одно, а система оформит другое. Результат такого перехода отдельно определяют в реализации; сейчас он описан только как содержательное требование.

Второе ограничение относится к равенству цен. Сегодня оба предложения стоят 2990 ₽, поэтому ошибка выбора может остаться незаметной по сумме. Её выявляют по SKU, размеру и остатку одновременно. Вариант L всегда соответствует VM-H1-L и двум единицам в снимке, даже когда M имеет ту же цену.

Для ручного чтения откройте два ожидаемых HTML-фрагмента рядом и найдите три изменяющихся значения: selected, SKU и количество. Общие название модели и цвет остаются прежними. Canonical тоже относится к одной базовой странице в выбранной схеме. Такой разбор показывает, какие поля принадлежат варианту и какие сохраняются на уровне модели, не выдавая статичные документы за выполненную проверку переключателя.

Результат урока — одна модель, два идентифицируемых варианта и описанные ожидаемые состояния выбора. Программы, переключатель, оформление и внешние валидаторы не запускались. Дальнейшие уроки смогут сравнивать товары, строить руководства выбора и сопровождать наличие, сохраняя различие между общим документом, конкретным SKU и условиями предложения.