Адреси розділів і мови
Три схеми адрес, мовні префікси та правило: посилання беруть готовими, а не склеюють руками.
На цій сторінці
Адреси розділів вітрини будує сам магазин. Тема їх бере готовими, а не склеює руками — тому що вигляд адреси вибирає власник магазину, і тема, яка зібрала посилання сама, зламається у половини магазинів.
Готові адреси приходять у даних
{$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}
Крихти приходять на сторінку товару, категорії, бренда, мітки і інформаційної сторінки. Останній елемент — поточна сторінка, посиланням його робити не потрібно.