Seu carrinho está vazio no momento!

Olá, turma! 👋 Sejam muito bem-vindos à nossa Aula 33 do curso “Loja Shopify do Zero ao Avançado”!
Estou super animado com o que vamos explorar hoje. Nas últimas aulas, mergulhamos fundo na estrutura do tema, personalização com HTML, CSS e JavaScript, e começamos a criar nossos primeiros blocos dinâmicos. Vocês já estão desenvolvendo um olhar de “engenheiro” para a arquitetura de uma loja online.
Hoje, vamos elevar o nível da nossa organização e eficiência. Sabe aquela sensação de repetir o mesmo código várias vezes em lugares diferentes da loja? Aquela imagem de produto, um botão estilizado, ou até mesmo um bloco de texto que aparece em diversas páginas? Chegou a hora de dar um basta na repetição!
Nesta aula, vamos aprender a criar snippets reutilizáveis e a utilizar includes inteligentes no Shopify. Isso não só vai deixar seu código muito mais limpo e organizado, como também vai otimizar o tempo de desenvolvimento e a manutenção da sua loja. Preparem-se para dar um salto na qualidade do seu código! 💪
—
Aula 33 – Loja Shopify do Zero ao Avançado: Criando snippets reutilizáveis e includes inteligentes
📚 O que você vai aprender nesta aula
Ao final desta aula, você será capaz de:
- Compreender o conceito e a importância dos snippets no desenvolvimento de temas Shopify.
- Identificar cenários onde a criação de snippets é benéfica para a reutilização de código.
- Criar seus próprios arquivos de snippet no painel administrativo do Shopify.
- Utilizar a tag Liquid
renderpara incluir snippets em diferentes partes do seu tema. - Passar parâmetros dinâmicos para seus snippets, tornando-os flexíveis e adaptáveis.
- Diferenciar o uso de
rendereinclude(legado) e entender suas implicações. - Aplicar boas práticas na organização e nomeação de snippets para um código mais limpo e manutenível.
- Otimizar seu fluxo de trabalho e a performance do tema através da modularização do código.
🔗 Conectando com aulas anteriores
Nas aulas anteriores, especialmente quando trabalhamos com a personalização de páginas de produto e coleção, vocês devem ter notado que certas partes do código se repetiam. Lembram-se de quando estávamos estilizando o card de produto, ou talvez um botão de “Adicionar ao Carrinho” que queríamos usar em várias seções? 🤔
Vimos a estrutura básica de pastas como sections/, templates/, layout/ e como cada uma delas serve a um propósito específico. Até agora, se precisássemos de um elemento repetitivo, talvez tivéssemos que copiar e colar o código em diferentes arquivos. Isso funciona, mas é a receita para dores de cabeça no futuro:
- Dificuldade de manutenção: Se você precisar mudar algo nesse elemento, terá que fazer a alteração em todos os lugares onde ele foi copiado.
- Código inchado: Muita repetição torna o código mais longo e difícil de ler.
- Risco de erros: Maior chance de esquecer uma alteração em algum lugar ou introduzir inconsistências.
Hoje, vamos resolver esses problemas de uma vez por todas, aplicando o princípio DRY (Don’t Repeat Yourself). Vamos transformar esses blocos de código repetitivos em componentes inteligentes e reutilizáveis, usando os famosos snippets do Shopify. Preparados para deixar nosso código elegante e profissional? ✨
📖 Conteúdo Principal
O que são Snippets no Shopify?
Em termos simples, snippets são pequenos arquivos .liquid que contêm blocos de código HTML, CSS (inline ou referenciado), e Liquid que podem ser reutilizados em várias partes do seu tema Shopify. Pense neles como “funções” ou “componentes” do seu tema.
Eles vivem na pasta snippets/ do seu tema e são uma ferramenta poderosa para modularizar e organizar seu código.
Por que usar Snippets?
1. Reutilização de Código (DRY): O principal benefício. Você escreve o código uma vez e o usa quantas vezes quiser.
2. Organização e Modularidade: Divide o seu tema em partes menores e mais gerenciáveis, tornando-o mais fácil de entender e navegar.
3. Manutenção Facilitada: Se um elemento precisa ser atualizado, você muda apenas o snippet correspondente, e a alteração se reflete em todos os lugares onde ele é usado. Menos trabalho, menos chance de erros!
4. Legibilidade do Código: Seus arquivos section e template ficam mais limpos e focados em sua lógica principal, pois os detalhes de componentes menores são encapsulados nos snippets.
5. Desenvolvimento Mais Rápido: Uma vez que você tem uma biblioteca de snippets, pode montar novas seções ou páginas rapidamente, como blocos de LEGO.
Como criar um Snippet
Criar um snippet é um processo simples:
1. Acesse o Editor de Código do Tema:
- No admin da Shopify, vá em
Loja Virtual > Temas. - Ao lado do seu tema ativo, clique em
Ações > Editar código.
2. Crie um Novo Snippet:
- Na barra lateral esquerda, na seção
Snippets, clique emAdicionar um novo snippet. - Dê um nome descritivo ao seu snippet (ex:
product-card,custom-button,social-icon). Nomes de snippets geralmente usam hífens (-) para separar palavras. - O nome completo do arquivo será
nome-do-snippet.liquid.
Exemplo: Se você criar um snippet chamado product-card, o arquivo será snippets/product-card.liquid.
Como incluir um Snippet: A tag render
Para usar um snippet que você criou, você precisa “incluí-lo” em outro arquivo Liquid (como uma seção, um template ou até mesmo outro snippet). A maneira moderna e recomendada de fazer isso é com a tag render:
{% render 'nome-do-snippet' %}
Exemplo: Se você criou snippets/product-card.liquid, para exibi-lo em uma seção, você usaria:
{% render 'product-card' %}
O Shopify vai procurar por product-card.liquid dentro da pasta snippets/ e inserir o conteúdo desse arquivo no local onde a tag render foi chamada.
Passando Parâmetros para Snippets (with e for)
Aqui é onde a mágica dos snippets realmente acontece! Raramente um snippet será um pedaço de código estático. Na maioria das vezes, você vai querer que ele exiba informações diferentes dependendo de onde e como ele é chamado. Para isso, precisamos passar dados (parâmetros) para o snippet.
A tag render oferece o argumento with para passar um objeto ou um hash de variáveis para o snippet:
{% render 'nome-do-snippet', with objeto %}
{% render 'nome-do-snippet', with variavel_local as variavel_no_snippet %}
{% render 'nome-do-snippet', param1: 'valor1', param2: 'valor2' %}
Detalhe importante sobre render:
Ao usar render, o snippet é executado em um escopo isolado. Isso significa que as variáveis do arquivo que está chamando o snippet NÃO estão automaticamente disponíveis dentro do snippet. Você precisa passá-las explicitamente. Essa é uma das principais vantagens do render sobre o include (que veremos logo), pois evita conflitos de nomes de variáveis e torna o snippet mais previsível e independente.
Exemplo Prático: Card de Produto Dinâmico
Vamos supor que temos um snippet product-card.liquid e queremos que ele exiba um produto específico.
1. Conteúdo do snippet snippets/product-card.liquid:
{# snippets/product-card.liquid #}
{% comment %}
Este snippet exibe um card de produto.
Ele espera uma variável 'card_product' contendo um objeto produto.
{% endcomment %}
{% assign current_product = card_product | default: product %} {# Fallback para 'product' caso não seja passado #}
{% if current_product %}
{% if current_product.featured_image %}
alt="{{ current_product.featured_image.alt | escape }}"
loading="lazy">
{% else %}

{% endif %}
{{ current_product.title }}
{% if current_product.compare_at_price > current_product.price %}
{{ current_product.price | money }}
{{ current_product.compare_at_price | money }}
{% else %}
{{ current_product.price | money }}
{% endif %}
{% endif %}
/ Estilos básicos para o card de produto /
.product-card {
border: 1px solid #eee;
padding: 15px;
text-align: center;
margin-bottom: 20px;
background-color: #fff;
border-radius: 8px;
box-shadow: 0 2px 5px rgba(0,0,0,0.05);
}
.product-card a {
text-decoration: none;
color: #333;
display: block;
}
.product-card img {
max-width: 100%;
height: auto;
margin-bottom: 10px;
border-radius: 4px;
}
.product-card__title {
font-size: 1.2em;
margin: 10px 0;
color: #007bff;
}
.product-card__price {
font-size: 1.1em;
font-weight: bold;
color: #555;
margin-bottom: 15px;
}
.product-card__price--sale {
color: #dc3545; / Vermelho para preço de oferta /
margin-right: 8px;
}
.product-card__price--compare {
color: #888;
text-decoration: line-through;
font-weight: normal;
font-size: 0.9em;
}
.product-card__button {
background-color: #28a745;
color: white;
border: none;
padding: 10px 15px;
border-radius: 5px;
cursor: pointer;
font-size: 1em;
transition: background-color 0.3s ease;
}
.product-card__button:hover {
background-color: #218838;
}
Neste snippet, estamos esperando uma variável chamada card_product. Se ela não for passada, usamos product como fallback (útil em contextos onde product já está disponível).
2. Chamando o snippet em uma seção (ex: sections/featured-collection.liquid):
Para exibir uma lista de produtos de uma coleção destacada, você iteraria sobre collection.products e chamaria o snippet para cada um:
{# sections/featured-collection.liquid #}
{{ section.settings.title }}
{% for product in collection.products limit: section.settings.limit %}
{% render 'product-card', card_product: product %}
{% endfor %}
{% schema %}
{
"name": "Coleção Destacada",
"settings": [
{
"type": "text",
"id": "title",
"label": "Título",
"default": "Nossos Produtos"
},
{
"type": "collection",
"id": "collection",
"label": "Coleção"
},
{
"type": "range",
"id": "limit",
"min": 1,
"max": 12,
"step": 1,
"label": "Produtos para exibir",
"default": 4
}
],
"presets": [
{
"name": "Coleção Destacada",
"category": "Produtos"
}
]
}
{% endschema %}
.product-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 20px;
}
.featured-collection {
padding: 40px 0;
text-align: center;
}
.featured-collection h2 {
font-size: 2.5em;
margin-bottom: 30px;
color: #333;
}
Observe a linha: {% render 'product-card', card_product: product %}. Aqui estamos passando o objeto product da iteração atual para o snippet product-card, mas renomeando-o para card_product dentro do escopo do snippet. Isso garante clareza e evita conflitos.
Diferença entre render e include (Legado)
Você pode encontrar a tag include em temas mais antigos ou em documentações mais antigas. Embora ainda funcione, render é a abordagem recomendada para novos desenvolvimentos e para refatorar código existente.
| Característica | {% render 'snippet-name', param: value %} | {% include 'snippet-name', param: value %} |
| :————— | :————————————————————————- | :——————————————————————————– |
| Escopo | Isolado. As variáveis do arquivo chamador não estão disponíveis no snippet, a menos que sejam passadas explicitamente. | Compartilhado. As variáveis do arquivo chamador estão disponíveis no snippet, o que pode levar a efeitos colaterais inesperados. |
| Parâmetros | Usa with ou key: value. O snippet acessa os parâmetros via {{ snippet_param_name }}. | Acessa variáveis passadas diretamente. Variáveis globais/locais do chamador também são acessíveis. |
| Performance | Geralmente melhor, pois o escopo isolado permite otimizações internas. | Pode ser ligeiramente mais lento devido à necessidade de gerenciar o escopo compartilhado. |
| Melhores Práticas | Recomendado para modularidade e evitar conflitos. | Legado, não recomendado para novos desenvolvimentos. Usar apenas se necessário em temas antigos. |
Minha recomendação como professor: Sempre que possível, use render. Ele força você a pensar sobre as entradas e saídas do seu componente, levando a um código mais robusto e fácil de depurar. include é uma armadilha que pode levar a bugs difíceis de rastrear.
Boas Práticas e Dicas de Otimização
- Nomes Descritivos: Nomeie seus snippets de forma clara e concisa (ex:
product-card,section-header,icon-svg). - Foco Único: Cada snippet deve ter uma responsabilidade única. Se um snippet começar a fazer muitas coisas, considere dividi-lo em snippets menores.
- Comentários: Adicione comentários no início do seu snippet explicando o que ele faz e quais parâmetros ele espera.
- Estrutura de Pastas (Convenção): Embora o Shopify não permita subpastas dentro de
snippets/via admin, você pode usar convenções de nomeação para simular uma estrutura, comoproduct-card-info.liquid,product-card-image.liquid. Ou, para elementos maiores e mais complexos, considere criar umasectionem vez de umsnippet. - Quando usar Snippets vs. Sections:
- Snippets: Para componentes pequenos, reutilizáveis e que não precisam de configurações de arrastar e soltar no Customizer (ex: card de produto, ícone, botão, bloco de texto simples).
- Sections: Para blocos maiores de conteúdo que o lojista pode adicionar, reordenar e configurar diretamente no Customizer (ex: banner principal, grade de produtos, carrossel de depoimentos). **Você pode e deve usar snippets dentro de sections!**
- CSS e JS nos Snippets: Você pode incluir
e
diretamente dentro de snippets se eles forem muito específicos para aquele componente. Para estilos globais ou scripts mais complexos, é melhor mantê-los nos arquivos.csse.jsdedicados do tema.
💻 Exemplos Práticos
Vamos aplicar o que aprendemos criando um snippet para um ícone de rede social. Isso é algo que frequentemente aparece em rodapés, cabeçalhos, e pode variar de cor, link e ícone.
Cenário: Precisamos de um snippet que exiba um ícone de rede social linkável.
1. Identificar o código repetido (mentalmente ou em rascunho):
Um link com um SVG dentro, talvez com uma classe para estilização.
html
Precisamos que o href, a classe do ícone e o próprio SVG sejam dinâmicos.
2. Criar o snippet snippets/social-icon.liquid:
- No admin da Shopify, vá em
Loja Virtual > Temas > Ações > Editar código. - Na pasta
Snippets, clique emAdicionar um novo snippet. - Nomeie-o como
social-icon. - Cole o seguinte código:
{# snippets/social-icon.liquid #}
{% comment %}
Este snippet exibe um ícone de rede social.
Parâmetros esperados:
- icon_name: string (ex: 'facebook', 'instagram', 'twitter')
- icon_url: string (URL para onde o ícone deve linkar)
- icon_class: string (classes CSS adicionais para o link)
{% endcomment %}
{%- assign default_class = 'social-icon' -%}
{%- assign final_class = default_class -%}
{%- if icon_class != blank -%}
{%- assign final_class = final_class | append: ' ' | append: icon_class -%}
{%- endif -%}
{%- if icon_name != blank -%}
{%- assign final_class = final_class | append: ' ' | append: 'social-icon--' | append: icon_name -%}
{%- endif -%}
{%- if icon_url != blank and icon_name != blank -%}
{% case icon_name %}
{% when 'facebook' %}
{% comment %} Exemplo de SVG simples para Facebook {% endcomment %}
{% when 'instagram' %}
{% comment %} Exemplo de SVG simples para Instagram {% endcomment %}
{% when 'twitter' %}
{% comment %} Exemplo de SVG simples para Twitter {% endcomment %}
{% else %}
{# Fallback para um ícone genérico ou texto se o nome do ícone não for reconhecido #}
{{ icon_name | capitalize }}
{% endcase %}
{% endif -%}
.social-icon {
display: inline-flex;
align-items: center;
justify-content: center;
width: 36px;
height: 36px;
border-radius: 50%;
background-color: #333;
color: white;
text-decoration: none;
margin: 0 5px;
transition: background-color 0.3s ease;
}
.social-icon svg {
width: 20px;
height: 20px;
fill: currentColor; / Usa a cor do texto do parent /
}
.social-icon:hover {
background-color: #007bff; / Exemplo de hover /
}
/ Cores específicas para ícones, se desejar /
.social-icon--facebook { background-color: #3b5998; }
.social-icon--instagram { background-color: #E1306C; }
.social-icon--twitter { background-color: #1da1f2; }
.social-icon--facebook:hover { background-color: #2e4a86; }
.social-icon--instagram:hover { background-color: #c13584; }
.social-icon--twitter:hover { background-color: #0d8ddb; }
Explicação do snippet:
- Ele recebe
icon_name,icon_urleicon_classcomo parâmetros. - Usa um
case/whenpara determinar qual SVG exibir com base emicon_name. - Aplica classes CSS para estilização e permite classes adicionais.
- Inclui um
para estilização básica que pode ser sobrescrita.
3. Chamar o snippet em diferentes locais (ex: no seu sections/footer.liquid):
Abra o arquivo sections/footer.liquid (ou crie um se não existir para o seu tema customizado).
{# sections/footer.liquid #}
{% schema %}
{
"name": "Rodapé Personalizado",
"settings": [],
"presets": [
{
"name": "Rodapé Padrão"
}
]
}
{% endschema %}
.site-footer {
background-color: #222;
color: #eee;
padding: 30px 20px;
text-align: center;
font-family: Arial, sans-serif;
}
.site-footer__socials h3 {
margin-bottom: 20px;
color: white;
font-size: 1.5em;
}
.social-icons-wrapper {
margin-bottom: 20px;
}
.site-footer__copyright p {
font-size: 0.9em;
color: #bbb;
}
Screenshot Simulado (Admin Shopify):
Imagine que você está na tela de "Editar código" do seu tema.
Passo 1: Criando o Snippet social-icon
📁 layout/
📁 sections/
📁 templates/
📁 assets/
📁 config/
📁 locales/
📁 snippets/
└─ + Adicionar um novo snippet
(Caixa de texto para nomear o snippet)
Nome do snippet: social-icon
[ Criar snippet ]
Após criar, o arquivo snippets/social-icon.liquid abrirá para você colar o código.
Passo 2: Editando sections/footer.liquid
📁 layout/
📁 sections/
└─ footer.liquid <-- Clicar aqui para editar
📁 templates/
📁 assets/
📁 config/
📁 locales/
📁 snippets/
└─ social-icon.liquid
Então, dentro do editor de footer.liquid, você colaria o código de chamada do snippet.
Resultado Esperado:
No frontend da sua loja, o rodapé agora exibiria os ícones do Facebook, Instagram, Twitter e a palavra "Youtube" (como fallback, pois não definimos um SVG para ele), todos estilizados e clicáveis, utilizando o mesmo bloco de código do snippet social-icon.liquid. Se você quisesse mudar o estilo de todos os ícones, bastaria editar o CSS dentro do social-icon.liquid ou no seu arquivo CSS principal. Mágico, não é? ✨
🎯 Exercícios e Desafios
Chegou a hora de colocar a mão na massa e solidificar esse conhecimento!
1. Desafio Fácil: Botão Reutilizável
- Crie um snippet chamado
custom-button.liquid. - Ele deve aceitar dois parâmetros:
button_text(o texto do botão) ebutton_url(o link para onde o botão leva). - Adicione um estilo básico ao botão (fundo, cor do texto, padding, border-radius).
- Chame este snippet em duas seções diferentes do seu tema (ex: na
sections/header.liquide em uma novasections/promo-banner.liquidque você pode criar).
2. Desafio Médio: Item de Lista de Informações
- Muitas vezes, no rodapé, temos listas de links (ex: "Sobre Nós", "Contato", "Política de Privacidade").
- Crie um snippet chamado
footer-link-item.liquid. - Este snippet deve aceitar
link_textelink_urlcomo parâmetros e renderizar um.- ...
- No seu
sections/footer.liquid, substitua uma das listas de links por chamadas a este novo snippet.
3. Desafio Avançado: Bloco de Destaque com Ícone e Texto
- Imagine uma seção na sua homepage que mostra 3 "características" da sua loja (ex: "Frete Grátis", "Atendimento Premium", "Devolução Fácil").
- Crie um snippet chamado
feature-block.liquid. - Este snippet deve aceitar
feature_icon(pode ser o nome de um SVG, como no exemplo dos sociais),feature_titleefeature_description. - Crie uma nova seção chamada
sections/features-grid.liquid. - Nesta seção, crie as
settingspara 3 blocos de características, onde cada bloco terá campos para o ícone (texto), título e descrição. - Dentro da
sections/features-grid.liquid, use umforloop para iterar sobre os blocos configurados e, para cada bloco, renderize seufeature-block.liquidpassando os dados do bloco. - Adicione um CSS responsivo para que os 3 blocos se organizem bem em diferentes telas.
Não se preocupem em fazer tudo perfeito de primeira. O importante é praticar a identificação de código repetitivo e a passagem de parâmetros. Se tiverem dúvidas, revisitem o conteúdo ou pesquisem na documentação oficial do Shopify! 📚
📝 Resumo da Aula
Ufa! Que aula produtiva, não é mesmo? Hoje, fizemos um upgrade significativo na forma como abordamos a estrutura do nosso código Shopify:
- Descobrimos que snippets são blocos de código Liquid reutilizáveis que vivem na pasta
snippets/. - Aprendemos que eles são essenciais para manter nosso código DRY (Don't Repeat Yourself), tornando-o mais organizado, fácil de manter e depurar.
- Dominamos a tag
{% render 'nome-do-snippet', parametro: valor %}, a forma moderna e preferida de incluir snippets e passar dados para eles. - Entendemos a importância de passar parâmetros explicitamente para snippets usando
with(oukey: value), aproveitando o escopo isolado querenderproporciona. - Diferenciamos
renderdeinclude, optando pelo primeiro para evitar efeitos colaterais e garantir a modularidade. - Reforçamos boas práticas como nomear snippets de forma descritiva e focar em uma única responsabilidade por snippet.
Com o uso inteligente de snippets, sua loja Shopify não só terá um código mais limpo e elegante, mas você também será um desenvolvedor muito mais eficiente. Parabéns por essa conquista! 👏
🚀 Preparação para próxima aula
Agora que já sabemos como criar componentes reutilizáveis, o próximo passo lógico é torná-los ainda mais poderosos e configuráveis para o lojista!
Na próxima aula, vamos mergulhar no mundo dos Metafields e Propriedades do Tema (Theme Settings). Aprenderemos:
- O que são Metafields e como eles permitem armazenar informações adicionais para produtos, coleções, páginas, etc., que o Shopify não cobre por padrão.
- Como criar e gerenciar Metafields diretamente no admin.
- Como acessar e exibir dados de Metafields no seu tema usando Liquid.
- Como usar Theme Settings para criar opções de configuração globais ou por seção que o lojista pode ajustar sem tocar no código (como cores, fontes, links de redes sociais, etc.).
Combinando snippets com Metafields e Theme Settings, você terá a capacidade de construir temas extremamente flexíveis e poderosos, onde quase tudo pode ser configurado sem a necessidade de intervenção do desenvolvedor. Vai ser uma aula prática e super útil! Fiquem ligados! 💡
📚 Recursos Adicionais
- Documentação Oficial Shopify -
rendertag: - Shopify Developer Docs - render
- Documentação Oficial Shopify -
includetag (para referência): - Shopify Developer Docs - include
- Artigo sobre boas práticas com Liquid e Snippets:
- Procure por "Shopify Liquid best practices snippets" no Google para diversos artigos de blogs e comunidades.
Lembrem-se, a prática leva à perfeição. Experimentem, refatorem seu próprio código e explorem como os temas padrão do Shopify usam snippets! Até a próxima! 👋