Como funciona a edição de layout manualmente via HTML

Guia de recursos do layout Sass (catalogo)

Recursos Geral (SEO, token de visitas e outros)

SEO basico e avancado

  • SEO geral de pagina:

    {{searchMetaDescription}}, {{searchCanonicalPath}}, {{siteNameJson}}.

  • SEO de organizacao/loja:

    {{seoStoreJsonLd}} e {{seoWebsiteJsonLd}}.

  • SEO de produto:

    {{productSchemaJsonLdRaw}} e {{productSchemaHasJsonLd}}.

Padrão como as tags de SEO podem ser usadas:

<title>{{searchQueryLabelTitle}} | {{mainData.siteName}}</title>

<meta name="description" content="{{searchMetaDescription}}" />

<link rel="canonical" href="{{searchCanonicalPath}}" />


Formatação padrão para schema de Store em JSON

{{#if seoStoreJsonLd}}

<script type="application/ld+json">{{seoStoreJsonLd}}</script>

{{/if}}


Todos os recursos de mainData:

PlaceholderExemplo de saída no HTML
{{mainData.siteName}}TechShop
{{mainData.siteDomain}}loja.exemplo.com
{{mainData.configPath}}/catalogo
{{mainData.seoOrganizationName}}TechShop Comércio Ltda
{{mainData.seoAuthor}}Equipe TechShop
{{mainData.seoOrganizationUrl}}www.techshop.com.br (URL “lógica” do cadastro; em JSON-LD de produto o código prefixa https://)
{{mainData.seoBaseHref}}https://loja.exemplo.com/catalogo/
{{mainData.seoOrganizationLogo}}https://cdn.exemplo.com/logo.png
{{mainData.seoOrganizationLogoWidth}} / Height140 / 70
{{mainData.seoCoordinates}}-23.5505;-46.6333 (se preenchido)
{{mainData.seoRegion}}BR-SP
{{mainData.seoState}}, seoCountry, endereço, CEP, telefone, horáriostexto cadastrado, ex.: São Paulo, Brasil, Rua X, 100, 01310-100, 11999999999, Mo-Fr 09:00-18:00


Token de visitas, dados globais e busca

  • Token para telemetria/visitaçãoo:

    {{visitsToken}}

  • Dados globais de loja:

    {{mainData.*}}

  • Termos mais buscados:

    {{searchTermsFirst}}, {{searchTermsMore}}, {{searchTermsHasMore}}.


Exemplo de uso do token e exibição de todos os termos mais pesquisados, caso haja:

<input type="hidden" id="visitsToken" value="{{visitsToken}}" />

{{#if searchTermsFirst}}

{{#each searchTermsFirst}}

<a href="{{href}}">{{searchUserQuery}}</a>

{{/each}}

{{/if}}

Todos os recursos de buscas

PlaceholderExemplo de saída
{{searchQueryLabelRaw}}notebook gamer (ou string mais longa se houver catName, faixa de preço, filtros, marca — ver sassBuildSearchQueryLabelFromGet)
{{searchQueryLabelTitle}}Notebook Gamer
{{searchMetaDescription}}Resultados de Notebook Gamer aqui em TechShop Comércio Ltda (padrão em buildSassPayloadForSearchData)
{{searchCanonicalPath}}Se existir REQUEST_URI válido: /catalogo/q.php?m=search&q=notebook+gamer; senão, path montado com configPath + http_build_query($get)


Blocos e comandos gerais do template

  • Placeholders: {{chave}} e {{objeto.campo}}.
  • Condicionais: {{#if ...}}, {{else}}, {{#unless ...}}.
  • Repeticao: {{#each ...}} com {{item.*}}, {{itemIndex}}, {{itemKey}}.
  • Inclusao de bloco: <iBlock bw="..." />.


Dados formatados como JSON

{{listOrganizationJsonLd}} / {{seoStoreJsonLd}} / {{listStoreJsonLd}}

São uma string JSON (não escapar de novo com {{ — nos templates usa-se {{{...}}}).

Organization (listagem/busca) — formato gerado por sassEncodeListOrganizationJsonLdString:

{"@type":"Organization","@context":"http://schema.org","name":"TechShop Comércio Ltda","url":"https://www.techshop.com.br","logo":{"@type":"ImageObject","url":"https://cdn.exemplo.com/logo.png","width":"140","height":"70"}}

Store (seoStoreJsonLd / listStoreJsonLd) — só é não vazio se seoOrganizationHoursWeek estiver preenchido (sassEncodeStoreJsonLdString). Exemplo típico:

{"@context":"https://schema.org","@type":"Store","address":{"@type":"PostalAddress","addressLocality":"São Paulo","addressRegion":"BR-SP","postalCode":"01310-100","streetAddress":"Rua X, 100"},"name":"TechShop Comércio Ltda","openingHours":["Mo-Fr 09:00-18:00","Sa 09:00-13:00"],"telephone":"11999999999","url":"https://loja.exemplo.com","image":"https://cdn.exemplo.com/logo.png"}

Se não houver horário de semana, a string fica vazia e o {{#if seoStoreJsonLd}} não imprime o <script>.

Home: “Organization” inline (não é uma variável seoWebsiteJsonLd)

O template emite JSON literal com valores de mainData, por exemplo:

<script data-schema="Organization" type="application/ld+json"> { "@type":"Organization", ... "name":"TechShop Comércio Ltda", ... }</script>

Todos os recursos JSON, incluindo produtos

PlaceholderO que éExemplo ilustrativo
{{siteNameJson}}Nome do site como literal JSON (uso em JS)."Minha Loja"
{{searchUiBootstrapJson}}JSON da UI de busca (ex.: texto inicial da query).{"typingQuery":"notebook"}
{{seoStoreJsonLd}}JSON-LD Store (schema.org); vazio se faltar horário de semana no SEO.{"@context":"https://schema.org","@type":"Store",…}
{{listOrganizationJsonLd}}JSON-LD Organization (listagem / busca).{"@type":"Organization","@context":"http://schema.org",…}
{{listStoreJsonLd}}Mesmo encoder que seoStoreJsonLd (Store).Igual ao Store acima ou vazio
{{productSeoOrganizationJsonLdRaw}}JSON-LD Organization no <head> do produto.{"@type":"Organization",…}
{{productSeoStoreJsonLdRaw}}JSON-LD Store no produto.{"@type":"Store",…} ou vazio
{{productSchemaJsonLdRaw}}JSON-LD Product (e Offer etc.); vazio se preço zero ou preview rápido.{"@context":"https://schema.org/","@type":"Product",…}
{{productsJson}}Lista de produtos serializada em JSON.[{"id":1,"title":"…"},…]
{{priceLabelDataJson}}Regras de etiqueta de preço (parcelas, riscado, etc.).{"pricelabelInstallments":10,…}
{{paymentDiscountsJson}}Descontos por forma de pagamento.{"0":12,"1":6}
{{categoryDiscountsJson}}Descontos por categoria.{"0":{"categorydiscountValue":8,…}}
{{productsDiscountsJson}}Descontos por produto (alinhado a products).{} ou {"123":{…}}
{{productsJsonB64}}Base64 do JSON de productsJson.W3si…
{{priceLabelDataJsonB64}}Base64 de priceLabelDataJson.eyJw…
{{paymentDiscountsJsonB64}}Base64 de paymentDiscountsJson.eyIw…
{{categoryDiscountsJsonB64}}Base64 de categoryDiscountsJson.eyIw…
{{productsDiscountsJsonB64}}Base64 de productsDiscountsJson.e30=
{{productAdditionalMediaJson}}Array JSON de mídias extras.[] ou [{"type":"image",…}]
{{productMainImageJson}}Objeto JSON da imagem principal.{"src":"https://…","w":700,…}
{{productVariationImagesB64}}Base64 da string JSON de imagens por variação (decodificar para obter JSON).Após base64_decode → {…}

Listas de Produtos

Dados principais de listagem

  • {{products}}, {{listHasProducts}}, {{productsIdsHash}}.
  • Filtros: {{listPriceRangeLinks}}, {{listVariationFilterGroups}}, {{listSimpleTextFilterGroups}}, {{listBrandFilters}}.
  • Destaques: {{listCategoryBannerSrc}}, {{listShowCategoryDiscountAdvertise}}, {{listShowGlobalDiscountAdvertise}}.

Chamada de produtos dinamicos (helper)

  • Comando: {{sassListCustomProducts[...]}}.
  • É a função oficial e de melhor performance para listar produtos
  • Parametros aceitos: as, category, min, max, stock, brand, excludeProduct, filters, medias, description, orderBy, addAdditionalCatsIds, showBrand, showChildren, getShippingInfo, includeVariations.
  • Aliases: categoryId/cat, offset/start, limit/take, order/sort/sortBy.

{{sassListCustomProducts[ as=products, category={{category.categoryId}}, max=12, orderBy="ProductTitle ASC", includeVariations=true ]}}

{{#if products}}

{{#each products}}

<article class="card" data-product-id="{{item.id}}"> <img src="{{item.img350}}" alt="{{item.title}}" />

<h2>{{item.title}}</h2>

<p class="js-product-price"></p> </article>

{{/each}}

{{/if}}

Todos os parâmetros de sassListCustomProducts

{{sassListCustomProducts[as=products, category=0, min=0, max=30, stock=0, brand=0, excludeProduct=0, filters="", medias="", description=false, orderBy="", addAdditionalCatsIds=false, showBrand=false, showChildren=false, getShippingInfo=false, includeVariations=false]}}

Todos os parâmetros de sassListCustomProducts em formato de tabela com exemplos

ParâmetroTipoPadrãoO que faz
asstringobrigatório na práticaNome da variável que receberá a lista, ex.: products
categoryint0Filtra por categoria
minint0Offset / início da listagem
maxint30Quantidade máxima de itens
stockint0Filtro relacionado a estoque
brandint0Filtra por marca
excludeProductint0Exclui um produto da lista
filtersstring""Filtros adicionais em formato textual
mediasstring""Restrições / dados ligados a mídias
descriptionboolfalseInclui descrição no retorno
orderBystring""Ordenação SQL / campo de ordenação
addAdditionalCatsIdsboolfalseInclui categorias adicionais do produto
showBrandboolfalseInclui dados de marca no retorno
showChildrenboolfalseInclui filhos / descendentes de categoria
getShippingInfoboolfalseInclui dados de frete
includeVariationsboolfalseAnexa variações ao resultado final

Parâmetros alternativos também reconhecidos e compatíveis


  • min: offset, start
  • max: limit, take
  • stock: productStock
  • brand: brandId
  • excludeProduct: exclude_product, excludeId, exclude_id
  • filters: filter, productFilters, product_filters
  • medias: media, productMedias, product_medias
  • description: withDescription, with_description
  • orderBy: order, sort, sortBy, sort_by
  • addAdditionalCatsIds: add_additional_cats_ids, withAdditionalCatsIds, with_additional_cats_ids
  • showBrand: show_brand, withBrand, with_brand
  • showChildren: show_children, includeChildren, include_children
  • getShippingInfo: get_shipping_info, shippingInfo, shipping_info, withShipping, with_shipping
  • includeVariations: include_variations, withVariations, with_variations

Exemplos de usos do sassListCustomProducts

1) Listagem excluindo alguns produtos específicos


{{sassListCustomProducts[as=products, category={{category.categoryId}}, min=0, max=12, stock=0, brand=0, excludeProduct={{product.productId}}, filters="", medias="", description=false, orderBy="ProductTitle ASC", addAdditionalCatsIds=false, showBrand=false, showChildren=false, getShippingInfo=false, includeVariations=true]}}


2) Utilizando um filtro de cor com id 12, no caso, pegando só os valores iguais a Azul

{{sassListCustomProducts[as=products, category={{category.categoryId}}, min=0, max=20, stock=0, brand=0, excludeProduct=0, filters="filtro_12_Cor=Azul", medias="", description=true, orderBy="ProductTitle ASC", addAdditionalCatsIds=false, showBrand=true, showChildren=false, getShippingInfo=false, includeVariations=false]}}


3) Utilizando medias (espera-se imagem_{productfilterId}_{position}, anexando dados armazenados em ProductMedias. As medias recebe uma lista de IDs de filtros de mídia, separados por vírgula, e faz o template engine anexar ao produto as mídias cadastradas em ProductMedias para esses filtros. As mídias retornam com chaves no formato imagem_{filtro}_{posição}. Ele apenas acrescenta campos extras no objeto de retorno

{{sassListCustomProducts[as=products, category=0, max=10, medias="12,15"]}} <!-- vai adicionar medias do productFilterId = 12 e productFilterId - 15 -->

Exemplos de filtros em layout

{{#if listPriceRangeLinks}}

{{#each listPriceRangeLinks}}

<a href="/q.php?catId={{category.categoryId}}&priceRange={{min}}-{{max}}"> De {{displayMin}} a {{displayMax}} </a>

{{/each}}

{{/if}}

{{#each listVariationFilterGroups}}

<h4>{{variationName}}</h4>

{{#each items}}

<a href="/q.php?variation_{{variationoptSearchName}}">{{variationoptName}}</a>

 {{/each}}

{{/each}}

Todos os recursos em lista por filtros

FiltroParâmetros na query (q.php?…)Dados no payload / template ({{#each}} / campos)Efeito (resumo)
CategoriacatId={id} e, nos links do layout, também catName={nome}Objeto category (category.categoryId, category.categoryName, etc.)Restringe produtos da categoria na tabela Product e em ProductInCategory (search3.php).
Faixa de preçopriceRange={min}-{max} (valores numéricos)listPriceRangeLinks: min, max, displayMin, displayMax (só existem 3 faixas se houver 4 pisos em listPriceRangeFloors)productPrice BETWEEN min AND max.
Texto simples (filtro cadastrado)filtro_{productfilterId}_{productsimpletextKey}={productsimpletextValue}listSimpleTextFilterGroups → key (rótulo do grupo); em cada item: productfilterId, productsimpletextKey, productsimpletextValueBusca em ProductSimpleText por productfilterId e valor exato em productsimpletextValue (ou LIKE se forcelikefilter estiver ativo no script de busca).
Variaçãovariation_{variationoptSearchName} (no HTML do Sass o link não inclui =; o valor útil é o nome do parâmetro após variation_)listVariationFilterGroups → variationName; em cada item: variationoptSearchName, variationoptNameFiltra por VariationOpt.variationoptSearchName; várias variações na URL fazem interseção de produtos.
Marcabrand_{brandId}={brandName}listBrandFilters: brandId, brandNameFiltra Product por brandId; com outros filtros ativos, o resultado é intersectado com eles (search3.php).
RecursoFunção
listPriceRangeFloorsPisos numéricos vindos do DS; deles são derivados listPriceRangeLinks.
listSimpleTextFiltersLista plana antes do agrupamento; o template costuma usar só listSimpleTextFilterGroups.
listVariationFiltersLista plana de variações; o template usa listVariationFilterGroups.
listHasProductsIndica se há produtos na categoria (útil para esconder blocos).
listCategoryBannerSrcBanner da categoria (imagem), não filtra resultados.

Para produtos especificos

Dados principais do detalhe de produto

  • {{product.*}} para titulo, descricao, imagens, preco base e links.
  • {{productVariations}}, {{productVariationImagesB64}} e {{productShowVariationBlock}}.
  • {{productGalleryThumbItems}} e {{productShowGalleryThumbs}}.
  • {{productStockScriptSimple}}, {{productStockScriptVariation}} para fluxo de estoque.
  • {{productShippingScriptAttrs}} e campos de frete para simulacao.

SEO e rich data do produto

  • Campos de head de produto (titulo, canonical, metas) ja chegam prontos para uso em placeholders.
  • JSON-LD do produto: {{productSchemaJsonLdRaw}}.

<h1>{{product.productTitle}}</h1>

{{#if productSchemaHasJsonLd}}

<script type="application/ld+json">{{productSchemaJsonLdRaw}}</script>

{{/if}}

Preco no frontend com fallback B64 - JSON

var products = safeJsonParseB64('{{productsJsonB64}}', safeJsonParse('{{productsJson}}', []));

var priceLabelData = safeJsonParseB64('{{priceLabelDataJsonB64}}', safeJsonParse('{{priceLabelDataJson}}', {}));

var paymentDiscounts = safeJsonParseB64('{{paymentDiscountsJsonB64}}', safeJsonParse('{{paymentDiscountsJson}}', {}));

var categoryDiscounts = safeJsonParseB64('{{categoryDiscountsJsonB64}}', safeJsonParse('{{categoryDiscountsJson}}', {}));

var productsDiscounts = safeJsonParseB64('{{productsDiscountsJsonB64}}', safeJsonParse('{{productsDiscountsJson}}', {}));


✚ Campos: Coletando conteúdos específicos de filtros

Além das funções para um único filtro como {{#if productHasRichDescription}} para descrição rica é possível invocar o filtro diretamente pelo id para uso no layout, conforme:

Exemplo simples onde se sabe que o filtro retorna só um conteúdo como texto simples:

<div data-filter-1430='{{productFiltersById.1430}}'></div>

Exemplos mais avançados para cada tipo de filtro e seu conteúdo:

1) Filtro simples

Retorno esperado em filtersById['1430']: string JSON com:

  • filterKey
  • filterValue
  • filterSearchKey
  • filterSearchValue

<script> const rawSimple = filtersById['1430']; // ex: '{"filterKey":"Cor","filterValue":"Azul",...}' let simple = null; try { simple = JSON.parse(rawSimple); } catch(e) {} if (simple) { console.log(simple.filterKey, simple.filterValue, simple.filterSearchKey, simple.filterSearchValue); }</script>

2) Filtro rich text

Retorno esperado em filtersById['1431']: string HTML (ou '')

<div id="richTextFilterBox"></div><script> const richHtml = filtersById['1431'] || ''; document.getElementById('richTextFilterBox').innerHTML = richHtml;</script>

3) Filtro de mídias 

Retorno esperado em filtersById['1432']: array de strings JSON, cada item com:

  • productmediasUrl
  • productmediasType (0 imagem, 1 vídeo)

<script> const mediaRows = Array.isArray(filtersById['1432']) ? filtersById['1432'] : []; const mediaList = mediaRows .map((row) => { try { return JSON.parse(row); } catch(e) { return null; } }) .filter(Boolean); mediaList.forEach((m) => { console.log(m.productmediasUrl, m.productmediasType); });</script>

4) Filtro HTML (tipo 3)

Retorno esperado em filtersById['1433']: string HTML (ou '')

<div id="htmlFilterBox"></div><script> const htmlFilter = filtersById['1433'] || ''; document.getElementById('htmlFilterBox').innerHTML = htmlFilter;</script>


Todos os recursos da página do produto

Recursos gerais

RecursoO que fazExemplo
{{productSeoPageTitleEscaped}}Título da página do produtoNotebook Gamer X - Minha Loja
{{productSeoMetaDescriptionEscaped}}Meta descriptionNotebook Gamer X com placa dedicada... - Notebook Gamer X
{{productSeoCanonicalHrefEscaped}}URL canônica do produtohttps://loja.exemplo.com/catalogo/item/notebook-gamer-x
{{productSeoKeywordsEscaped}}Keywords geradas a partir do títuloNotebook,Gamer,X
{{productSeoAuthorEscaped}}Autor da páginaEquipe Minha Loja
{{productSeoGeoPositionEscaped}}Coordenadas geo-23.5505;-46.6333
{{productSeoGeoPlacenameEscaped}}Nome do localMinha Loja Ltda
{{productSeoGeoRegionEscaped}}Região geoBR-SP
{{productSeoBaseHrefEscaped}}<base href> da páginahttps://loja.exemplo.com/catalogo/
{{productSeoOgTitleEscaped}}Open Graph titleNotebook Gamer X - Minha Loja
{{productSeoOgImageEscaped}}Open Graph imagehttps://cdn.exemplo.com/produto.jpg
{{productSeoOgUrlEscaped}}Open Graph URLhttps://loja.exemplo.com/catalogo/item/notebook-gamer-x
{{productSeoOgDescriptionEscaped}}Open Graph descriptionNotebook Gamer X com placa dedicada...
{{productSeoOgSiteNameEscaped}}Nome do site no OGMinha Loja
{{productSeoTwitterTitleEscaped}}Título no Twitter CardNotebook Gamer X em Minha Loja
{{productSeoTwitterImageEscaped}}Imagem no Twitter Cardhttps://cdn.exemplo.com/produto.jpg
{{productSeoOrganizationJsonLdRaw}}JSON-LD de Organization{"@type":"Organization",...}
{{productSeoStoreJsonLdRaw}}JSON-LD de Store{"@type":"Store",...}
{{productSchemaJsonLdRaw}}JSON-LD de Product{"@type":"Product",...}
{{productInactiveRefreshUrlEscaped}}Redirecionamento se produto estiver inativohttps://loja.exemplo.com

Dados base do produto

RecursoO que fazExemplo
{{product.productId}}ID do produto123
{{product.productTitle}}Nome do produtoNotebook Gamer X
{{product.productDescription}}Descrição simples do produtoNotebook com 16GB de RAM...
{{product.productPrice}}Preço bruto usado em partes simples do layout2999.90
{{product.productSKU}}SKU do produtoNOTE-GAMER-X
{{product.productUrl}}Slug / URL do produtonotebook-gamer-x
{{product.brandName}}Marca do produtoDell
{{category.categoryName}}Nome da categoriaNotebooks
{{category.categoryUrl}}URL da categoria/notebooks

Imagem principal

RecursoO que fazExemplo
{{productDetailHeroImg}}Imagem principal simplificada usada em algumas versões do templatehttps://cdn.exemplo.com/produto.jpg
{{productMainImgSrc350Escaped}}Imagem principal em resolução menorhttps://cdn.exemplo.com/w_350_produto.jpg
{{productMainImgSrc500Escaped}}Imagem principal médiahttps://cdn.exemplo.com/w_500_produto.jpg
{{productMainImgSrc700Escaped}}Imagem principal maiorhttps://cdn.exemplo.com/w_700_produto.jpg
{{productMainTitleEscaped}}Título escapado para alt e titleNotebook Gamer X
{{productGalleryThumbItems}}Lista de thumbs extras da galeriaimagens / vídeos adicionais
{{productShowGalleryThumbs}}Mostra ou oculta a galeria lateral1 ou 0
{{productAdditionalMediaJson}}JSON com mídias extras padrão[{"additionalMainType":"0",...}]
{{productMainImageJson}}JSON da imagem principal"https://cdn.exemplo.com/w_700_produto.jpg"


Preço e condições comerciais

{{productPriceIsConsultation}}Indica preço “sob consulta”1 ou 0
{{productPriceShowDePor}}Exibe “De ... por ...”1 ou 0
{{productPriceShowAPartir}}Exibe “A partir de”1 ou 0
{{productFullPriceFormatted}}Preço cheio formatadoR$ 3.499,90
{{productCurrentPriceFormatted}}Preço atual formatadoR$ 2.999,90
{{productPriceHasInstallments}}Indica se há parcelamento1 ou 0
{{productInstallmentCount}}Quantidade de parcelas10
{{productInstallmentValueFormatted}}Valor da parcela formatadoR$ 299,99
{{productPricePaymentMethodSmall}}Controla <small> com meio de pagamento1 ou 0
{{productPricePaymentMethodLabel}}Nome do meio de pagamentoPIX
{{productFessText}}Texto complementar de taxas / condiçõestexto curto
{{productDiscountPercentLabel}}Label de desconto percentual10% OFF
{{productPriceFreeShippingEscaped}}Texto de frete grátisFrete grátis
{{productNumericPriceForJs}}Preço numérico para scripts2999.9
{{productNumericOriginalPriceForJs}}Preço original numérico3499.9
{{productPriceForInstallmentsJs}}Base numérica para cálculo de parcelas2999.9

Variações

{{productShowVariationBlock}}Exibe bloco de variações1 ou 0
{{productVariations}}Estrutura completa das variaçõeslista de grupos
{{item.variationId}}ID do grupo de variação5
{{item.variationName}}Nome do grupoCor
{{item.helpMessage}}Ajuda exibida no grupoEscolha uma opção
{{item.variationReqsOk}}Estado interno da obrigatoriedade0 ou 1
{{item.required}}Indica se a variação é obrigatória1 ou 0
{{item.optionId}}ID da opção18
{{item.optionParentId}}ID pai da opção0 ou outro ID
{{item.inputType}}Tipo do inputradio
{{item.lastChild}}Marca opção final em árvore de variação1 ou 0
{{item.optionSkuValue}}SKU da opçãoNOTE-GAMER-X-AZUL
{{item.optionPrice}}Acréscimo / valor da opção50
{{item.optionWeight}}Peso adicional da opção0.2
{{item.optionNameEsc}}Nome da opçãoAzul
{{item.optionHasImage}}Se a opção tem imagem1 ou 0
{{item.optionImageSrc}}Imagem da opçãohttps://cdn.exemplo.com/azul.jpg
{{item.optionImageAltTitle}}Alt/title da imagem da opçãoAzul
{{item.optionShowPrice}}Mostra preço adicional na label1 ou 0
{{item.optionPricePlusLabel}}Label do acréscimo+ R$ 50,00
{{productVariationImagesB64}}Mapa Base64 de imagens por variaçãoBase64 de JSON


Carrinho, estoque e frete

RecursoO que fazExemplo
{{productShowAddToCart}}Exibe o botão de compra1 ou 0
{{productCartTitleAttr}}Nome enviado ao carrinhoNotebook Gamer X
{{productCartImgUrl}}Imagem enviada ao carrinhohttps://cdn.exemplo.com/w_100_produto.jpg
{{productShipAttrWidth}}Largura para cálculo de frete30
{{productShipAttrHeight}}Altura para cálculo de frete8
{{productShipAttrLength}}Comprimento para cálculo de frete45
{{productShipAttrFragile}}Indica se é frágil1 ou 0
{{productShipAttrWeight}}Peso do produto1.2
{{productShipAttrSku}}SKU usado no bloco de freteNOTE-GAMER-X
{{productShipAttrCategory}}Categoria usada no frete10
{{productShipAttrPrice}}Preço usado no frete2999.90
{{productShipAttrInternalId}}ID interno usado no frete123
{{productShipHasFreeShipping}}Indica frete grátis1 ou 0
{{productShipAttrFreeShippingMessage}}Mensagem de frete grátisFrete grátis para Sul e Sudeste
{{productShippingScriptAttrs}}Atributos extras do script de fretedata-...="..."
{{productStockScriptSimple}}Liga script de estoque simples1 ou 0
{{productStockScriptVariation}}Liga script de estoque por variação1 ou 0
{{productStockWhatsappDigits}}Telefone para fallback via WhatsApp11999999999
{{productStockTitleUrlEncoded}}Título codificado na URLNotebook%20Gamer%20X
{{productStockOrgEscaped}}Nome da loja para tooltip / titleMinha Loja
{{productStockTokenEscaped}}Token do script de estoquetoken
{{productStockSiteId}}ID do site no script de estoque358
{{productStockProductId}}ID do produto no script de estoque123


Descrição e conteúdo enriquecido

RecursoO que fazExemplo
{{productHasRichDescription}}Decide entre HTML rico e descrição plana1 ou 0
{{productRichDescriptionRaw}}HTML rico da descrição<p><strong>Detalhes</strong>...</p>
{{productDescriptionPlainEscaped}}Descrição simples escapadaNotebook com 16GB...


Avaliações e comentários

RecursoO que fazExemplo
{{productRatingResumeEmpty}}Indica ausência de avaliações1 ou 0
{{productRatingResumeStars}}Estrelas do resumolista com classes
{{productRatingResumeAverageFormatted}}Média formatada4,8
{{productRatingResumeQuantity}}Quantidade de avaliações27
{{productRatingCommentsEmpty}}Indica ausência de comentários1 ou 0
{{productRatingComments}}Lista de comentárioslista estruturada
{{item.starClass}}Classe visual da estrelastarFull
{{item.commentEscaped}}Texto do comentárioProduto excelente.
{{item.dateFormatted}}Data formatada16/04/2026
{{item.hasReply}}Se a loja respondeu1 ou 0
{{item.replyEscaped}}Resposta da lojaObrigado pela avaliação!


Relacionados e blocos auxiliares da página

RecursoO que fazExemplo
{{listHasProducts}}Controla a renderização dos relacionados1 ou 0
{{products}}Lista de produtos relacionadosarray
{{item.id}}ID do item relacionado456
{{item.url}}URL do item relacionadomouse-gamer-y
{{item.img175}}, {{item.img250}}, {{item.img350}}Imagens responsivas do relacionadoURLs
{{item.title}}Título do produto relacionadoMouse Gamer Y
{{searchTermsFirst}}Primeiros termos mais buscadoslista
{{searchTermsMore}}Termos extraslista
{{searchTermsHasMore}}Exibe botão “Mais”1 ou 0
{{searchUserQuery}}Termo buscadonotebook gamer
{{href}}Link do termo buscadohttps://.../q.php?...
{{position}}Posição no breadcrumb / schema1


Dados globais usados na visualização do produto

RecursoO que fazExemplo
{{mainData.siteDomain}}Monta links absolutosloja.exemplo.com
{{mainData.configPath}}Prefixo das URLs do catálogo/catalogo
{{mainData.siteId}}ID do site em scripts358
{{mainData.configHead}}HTML extra no <head>scripts / metas
{{mainData.configBody}}HTML extra no fim do <body>scripts
{{siteNameJson}}Nome do site em JSON para JS"Minha Loja"
{{globalDiscountEnabled}}Desconto global ativo1
{{globalDiscountType}}Tipo do desconto global1
{{bestPaymentEnabled}}Melhor pagamento ativo1
{{bestPaymentMethodLabel}}Rótulo do melhor pagamentoPIX
{{visitsToken}}Token do script de visitastoken
{{whatsappNomeAttr}}, {{whatsappLogoAttr}}, {{whatsappPhoneAttr}}, {{whatsappMsgAttr}}Dados do botão flutuante de WhatsAppvalores configurados


Exemplos de aplicação em código

1) Exibição de produto simples (título, descrição, imagem principal, imagens adicionais e preço)

<section class="sectionProductDetail">

  <div class="container productContainer">

    <div class="row productDetails">

      <div class="col-12 col-lg-7 productItemImg">

        {{#if productShowGalleryThumbs}}

        <div class="boxAdditionalMediaThumbs">

          {{#each productGalleryThumbItems}}

            {{#if item.isImage}}

            <a data-fancybox="gallery" data-src="{{item.largeSrc}}">

              <img width="55" height="75" src="{{item.thumbSrc}}" alt="{{item.thumbAlt}}">

            </a>

            {{/if}}

          {{/each}}

        </div>

        {{/if}}

        <div class="boxMainMedia">

          <a data-fancybox="gallery" data-src="{{productMainImgSrc700Escaped}}">

            <img src="{{productMainImgSrc700Escaped}}" alt="{{productMainTitleEscaped}}">

          </a>

        </div>

      </div>

      <div class="col-12 col-lg-5 productInfo">

        <h1 class="productItemTitle">{{product.productTitle}}</h1>

        <p class="productPrice">

          {{#if productPriceIsConsultation}}

            Sob consulta

          {{else}}

            {{productCurrentPriceFormatted}}

          {{/if}}

        </p>

        {{#if productHasRichDescription}}

          <div class="productItemDescription">{{productRichDescriptionRaw}}</div>

        {{else}}

          <p class="productItemDescription">{{productDescriptionPlainEscaped}}</p>

        {{/if}}

      </div>

    </div>

  </div>

</section>


2) Produto com título, descrição e variações

<section class="sectionProductDetail">

<div class="container productContainer">

<h1 class="productItemTitle">{{product.productTitle}}</h1>

{{#if productHasRichDescription}}

<div class="productItemDescription">{{productRichDescriptionRaw}}</div>

{{else}}

<p class="productItemDescription">{{productDescriptionPlainEscaped}}</p>

{{/if}}

{{#if productShowVariationBlock}}

<div class="boxVariations">

{{#each productVariations}}

<div class="variationContent" id="variationContent_{{item.variationId}}">

<p class="variationContentTitle">

{{item.variationName}}

<span class="variationContentTitleHelpMessage">{{item.helpMessage}}</span>

</p>

<div class="variationContentBoxOptions">

{{#each item.variationOptions}}

<div class="variationOptionContent" optId="{{item.optionId}}">

<input type="{{item.inputType}}" name="option_{{item.variationId}}" id="option_{{item.optionId}}_{{item.optionParentId}}" value="{{item.optionId}}" class="optionComponent" />

<label for="option_{{item.optionId}}_{{item.optionParentId}}" class="labelForOption">

{{#if item.optionHasImage}}

<img src="{{item.optionImageSrc}}" alt="{{item.optionImageAltTitle}}">

{{/if}}

<span>{{item.optionNameEsc}}</span>

{{#if item.optionShowPrice}}

<small>{{item.optionPricePlusLabel}}</small>

{{/if}}

</label>

</div>

{{/each}}

</div>

</div>

{{/each}}

</div><section class="sectionProductDetail">

<div class="container productContainer">

<h1 class="productItemTitle">{{product.productTitle}}</h1>

{{#if productHasRichDescription}}

<div class="productItemDescription">{{productRichDescriptionRaw}}</div>

{{else}}

<p class="productItemDescription">{{productDescriptionPlainEscaped}}</p>

{{/if}}

{{#if productShowVariationBlock}}

<div class="boxVariations">

{{#each productVariations}}

<div class="variationContent" id="variationContent_{{item.variationId}}">

<p class="variationContentTitle">

{{item.variationName}}

<span class="variationContentTitleHelpMessage">{{item.helpMessage}}</span>

</p>

<div class="variationContentBoxOptions">

{{#each item.variationOptions}}

<div class="variationOptionContent" optId="{{item.optionId}}">

<input type="{{item.inputType}}" name="option_{{item.variationId}}" id="option_{{item.optionId}}_{{item.optionParentId}}" value="{{item.optionId}}" class="optionComponent" />

<label for="option_{{item.optionId}}_{{item.optionParentId}}" class="labelForOption">

{{#if item.optionHasImage}}

<img src="{{item.optionImageSrc}}" alt="{{item.optionImageAltTitle}}">

{{/if}}

<span>{{item.optionNameEsc}}</span>

{{#if item.optionShowPrice}}

<small>{{item.optionPricePlusLabel}}</small>

{{/if}}

</label>

</div>

{{/each}}

</div>

</div>

{{/each}}

</div>

 {{/if}}

</div>

</section>


3) Listas de produtos relacionados


<section class="relatedProducts">

 <div class="container">

  <h3>Produtos <strong>relacionados</strong></h3>

 <div class="row productsList" id="relatedProductsContainer">

 {{#if listHasProducts}}

  {{#each products}}

   <div class="col-6 col-lg-3 productItem" id="{{item.id}}">

   <a href="https://{{mainData.siteDomain}}{{mainData.configPath}}/item/{{item.url}}">

   <div class="productImg">

   <picture>

    <source media="(min-width:300px) and (max-width:499px)" srcset="{{item.img175}}">

    <source media="(min-width:500px) and (max-width:699px)" srcset="{{item.img250}}">

    <source media="(min-width:700px)" srcset="{{item.img350}}">

    <img src="{{item.img350}}" alt="Imagem de {{item.title}}" loading="lazy">

   </picture>

  </div>

  <div class="productDescription">

   <h4 class="productTitle">{{item.title}}</h4>

   <p class="productPrice js-product-price"></p>

  </div>

 </a>

</div>

{{/each}}

{{else}}

<p>Nenhum produto relacionado encontrado.</p>

{{/if}}

</div>

</div>

</section>


Outros casos (Menu e buscas)

Menu de categorias

  • {{menuCategories}} e {{menuHasCategories}}.
  • Campos por item: {{categoryId}}, {{categoryParentId}}, {{categoryName}}, {{href}}, {{qtd}}.

{{#if menuHasCategories}}

<ul class="menuList">

{{#each menuCategories}}

<li id="item_{{categoryId}}" parent="{{categoryParentId}}">

<a href="{{href}}">{{categoryName}} <span>{{qtd}}</span></a>

</li>

{{/each}}

</ul>

{{/if}}


Boas praticas finais

  • Se um placeholder nao existir, ele vira vazio; valide nomes de chave e caminhos.
  • Em loops, prefira {{item.campo}} para leitura mais clara do layout.
  • Quando usar scripts de preco/filtro, mantenha *JsonB64 com fallback *Json.
  • Teste sempre com cenarios com e sem produto para validar {{#if}} e {{#unless}}.