Адреса разделов и языки
Три схемы адресов, языковые префиксы и правило: ссылки берут готовыми, а не склеивают руками.
На этой странице
Адреса разделов витрины строит сам магазин. Тема их берёт готовыми, а не склеивает руками — потому что вид адреса выбирает владелец магазина, и тема, собравшая ссылку сама, сломается у половины магазинов.
Готовые адреса приходят в данных
{$product.url} {$cat.url} {$page.url}
{$brand.url} {$tag.url}
{$crumb.url} {$chip.url} {$pagination.next_url}
Так же у хлебных крошек, у чипсов фильтра, у страниц постраничной навигации и у переключателя языка. Если у сущности есть адрес — он уже в данных.
Тег {url} — для разделов без своего адреса
<a href="{url path='/search'}">Поиск</a>
<a href="{url path='/'}">На главную</a>
<a href="{url path=$shop->cartPath()}">Корзина</a>
<a href="{url path='/cart' locale='uk'}">Кошик</a>
<link rel="canonical" href="{url path='/' absolute=true}">
Тег сам добавляет языковой префикс текущего языка и приводит адрес к виду,
принятому в этом магазине. Полный адрес с доменом (absolute=true) нужен только
поисковику — для ссылок внутри сайта берите обычный путь.
Три схемы адресов
Схему выбирает владелец в настройках. Одна и та же тема должна работать при любой из них — ещё одна причина не склеивать адреса руками.
| Схема | Категория | Товар |
|---|---|---|
natural (по умолчанию) |
/телефоны/apple/ |
/телефоны/apple/iphone-15/ |
mixed |
/category/телефоны/apple/ |
/iphone-15/ |
flat |
/category/apple/ |
/product/iphone-15/ |
Канон витрины — завершающий слеш: /cart/, /телефоны/apple/. Корень —
просто /.
Языки
Витрина может работать на нескольких языках. Основной идёт без префикса, остальные — с префиксом:
/ русский (основной язык витрины)
/uk/ украинский
/en/ английский
Префикс задаётся в справочнике языков и может отличаться от кода языка: язык
uk часто получает префикс ua. Поэтому в переключателе выводят prefix или
short, а не code.
Адрес един для всех языков
Адрес (slug) товара и категории один на все языки — он лежит у самой сущности, а не в переводах. Переводится содержимое: название, описание, SEO-поля. Меняется только языковой префикс.
/telefony/iphone-15/ русская версия
/uk/telefony/iphone-15/ украинская версия — тот же адрес
Это решение магазина, и тема на него опирается: переключатель языка ведёт на ту же самую страницу, а не на главную.
Переключатель языка
{foreach $shop->locales() as $l}
<a href="{$l.url}"{if $l.active} class="is-active"{/if}
lang="{$l.code}">{$l.short}</a>
{/foreach}
Поля: code (ru), prefix (uk или ua), name (название на родном языке:
Русский, Українська, English), short (префикс заглавными), active, url.
url — путь, а не полный адрес: переключатель обязан остаться на том
домене, по которому покупатель зашёл. Магазин может работать на нескольких
доменах сразу, и подстановка «правильного» домена увела бы покупателя с того
сайта, где он находится.
Ссылки для поисковика
canonical и hreflang магазин считает сам и кладёт в $seo — тема их только
выводит:
{if $seo.canonical}<link rel="canonical" href="{$seo.canonical}">{/if}
{foreach $seo.hreflang as $code => $href}
<link rel="alternate" hreflang="{$code}" href="{$href}">
{/foreach}
Собирать их самостоятельно не нужно и не стоит: там учитываются и схема адресов, и домены витрин, и то, какие страницы вообще разрешено индексировать.
Адреса действий
Адреса, по которым браузер обращается к магазину — добавить в корзину, пересчитать
оформление, отправить отзыв, — тема не пишет в скриптах, а объявляет атрибутами
на <body>:
<body data-cart-add="/cart/add" data-cart-update="/cart/update" …>
Полный список — на странице Атрибуты data-*.
Хлебные крошки
{if $breadcrumbs}
<nav class="breadcrumbs">
{foreach $breadcrumbs as $crumb}
{if $crumb@last}
<span>{$crumb.name}</span>
{else}
<a href="{$crumb.url}">{$crumb.name}</a>
{/if}
{/foreach}
</nav>
{/if}
Крошки приходят на страницу товара, категории, бренда, метки и информационной страницы. Последний элемент — текущая страница, ссылкой его делать не нужно.