Skip to content

Exemplos práticos ​

Os exemplos abaixo usam dados disponíveis no tema e preservam a liberdade de apresentação.

Posicionar o reCAPTCHA v2 mostra o ponto de montagem nos formulários. Mostrar “Está acabando” usa uma condição de estoque no Liquid.

Uma vitrine completa ​

Criar uma vitrine reúne template JSON, section, component e CSS. Os arquivos mostrados nesse tutorial também são usados pelos testes automatizados do projeto.

Uma seção de banner ​

Acrescente a instância abaixo ao array sections da Home, preservando as outras seções. id e type aceitam letras minúsculas ASCII, números e os separadores _ ou - entre grupos alfanuméricos. O id deve ser único no template.

json
{
  "sections": [
    {
      "id": "banner-promo",
      "type": "banner-promocional"
    }
  ]
}

Crie sections/banner-promocional.liquid com o mesmo type declarado:

liquid
<section id="{{ section.id }}" aria-label="Banner promocional">
  <h2>Conheça nossa coleção</h2>
  <img src="{{ 'images/banner.webp' | asset_url }}" alt="" width="1536" height="1024" loading="lazy" decoding="async">
</section>

Este exemplo usa a imagem existente no Aura. Em outro tema, informe o caminho real de uma imagem do bundle em asset_url e ajuste suas dimensões. Textos ficam no HTML e a apresentação pode ser definida livremente em assets/theme.css. No editor, a IA cria a seção no rascunho; ela entra na loja após a publicação.

Benefícios na compra ​

Para busca e categoria, veja Consultar produtos pelo Liquid, com estoque filtrado no servidor e paginação sobre o mesmo resultado.

Exibir metas e créditos mostra um exemplo Liquid executado com dados fictícios nos testes.

Categorias no menu ​

Use o exemplo em uma section ou passe catalog explicitamente ao component do menu:

liquid
<nav aria-label="Categorias">
  {% for category in catalog.categories %}
    <a href="{{ category.url | storefront_url }}">{{ category.name }}</a>
  {% endfor %}
</nav>

A estrutura visual é livre. Para subcategorias, percorra category.children.

Categorias com imagem de capa ​

category.image é a capa cadastrada pelo lojista para representar a categoria em vitrines; pode ser null. Defina a alternativa no próprio tema, como a inicial do nome:

liquid
<div class="category-cards">
  {% for category in catalog.categories limit: 6 %}
    <a href="{{ category.url | storefront_url }}">
      {% if category.image %}
        <img src="{{ category.image.url }}" alt="" loading="lazy"
          {% if category.image.width and category.image.height %}width="{{ category.image.width }}" height="{{ category.image.height }}"{% endif %}>
      {% else %}
        <span aria-hidden="true">{{ category.name | slice: 0, 1 }}</span>
      {% endif %}
      <span>{{ category.name }}</span>
    </a>
  {% endfor %}
</div>

Na página da categoria, category.banner é o banner largo cadastrado para o topo da página. Prefira category.banner.originalUrl, pois url é a variação média:

liquid
{% if category.banner %}
  <figure class="category-banner">
    <img src="{{ category.banner.originalUrl }}" alt="">
  </figure>
{% endif %}

Em product.categories, image e banner são sempre null; localize a categoria pelo id em catalog.categories quando precisar da imagem.

Logo com alternativa de texto ​

liquid
<a href="{{ '/' | storefront_url }}">
  {% if shop.logo %}
    <img src="{{ shop.logo.url }}" alt="{{ shop.name }}">
  {% else %}
    <span>{{ shop.name }}</span>
  {% endif %}
</a>

shop.logo é a identidade global da loja. Para imagens próprias do tema, consulte asset_url.

Páginas institucionais no rodapé ​

liquid
<nav aria-label="Informações da loja">
  {% for item in content.pages %}
    <a href="{{ '/pagina/' | append: item.slug | storefront_url }}">{{ item.title }}</a>
  {% endfor %}
</nav>

Ao colocar esse trecho em um component, passe content: content na chamada render.

Paginação ​

liquid
{% if listing.pagination.hasNextPage %}
  <a href="{{ listing.pagination.nextUrl }}">Próxima página</a>
{% endif %}

URLs de paginação já vêm prontas, incluindo filtros e namespace da prévia. Não monte a query novamente nem aplique o prefixo duas vezes.

Categoria e busca com filtros compactos ​

Os temas oficiais oferecem uma barra com Filtrar, quantidade e ordenação. As opções começam recolhidas; os filtros aplicados e a ação de limpeza continuam visíveis abaixo da barra. O painel abre no lugar, com rolagem própria, e os campos ficam em uma coluna no celular. A ordenação pode ocupar uma segunda linha.

A interação e a preservação da consulta estão descritas na referência de categoria e busca. Essa é a apresentação dos temas oficiais, não uma exigência para outros layouts.

Ao compor sua listagem, mantenha os filtros ativos fora do elemento recolhido. Este trecho ilustra a remoção com a URL fornecida pelo servidor:

liquid
{% if listing.activeFilters.size > 0 %}
  <nav aria-label="Filtros ativos">
    {% for filter in listing.activeFilters %}
      <a href="{{ filter.removeUrl }}">Remover {{ filter.label }}</a>
    {% endfor %}
    <a href="{{ listing.clearFiltersUrl }}">Limpar filtros</a>
  </nav>
{% endif %}

Na prévia, confira categoria e busca: abra e feche pelo acionador, use Tab e Escape, aplique filtros, altere a ordenação, avance a página e remova um filtro. Repita com lista vazia e no celular. A busca deve conservar o termo e as URLs precisam permanecer na mesma sessão de prévia. Para lojas instaladas, siga o fluxo de revisão e publicação; atualizar o bundle oficial não reescreve uma revisão já publicada.

Informações adicionais do produto ​

Marca, modelo, garantia e entrega estão em product.specifications, com os títulos personalizados no painel. Use este trecho na section do produto:

liquid
{% if product.specifications.size > 0 %}
  <dl>
    {% for specification in product.specifications %}
      <div>
        <dt>{{ specification.label }}</dt>
        <dd>{{ specification.value }}</dd>
      </div>
    {% endfor %}
  </dl>
{% endif %}

A lista já omite campos vazios. O Liquid escapa títulos e valores; não use raw. Entrega é um texto informativo do produto, e a cotação do frete continua por CEP. A apresentação entra na loja após publicar a revisão do tema.

Quando a loja exige login para preços, use product.priceVisible e os valores fornecidos pelo servidor. A sessão válida libera os preços nas páginas públicas; a prévia permanece sem autenticação de comprador. Não tente autorizar preços usando dados fornecidos pelo tema.

Pagamento com PicPay ​

Na confirmação autorizada do pedido, o mesmo runtime oferece a Carteira PicPay quando o cadastro da loja está habilitado. O tema pode posicionar a região do link com data-payment-wallet; sem ela, o runtime cria o container.

liquid
{% if confirmation.orderId %}
<section data-payment-pix data-payment-order="{{ confirmation.orderId | escape }}">
  <p data-payment-message role="status" aria-live="polite"></p>
  <form data-payment-form hidden>
    <fieldset data-payment-options><legend>Forma de pagamento</legend></fieldset>
    <button data-payment-start type="submit" disabled>Continuar</button>
  </form>
  <p data-payment-total></p>
  <div data-payment-wallet hidden></div>
  <div data-payment-details hidden>
    <label>Código Pix <textarea data-payment-code readonly></textarea></label>
  </div>
  <button data-payment-check type="button" hidden>Consultar pagamento</button>
</section>
{% endif %}

O link abre o checkout PicPay em outra aba e esta página acompanha o resultado. Não é um código Pix Copia e Cola. Não coloque tokens ou URLs fixas de cobrança no Liquid, nem confirme o pedido por retorno do navegador. Prévia não cria pagamentos. Consulte o contrato do runtime para os demais métodos e o fluxo de publicação para aplicar CSS.

Temas V3 · Liquid estrutura, CSS desenha, JSON compõe.