Production Shopify · PDP disclosures

Ship product-page disclosure accordions that stay editable

Materials, sizing, shipping, and care panels are not FAQ pages. This guide is about disclosure accordions that live on product templates, open one panel at a time when required, and stay editable when merchandising changes the story every season.

Production implementation guide · Updated 2026-08-03

This is not an FAQ page—and the schema should show it

FAQ sections answer store-wide policy questions and often allow multiple answers open for scanning. Product disclosure accordions sit beside the buy box, explain this product, and frequently use exclusive open behaviour so the PDP does not become a wall of expanded text.

Store FAQ sections

  • Store-level questions (returns, shipping windows, account)
  • Often multi-expand for compare-and-scan
  • Wording mirrors support tickets and search queries
  • May emit FAQPage structured data on dedicated URLs only

PDP disclosure accordions

  • Product- or template-level disclosures (materials, fit, care)
  • Often exclusive expand so one panel owns attention
  • Wording mirrors PDP education, not a support center
  • Almost never should spam FAQPage on every product URL

Exclusive open: one panel at a time on crowded PDPs

Exclusive accordions close the previously open panel when a new one opens. That pattern protects mobile product pages. Multi-open still has a place (long editorial lookbooks)—choose deliberately and expose the behaviour in section settings if both are required.

Implement exclusive logic inside the section root only. Document-level listeners will break when a theme also hosts a store FAQ.

Exclusive toggle sketch (section-scoped)

root.querySelectorAll('[data-disclosure-trigger]').forEach((button) => {
  button.addEventListener('click', () => {
    const willOpen = button.getAttribute('aria-expanded') !== 'true';
    root.querySelectorAll('[data-disclosure-trigger]').forEach((other) => {
      const panel = root.querySelector('#' + CSS.escape(other.getAttribute('aria-controls')));
      other.setAttribute('aria-expanded', 'false');
      if (panel) panel.hidden = true;
    });
    if (willOpen) {
      const panel = root.querySelector('#' + CSS.escape(button.getAttribute('aria-controls')));
      button.setAttribute('aria-expanded', 'true');
      if (panel) panel.hidden = false;
    }
  });
});

Reset siblings first, then open the clicked trigger. Keep aria-expanded truthful after every click.

details/summary vs buttons: pick for progressive enhancement

Native <details>/<summary> gives open/close without JavaScript and is excellent for simple disclosures. Button + panel patterns give tighter control for exclusive mode, analytics hooks, and matching a design system’s motion.

Do not mix both models in one section. Merchants editing content should not inherit two interaction paradigms.

Native details row (no JS required for basic open)

{% for block in section.blocks %}
  <details class="disclosure__item" {{ block.shopify_attributes }}>
    <summary class="disclosure__summary">
      {{ block.settings.heading | escape }}
    </summary>
    <div class="disclosure__body rte">
      {{ block.settings.body }}
    </div>
  </details>
{% endfor %}

Use when exclusive JS is unnecessary. Still namespace styles under section.id so PDP chrome is untouched.

Button panel row (exclusive-ready)

{% assign panel_id = 'Disclosure-' | append: section.id | append: '-' | append: block.id %}
<div class="disclosure__item" {{ block.shopify_attributes }}>
  <button
    type="button"
    class="disclosure__summary"
    aria-expanded="false"
    aria-controls="{{ panel_id }}"
    data-disclosure-trigger
  >
    {{ block.settings.heading | escape }}
  </button>
  <div id="{{ panel_id }}" class="disclosure__body rte" hidden data-disclosure-panel>
    {{ block.settings.body }}
  </div>
</div>

Prefer this when exclusive open, custom icons, or design-system buttons are required.

Blocks vs product metafields for disclosure copy

Blocks shine when the same accordion structure is reused and merchants edit titles/bodies in the theme editor. Product metafields shine when each SKU needs unique materials/fit text without duplicating section instances.

A maintainable pattern: section provides the accordion chrome and optional default blocks; product metafield list or metaobject drives per-SKU rows when content is catalog-owned.

Schema sketch — disclosure row blocks

{
  "name": "Product disclosures",
  "settings": [
    {
      "type": "checkbox",
      "id": "exclusive_open",
      "label": "Open only one panel at a time",
      "default": true
    }
  ],
  "blocks": [
    {
      "type": "disclosure",
      "name": "Disclosure",
      "settings": [
        { "type": "text", "id": "heading", "label": "Panel title", "default": "Materials" },
        { "type": "richtext", "id": "body", "label": "Panel content" }
      ]
    }
  ],
  "presets": [
    {
      "name": "Product disclosures",
      "blocks": [
        { "type": "disclosure", "settings": { "heading": "Materials" } },
        { "type": "disclosure", "settings": { "heading": "Size & fit" } },
        { "type": "disclosure", "settings": { "heading": "Shipping & returns" } }
      ]
    }
  ]
}

Preset names must read like PDP education. Seeding three panels teaches merchants the pattern without looking like a store FAQ.

Place disclosures on product templates without burying ATC

On product.json, order matters. Disclosures usually sit below the buy box or within a product information group—not above the price. Test sticky ATC bars and variant pickers when a panel opens.

Avoid putting product-specific disclosures in header-group.json. They are not global chrome.

Figure — PDP stack checkpoints
  • Media / title / price / variants / ATC remain above or sticky while panels toggle.
  • Disclosure section appears once in product.json order—not duplicated in a footer group.
  • Opening “Size & fit” does not push ATC off-screen permanently on a mid-size phone.
  • Editor preview uses a real product with long and short disclosure copy.

Placement bugs feel like conversion bugs to merchants.

Accessibility requirements for exclusive disclosures

Triggers must be buttons (or native summary). aria-expanded must reflect state. When closing siblings, do not strand focus inside a hidden panel. Visible focus styles matter next to low-contrast luxury PDPs.

If you use icon-only toggles, provide accessible names from the panel title.

Production debugging for disclosure accordions

Disclosure accordion symptoms and checks
SymptomChecks
Panels open then immediately closeDouble-bound listeners? Details + button both handling click? Reactivity from an app?
FAQ on homepage closes when PDP opensDocument-level selectors? Shared class names without section root?
Wrong product shows materials textMetafield namespace? Section using global blocks instead of product-sourced data?
ATC jumps / layout thrashHeight animation? Sticky bar intersection? Images inside panels without dimensions?

Practice a PDP disclosure accordion by hand

Build this on a development product template before using any generator. You should explain exclusive behaviour and why this is not the store FAQ section.

  1. 01

    Create sections/product-disclosures.liquid

    Choose details or button model; add disclosure blocks; seed Materials / Size & fit / Shipping panels.

  2. 02

    Implement exclusive open (if required)

    Section-scoped script; aria-expanded stays accurate; FAQ elsewhere unaffected.

  3. 03

    Register on product.json

    Place below buy box; verify mobile ATC with panels open.

  4. 04

    Empty-state pass

    Clear a richtext body—panel should not leave broken chrome.

  5. 05

    Coexistence test

    Add store FAQ on a page template in the same theme; operate both.

Use the converter after the disclosure model is settled

Static collapsible HTML can be drafted faster in the converter once you know whether you need exclusive open, details vs buttons, and blocks vs metafields. The converter does not decide PDP information architecture for you.

Supporting draft acceleration — not a substitute for PDP disclosure design.

What to study next for PDP UI sections

Continue with adjacent skills. FAQ maintainability is a different problem—study it when you need store-level Q&A, not product disclosures.

Beginner

Liquid and section placement before PDP chrome.

Intermediate

Blocks, schema, and related collapsible UI.

Advanced

Delivery under merchandising pressure.

Editorial review

Reviewed by the HTML to Liquid Converter team

Dhruv Goyani, Shopify Developer at HTML to Liquid Converter

Dhruv Goyani

3 years web design + 3 years Shopify development experience

LinkedIn profile →
Nishad Kikani, Lead Shopify Developer at HTML to Liquid Converter

Nishad Kikani

2 years web design + 6 years Shopify development experience

LinkedIn profile →

Content is reviewed by the HTML to Liquid Converter Shopify development team before publication. Technical accuracy is validated against current Shopify Online Store 2.0 conventions and active client theme work.

Last updated:

Questions or corrections? Contact us.