Sistema de temas
Variáveis
Todos os dados da loja disponíveis nos templates.
Estas variáveis existem em todos os templates, exceto product, que só existe na rota de produto.
| Variável | Conteúdo |
|---|---|
store |
Dados públicos da loja |
user |
Visitante logado |
social |
Links das redes sociais |
options |
Opções que afetam a página |
dates |
Data e hora atuais |
route |
Caminho e parâmetros da rota |
catalog |
Categorias, produtos e variantes |
product |
Produto completo, só em /product/:id |
store#
| Campo | Conteúdo |
|---|---|
store.name |
Nome da loja |
store.description |
Descrição |
store.icon |
Logo, ou vazio |
store.banner |
Banner, ou vazio |
user#
| Campo | Conteúdo |
|---|---|
user.name |
Nome do cliente logado. Sem nome no cadastro, usa o início do e-mail. Para visitante, nil. |
user.email |
E-mail do cliente logado. Para visitante, nil. |
É assim que se detecta login:
{% if user.name %}
<a href="/account">Olá, {{ user.name | split: " " | first }}</a>
{% else %}
<a href="/login">Entrar</a>
{% endif %}social#
social.facebook, social.instagram, social.twitter, social.youtube, social.whatsapp, social.telegram e social.discord. Cada um é nil quando não foi preenchido.
options#
| Campo | Conteúdo |
|---|---|
options.store_status |
true com a loja aberta. Falso com Status da Loja desligado. |
options.force_auth |
true se a compra exige login. É aplicado no pedido, não na navegação: serve para avisar o visitante. |
options.feedback_status |
true se as avaliações estão ligadas. |
dates#
Valores no horário de Brasília, calculados no momento do render.
| Campo | Exemplo |
|---|---|
dates.date |
A data e hora completas |
dates.year |
2026 |
dates.month |
10 |
dates.day |
31 |
dates.time.hours |
15 |
dates.time.minutes |
4 |
dates.time.seconds |
5 |
© {{ dates.year }} {{ store.name }}
{% if dates.time.hours < 12 %}Bom dia{% else %}Boa tarde{% endif %}route#
| Campo | Conteúdo |
|---|---|
route.path |
Caminho da página, como /category/cursos |
route.params |
Parâmetros da rota. Em /category/:id, use route.params.id. |
catalog#
| Campo | Conteúdo |
|---|---|
catalog.categories |
Categorias sem subcategorias, ou seja, as que têm produtos diretamente |
catalog.categories_all |
Todas as categorias, com sub_categories |
catalog.products |
Produtos públicos |
catalog.variants |
Todas as variantes dos produtos públicos |
Itens privados, inativos e de categoria privada ficam de fora. Produto com ocultar quando esgotado também sai quando o estoque zera. O catálogo traz até 2000 produtos, e os demais continuam abrindo pela própria página.
Categoria#
| Campo | Conteúdo |
|---|---|
id, name, slug |
Identificação |
sub_title |
Subtítulo |
icon, banner |
Imagens, ou vazio |
position |
Ordem |
parent_category |
ID da categoria pai, ou nil |
createdAt |
Data de criação |
products |
Produtos da categoria |
sub_categories |
Só em categories_all: as subcategorias |
Produto em catalog#
| Campo | Conteúdo |
|---|---|
id, name, slug |
Identificação |
highlight |
Produto em destaque |
images |
Lista de URLs |
price |
Preço |
comparison |
Preço de comparação, ou nil |
quantity.min, quantity.max |
Quantidade por compra. Sem limite, max é 100000. |
stock_amount |
Estoque. Sem limite, é 999999. |
type |
series para linhas, texto para texto |
category_id |
ID da categoria, ou vazio |
position |
Ordem entre os destaques, ou nil |
automatic |
Entrega automática |
createdAt |
Data de criação |
tags |
Lista com id, name, color e icon |
variants |
Variantes do produto |
variants_values.min, variants_values.max |
Variante mais barata e mais cara, ou nil |
Variante#
id, name, price, comparison, quantity, stock_amount, icon, images, type, category_id, position, automatic, createdAt e tags, com o mesmo sentido do produto.
Card de produto#
{% assign url = product.slug | default: product.id %}
<a href="/product/{{ url }}">
{% if product.images.size > 0 %}
<img src="{{ product.images[0] }}" alt="{{ product.name }}" loading="lazy">
{% endif %}
<h3>{{ product.name }}</h3>
{% if product.variants.size > 0 %}
<small>A partir de</small> {{ product.variants_values.min.price | money }}
{% else %}
{% if product.comparison %}<s>{{ product.comparison | money }}</s>{% endif %}
{{ product.price | money }}
{% endif %}
</a>product#
Disponível só nas rotas de produto, como /product/:id e /product/:id/:variant. O id da rota aceita o ID ou o slug do produto.
| Campo | Conteúdo |
|---|---|
id, name, slug |
Identificação |
price, comparison |
Preço e preço de comparação |
quantity.min, quantity.max |
Quantidade por compra |
stock_amount |
Estoque. Sem limite, é 999999. |
sold |
Quantidade vendida. É 0 com ocultar vendidos ligado. |
hideSold |
Ocultar vendidos |
description |
HTML da descrição. Use com | raw. |
instructions |
Instruções. Use com | raw. |
type |
variante, series ou texto |
category_id |
ID da categoria, ou vazio |
embed_video |
Link do vídeo, ou nil |
images |
Lista de URLs |
tags |
Lista com id, name, color e icon |
automatic |
Entrega automática |
variants |
Variantes, com description e sold além dos campos acima |
fields |
Campos extras pedidos antes da compra |
feedback |
Avaliações do produto |
Campos extras#
Cada item de product.fields traz id, name, description, type (texto ou numero), required, character_limit.min, character_limit.max, ref_product, ref_variant e ref_category.
Avaliações#
| Campo | Conteúdo |
|---|---|
feedback.stats.total |
Total de avaliações aprovadas |
feedback.stats.average |
Média, com uma casa |
feedback.stats.stars |
Quantidade por nota, de 1 a 5 |
feedback.reviews |
Até 50 avaliações aprovadas, das mais novas para as mais antigas |
Cada avaliação traz id, comment, star, tags, images, is_anonymous, response_staff e createdAt.
{% if options.feedback_status and product.feedback.stats.total > 0 %}
<p>{{ product.feedback.stats.average }} de 5 ({{ product.feedback.stats.total }} avaliações)</p>
{% for review in product.feedback.reviews limit: 5 %}
<blockquote>{{ review.comment }}</blockquote>
{% endfor %}
{% endif %}
