SEO интернет-магазина: каталог, фильтры и карточки

Вариации товаров

Когда размер, цвет и комплектация — один документ Поиска, а когда свой URL, и как это сверить с фидом и ProductGroup.

Кирилл Бабийчук · обновлено · 6 мин чтения

Вариация товара — это продаваемая комбинация одной модели (цвет, размер, память, комплектация), а не ещё один абзац на карточке и не галочка фильтра каталога. Хаб — SEO интернет-магазина. Как собирается живой SKU-документ — SEO карточек товаров. Срез витрины «красные 42» без своего артикула — уже фильтры, не вариация.

Решение одно: сколько URL Поиск должен считать отдельными документами. Один канон с переключателем — если человек ищет модель, а цвет и размер выбирает на странице. Свой URL — если комбинацию ищут как товар: «iPhone 16 256 белый», «кроссовки Pegasus зелёные». Третьего «родительского» документа без цены и наличия магазину обычно не нужно: и справка Merchant Center, и schema.org ProductGroup прямо говорят, что группа — не оффер.

Один документ или много

Google Search Central описывает два рабочих контура. Одна страница: все варианты выбираются без перезагрузки, чаще через query; у группы свой URL, у каждого оффера — свой адрес с уже выбранной комбинацией. Несколько страниц: у каждой вариации отдельный документ. Это не «ещё один способ уникализировать title». Это выбор, какой адрес человек получит из поиска и какой адрес уйдёт в фид.

Ситуация Сколько URL Почему
Размеры 40–46 одной пары, цена и фото одни, спроса на «размер 43» как на модель нет Один канон, переключатель Иначе индекс получает тонкие дубли и отбирает обход у денежной карточки
Цвет ищут как отдельный товар, своё фото, иногда своя цена Свой URL на цвет Иначе сниппет и фид показывают чужой цвет, а клик ведёт на «дефолт»
Память / диагональ / процессор меняют модель в языке запроса Свой URL на комплектацию Это уже разные товары в выдаче, не свитч на одной карточке
CMS-родитель «модель» без цены, наличия и кнопки купить Не индексировать Merchant Center: не выгружать parent SKU отдельным товаром; schema.org: ProductGroup сам по себе не продаётся

Яндекс на товарном URL формулирует ту же развилку иначе. Вариации — отдельные предложения, только если у них свой адрес, своя цена и своё наличие. Иначе на карточке честный AggregateOffer с lowPrice: в Картинках цена тогда читается как «от N ₽». Разбор самого товарного документа — товарные страницы в Яндексе, не этот H1.

Три контура, которые обязаны совпасть

Вариация ломается не на «уникальном описании», а когда HTML, фид и разметка рассказывают разные семьи.

  1. Витрина. Человек видит, какую комбинацию кладёт в корзину. Переключатель, который не меняет адрес, должен честно менять цену, фото и наличие на том же URL. Отдельный URL обязан открываться уже с этой комбинацией, а не с «базовым» цветом.
  2. Фид. Справка Merchant Center: вариации — похожие товары, которые отличаются цветом и размером (одежда) или памятью, диагональю, процессором и графикой (электроника). Каждая вариация — отдельный товар со своим id. Одинаковый item_group_id склеивает семью. Родительский артикул, если нужен, ставят в item_group_id, а не выгружают третьей карточкой. Для бесплатных товарных объявлений поле группы обязательно у всех вариаций. Кабинет фида — соседний H1, сюда его чек-лист не тащим.
  3. Разметка. Search Central: группа помечается ProductGroup с productGroupID, variesBy и hasVariant (или обратной связью isVariantOf). У каждой вариации свой sku. На одной странице со свитчем разметка не обязана переписываться при каждом клике: в официальном примере она описывает группу и офферы сразу. Поля schema — соседний URL кластера, не повод клеить скрытый JSON с чужой ценой.

Если в HTML один канон, а в фиде девять независимых id без item_group_id, Google показывает девять карточек одной футболки. Если в фиде семья склеена, а на сайте у каждого размера свой индексируемый title «купить кроссовки», Поиск получает девять тонких документов и один вранный сниппет.

Что вариацией не является

  • Комбинация фильтра «бренд + цвет + наличие» на листинге. Это витрина категории, её индекс разбирают фильтры и фасеты.
  • Новое поколение или другая линейка с своим артикулом производителя. Это соседняя модель, не item_group_id.
  • Нулевой остаток одного размера на общем каноне. Кончился 42-й — не плодите отдельный noindex-URL; состояние документа — на товарах без наличия.
  • Персонализация и гравировка. Merchant Center держит для них отдельные поля (is_bundle, описание «customized»), это не размерный ряд.

Вариация — семья офферов одной модели. Фильтр — срез витрины. Новая модель — другой товар. Если путаете три, индекс либо дублирует карточку, либо прячет единственный живой SKU.

Где CMS плодит мусор

WooCommerce variable product часто отдаёт ?attribute_pa_color= как отдельный 200. Если каноникал не схлопнут на модель, робот обходит все комбинации атрибутов. OpenCart опции с ЧПУ без спроса делают то же. Битрикс по свойствам инфоблока умеет построить URL на каждую пару «цвет+размер», хотя на витрине это один переключатель.

Проверка короткая. Откройте модель в инкогнито и переключите цвет: меняется ли адрес, title, цена, наличие и главное фото. Сверьте этот адрес с id и link в фиде и с offers.url в JSON-LD. Потом снимите выдачу по модели и по «модель + цвет». Если в топе дефолтный цвет, а запрос называл другой — у комбинации нет своего документа, либо каноникал его съел.

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

Ограничение. Универсального правила «цвет всегда отдельно, размер никогда» нет: смотрите язык запроса и то, что реально кладут в корзину. Процент «правильных» вариаций в чужом каталоге сюда не переносим. Кабинет Merchant Center и Яндекс Товары — отдельные URL, их не подменяем чек-листом группы.

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

Нужен ли отдельный URL на каждый размер одежды?

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

Можно ли выгрузить в фид только родительский артикул?

Нет. Merchant Center просит уникальный id на каждую вариацию и общий item_group_id. Родителя отдельным товаром не отдают: его значение как раз и ставят в группу.

Если переключатель не меняет адрес, как отдать цену в поиск?

На одном URL честно покажите текущий оффер и, если офферов несколько, вилку цены. В Яндексе это AggregateOffer с lowPrice. В разметке Google — ProductGroup с вложенными hasVariant, у каждого свой offers.url, даже если путь отличается только query.

Чем вариация отличается от фильтра «красный» на категории?

Вариация принадлежит одному артикулу и корзине. Фильтр собирает много SKU на листинге. Индексировать срез «красные кроссовки» — решение витрины, не семьи одной модели.