← back to Consulting Designerwallcoverings Com
TK-20 verify: Playwright render-check (all 3 published, but 2 collection body_html blocks HIDDEN by Boost SD display:none); read-only theme investigation → dw-collection-hero SECTION is metafield-driven & already emits FAQPage; draft handle-keyed dw-aeo-jsonld.liquid snippet + page render-hook + collection custom.faq/category metafieldsSet payloads + gated APPLY scripts + findings doc
b5fc1de2824b6049c1f36c9febcb8406f1f0a67b · 2026-07-26 21:02:37 -0700 · Steve Abrams
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Files touched
A docs/aeo-drafts/TK-20-VERIFY-FINDINGS.mdA docs/aeo-drafts/collection-metafields/APPLY-metafields.shA docs/aeo-drafts/collection-metafields/osborne-little.faq.jsonA docs/aeo-drafts/collection-metafields/osborne-little.metafieldsSet.jsonA docs/aeo-drafts/collection-metafields/versace-wallpaper.faq.jsonA docs/aeo-drafts/collection-metafields/versace-wallpaper.metafieldsSet.jsonA docs/aeo-drafts/collection-metafields/zuber-wallcoverings.faq.jsonA docs/aeo-drafts/collection-metafields/zuber-wallcoverings.metafieldsSet.jsonA docs/aeo-drafts/render-proof/render-verify-20260726-2053.jsonA docs/aeo-drafts/theme-snippets/APPLY-page-jsonld.shA docs/aeo-drafts/theme-snippets/dw-aeo-jsonld.liquidA docs/aeo-drafts/theme-snippets/sections-page.liquid.PROPOSEDA scripts/aeo-build-collection-metafields.mjsA scripts/aeo-build-jsonld-snippet.mjsA scripts/aeo-render-verify.mjs
Diff
commit b5fc1de2824b6049c1f36c9febcb8406f1f0a67b
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Sun Jul 26 21:02:37 2026 -0700
TK-20 verify: Playwright render-check (all 3 published, but 2 collection body_html blocks HIDDEN by Boost SD display:none); read-only theme investigation → dw-collection-hero SECTION is metafield-driven & already emits FAQPage; draft handle-keyed dw-aeo-jsonld.liquid snippet + page render-hook + collection custom.faq/category metafieldsSet payloads + gated APPLY scripts + findings doc
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
---
docs/aeo-drafts/TK-20-VERIFY-FINDINGS.md | 69 ++++
.../collection-metafields/APPLY-metafields.sh | 21 ++
.../collection-metafields/osborne-little.faq.json | 26 ++
.../osborne-little.metafieldsSet.json | 1 +
.../versace-wallpaper.faq.json | 26 ++
.../versace-wallpaper.metafieldsSet.json | 1 +
.../zuber-wallcoverings.faq.json | 26 ++
.../zuber-wallcoverings.metafieldsSet.json | 1 +
.../render-proof/render-verify-20260726-2053.json | 41 +++
.../aeo-drafts/theme-snippets/APPLY-page-jsonld.sh | 44 +++
.../aeo-drafts/theme-snippets/dw-aeo-jsonld.liquid | 393 +++++++++++++++++++++
.../theme-snippets/sections-page.liquid.PROPOSED | 20 ++
scripts/aeo-build-collection-metafields.mjs | 85 +++++
scripts/aeo-build-jsonld-snippet.mjs | 96 +++++
scripts/aeo-render-verify.mjs | 48 +++
15 files changed, 898 insertions(+)
diff --git a/docs/aeo-drafts/TK-20-VERIFY-FINDINGS.md b/docs/aeo-drafts/TK-20-VERIFY-FINDINGS.md
new file mode 100644
index 0000000..4d56dd1
--- /dev/null
+++ b/docs/aeo-drafts/TK-20-VERIFY-FINDINGS.md
@@ -0,0 +1,69 @@
+# TK-20 — AEO Storefront Render Verification + Injection-Path Findings
+
+**Engagement:** DW consulting · **Date:** 2026-07-26 · **Agent:** yolo-worker
+**Scope:** READ-ONLY + DRAFT-ONLY. No theme writes, no Shopify writes were made.
+**Method:** Playwright real Chromium (curl is 429-throttled from this IP; a real browser is not) + Shopify Theme Asset API GET (read-only, `SHOPIFY_THEME_TOKEN`) + Admin GraphQL reads.
+
+---
+
+## 1. Render verification — the 3 published AEO targets
+
+Script: `scripts/aeo-render-verify.mjs` (real Chromium, storefront `https://www.designerwallcoverings.com`). All three returned **HTTP 200** and the injected markup **is present in the DOM**:
+
+| URL | HTTP | `.dw-aeo-answer` in DOM | signature phrase | **Visible to users/CSS-crawlers?** |
+|-----|------|--------------------------|------------------|------------------------------------|
+| `/collections/versace-wallpaper` | 200 | ✅ ("Medusa head…" present) | "Medusa" ✅ | ❌ **HIDDEN** |
+| `/collections/osborne-little` | 200 | ✅ | "Osborne & Little" ✅ | ❌ **HIDDEN** |
+| `/pages/wall-coverings` (id 219525742643) | 200 | ✅ (`data-aeo="wall-coverings"`) | ✅ | ✅ **VISIBLE** |
+
+### The critical finding (computed-style walk)
+
+The two **collection** AEO blocks are in the DOM but render at **0×0 / `display:none`**. Walking the ancestor chain, the block sits inside `.boost-sd__collection-header`, and the **Boost AI Search & Discovery** app's header container is set to `display:none`.
+
+**Root cause:** The theme section `sections/dw-collection-hero.liquid` (lines 79–88) *deliberately* does:
+
+```css
+.boost-sd__collection-header,
+.boost-sd__collection-description { display:none !important; }
+```
+
+The collection **body_html / `collection.description`** — where today's Admin-API AEO block was appended — renders *inside that hidden Boost header*. So the block is invisible to shoppers **and** to CSS-rendering crawlers (Google, AI Overviews). **AEO value of the collection body_html blocks ≈ nil.**
+
+The `/pages/wall-coverings` page is a **native page** (`sections/page.liquid` → `.page-content.rte` → `{{ page.content }}`), not Boost-controlled, so it renders the AEO content **fully visible**. ✅
+
+---
+
+## 2. Injection-path investigation (the July-21 machine)
+
+The task referenced `snippets/dw-collection-hero.liquid`; the live asset is actually **`sections/dw-collection-hero.liquid`** (a *section*, not a snippet). `templates/collection.json` renders it **first** (`order: ["dw_collection_hero", <boost apps>, "main"]`), i.e. **above and outside** the hidden Boost header. It is the correct **visible** surface for collection AEO. It:
+
+- reads **`collection.metafields.custom.faq.value`** — a `json` metafield holding `[{q,a},…]` — and renders a **visible FAQ `<details>`** + emits **FAQPage** JSON-LD;
+- reads **`collection.metafields.custom.category`** (`single_line_text_field`) for the answer line (defaults to `wallcovering`);
+- always emits **CollectionPage** + **BreadcrumbList** JSON-LD.
+
+**Confirmed live:** 14 of 60 sampled collections already carry `custom.faq` (`json`) + `custom.category` (e.g. `cork`, `chinoiserie`, `madagascar-cloth`) — this is the same machine the July-21 rollout used. **versace-wallpaper / osborne-little / zuber-wallcoverings were simply never populated** (`custom.faq = null` today → they render zero visible AEO and zero FAQPage).
+
+**Correct collection path:** *do not* rely on body_html. **Populate `custom.faq` + `custom.category` metafields** → the existing section renders them visibly and emits FAQPage automatically. No theme write needed for collections.
+
+**Pages:** `sections/page.liquid` renders `page.content` visibly but emits **no** FAQPage/WebPage JSON-LD (site JSON-LD is inlined in `layout/theme.liquid`, pixelunion — pages get only BreadcrumbList). **Correct page path:** a handle-keyed JSON-LD snippet rendered from `sections/page.liquid`.
+
+---
+
+## 3. Drafted deliverables (all DRAFT-ONLY, gated for Steve's session)
+
+| Path | What |
+|------|------|
+| `theme-snippets/dw-aeo-jsonld.liquid` | Handle-keyed JSON-LD snippet — WebPage+FAQPage for the 2 pages; FAQPage-only *fallback* for the 3 collections (guarded on `custom.faq == blank` so it never double-emits). Built from committed `.jsonld` by `scripts/aeo-build-jsonld-snippet.mjs`; all 5 embedded blocks JSON-valid, Liquid tags balance. |
+| `theme-snippets/sections-page.liquid.PROPOSED` | The one-line render-hook edit to `sections/page.liquid`. |
+| `theme-snippets/APPLY-page-jsonld.sh` | Exact GATED PUT commands (backs up live page.liquid first; strips the draft comment on ship). |
+| `collection-metafields/*.metafieldsSet.json` | Ready-to-run GraphQL `metafieldsSet` bodies for versace/osborne/zuber (6 FAQ each + category). |
+| `collection-metafields/APPLY-metafields.sh` | Exact GATED curl-per-collection to populate the metafields. |
+| `render-proof/` | Playwright artifacts location (screenshots best-effort; the hidden collection blocks won't shoot — that *is* the finding). |
+
+### Recommended publish order (all GATED)
+1. **Collections (highest ROI):** run `collection-metafields/APPLY-metafields.sh` → versace/osborne/zuber get visible FAQ + FAQPage via the existing section. *(This is what actually fixes the two hidden collection blocks.)*
+2. **Pages:** run `theme-snippets/APPLY-page-jsonld.sh` → FAQPage/WebPage JSON-LD on `/pages/wall-coverings` (+ `/pages/designer-wallpaper` when it exists).
+3. **Nav:** add **Wall Coverings → `/pages/wall-coverings`** to the footer **`resources`** linklist (and/or `footer`) via Admin → Navigation (or `menuUpdate` GraphQL with `write_online_store_navigation` — the current admin token lacks that scope).
+4. *(Optional cleanup)* the now-redundant hidden body_html AEO block on the 2 collections can be reverted from the repo rollback baselines; harmless if left.
+
+**Note on the body_html publish done earlier today:** it is not harmful, but on the two collection pages it is **not doing anything** (hidden by Boost). The metafield path in step 1 is what makes that content actually surface.
diff --git a/docs/aeo-drafts/collection-metafields/APPLY-metafields.sh b/docs/aeo-drafts/collection-metafields/APPLY-metafields.sh
new file mode 100755
index 0000000..8857244
--- /dev/null
+++ b/docs/aeo-drafts/collection-metafields/APPLY-metafields.sh
@@ -0,0 +1,21 @@
+#!/usr/bin/env bash
+# TK-20 GATED — populate custom.faq + custom.category on the 3 AEO collections.
+# The live theme (sections/dw-collection-hero.liquid) renders these as a VISIBLE
+# FAQ + emits FAQPage + CollectionPage JSON-LD. DO NOT RUN until Steve GO.
+# Requires SHOPIFY_ADMIN_TOKEN with write_products scope (collection metafields).
+set -euo pipefail
+TOKEN="${SHOPIFY_ADMIN_TOKEN:?export SHOPIFY_ADMIN_TOKEN first}"
+STORE="designer-laboratory-sandbox.myshopify.com"
+API="https://$STORE/admin/api/2024-10/graphql.json"
+
+echo "== versace-wallpaper (6 FAQ) =="
+curl -s "$API" -H "X-Shopify-Access-Token: $TOKEN" -H "Content-Type: application/json" \
+ --data-binary @"$(dirname "$0")/versace-wallpaper.metafieldsSet.json" | tee /tmp/aeo-mf-versace-wallpaper.json
+
+echo "== osborne-little (6 FAQ) =="
+curl -s "$API" -H "X-Shopify-Access-Token: $TOKEN" -H "Content-Type: application/json" \
+ --data-binary @"$(dirname "$0")/osborne-little.metafieldsSet.json" | tee /tmp/aeo-mf-osborne-little.json
+
+echo "== zuber-wallcoverings (6 FAQ) =="
+curl -s "$API" -H "X-Shopify-Access-Token: $TOKEN" -H "Content-Type: application/json" \
+ --data-binary @"$(dirname "$0")/zuber-wallcoverings.metafieldsSet.json" | tee /tmp/aeo-mf-zuber-wallcoverings.json
diff --git a/docs/aeo-drafts/collection-metafields/osborne-little.faq.json b/docs/aeo-drafts/collection-metafields/osborne-little.faq.json
new file mode 100644
index 0000000..c36bf1f
--- /dev/null
+++ b/docs/aeo-drafts/collection-metafields/osborne-little.faq.json
@@ -0,0 +1,26 @@
+[
+ {
+ "q": "Who are Osborne & Little?",
+ "a": "Osborne & Little is a British design house founded in London in 1968 by Peter Osborne and Antony Little. It designs and manufactures luxury wallpapers and fabrics and is regarded as one of England's leading interior-design brands."
+ },
+ {
+ "q": "Where can I buy Osborne & Little wallpaper?",
+ "a": "Osborne & Little is sold through specialty interior retailers, including Designer Wallcoverings, which carries the Osborne & Little wallpaper and fabric range with full-roll ordering, current pricing on each product page, and $4.25 memo samples."
+ },
+ {
+ "q": "Is Osborne & Little wallpaper expensive?",
+ "a": "Osborne & Little is a premium designer line, priced per roll above mass-market wallpaper. Exact pricing depends on the collection and colorway and is shown on each Designer Wallcoverings product page; order a $4.25 memo sample first to confirm the match."
+ },
+ {
+ "q": "Does Osborne & Little make fabric as well as wallpaper?",
+ "a": "Yes. Osborne & Little produces both wallpapers (sold by the roll) and coordinating fabrics (sold by the yard). Designer Wallcoverings carries both, so you can pair a wallcovering with a matching or complementary drapery or upholstery fabric."
+ },
+ {
+ "q": "What is Osborne & Little known for?",
+ "a": "Pattern-led British design — botanical and floral trails, damasks, chinoiserie, and bold geometrics, often on metallic or richly colored grounds. The group also produces the Nina Campbell and Matthew Williamson lines."
+ },
+ {
+ "q": "Can I order a sample of Osborne & Little wallpaper?",
+ "a": "Yes — Designer Wallcoverings offers a $4.25 memo sample so you can see the true color, scale, and finish in your own room before buying full rolls."
+ }
+]
\ No newline at end of file
diff --git a/docs/aeo-drafts/collection-metafields/osborne-little.metafieldsSet.json b/docs/aeo-drafts/collection-metafields/osborne-little.metafieldsSet.json
new file mode 100644
index 0000000..7baf887
--- /dev/null
+++ b/docs/aeo-drafts/collection-metafields/osborne-little.metafieldsSet.json
@@ -0,0 +1 @@
+{"query":"mutation SetAeoMetafields($metafields: [MetafieldsSetInput!]!) {\n metafieldsSet(metafields: $metafields) {\n metafields { key namespace ownerType type }\n userErrors { field message }\n }\n}","variables":{"metafields":[{"ownerId":"gid://shopify/Collection/298974314547","namespace":"custom","key":"faq","type":"json","value":"[{\"q\":\"Who are Osborne & Little?\",\"a\":\"Osborne & Little is a British design house founded in London in 1968 by Peter Osborne and Antony Little. It designs and manufactures luxury wallpapers and fabrics and is regarded as one of England's leading interior-design brands.\"},{\"q\":\"Where can I buy Osborne & Little wallpaper?\",\"a\":\"Osborne & Little is sold through specialty interior retailers, including Designer Wallcoverings, which carries the Osborne & Little wallpaper and fabric range with full-roll ordering, current pricing on each product page, and $4.25 memo samples.\"},{\"q\":\"Is Osborne & Little wallpaper expensive?\",\"a\":\"Osborne & Little is a premium designer line, priced per roll above mass-market wallpaper. Exact pricing depends on the collection and colorway and is shown on each Designer Wallcoverings product page; order a $4.25 memo sample first to confirm the match.\"},{\"q\":\"Does Osborne & Little make fabric as well as wallpaper?\",\"a\":\"Yes. Osborne & Little produces both wallpapers (sold by the roll) and coordinating fabrics (sold by the yard). Designer Wallcoverings carries both, so you can pair a wallcovering with a matching or complementary drapery or upholstery fabric.\"},{\"q\":\"What is Osborne & Little known for?\",\"a\":\"Pattern-led British design — botanical and floral trails, damasks, chinoiserie, and bold geometrics, often on metallic or richly colored grounds. The group also produces the Nina Campbell and Matthew Williamson lines.\"},{\"q\":\"Can I order a sample of Osborne & Little wallpaper?\",\"a\":\"Yes — Designer Wallcoverings offers a $4.25 memo sample so you can see the true color, scale, and finish in your own room before buying full rolls.\"}]"},{"ownerId":"gid://shopify/Collection/298974314547","namespace":"custom","key":"category","type":"single_line_text_field","value":"wallcovering"}]}}
\ No newline at end of file
diff --git a/docs/aeo-drafts/collection-metafields/versace-wallpaper.faq.json b/docs/aeo-drafts/collection-metafields/versace-wallpaper.faq.json
new file mode 100644
index 0000000..17e5e72
--- /dev/null
+++ b/docs/aeo-drafts/collection-metafields/versace-wallpaper.faq.json
@@ -0,0 +1,26 @@
+[
+ {
+ "q": "What is Versace wallpaper?",
+ "a": "Versace wallpaper is the official wallcovering range of the Italian fashion house Versace, produced under license and sold through specialty design retailers including Designer Wallcoverings. It renders Versace's Baroque design language — the Medusa emblem, the Greek-key Greca border, and Barocco damask — as premium non-woven wall panels."
+ },
+ {
+ "q": "How much does Versace wallpaper cost?",
+ "a": "Versace Home wallpaper is a luxury line; pricing is per roll and varies by pattern and colorway. Designer Wallcoverings lists current per-roll pricing on each product page and offers a $4.25 memo sample so you can confirm color and scale before ordering full rolls."
+ },
+ {
+ "q": "Is Versace wallpaper authentic?",
+ "a": "Versace Home wallcovering is produced under official license (manufactured by A.S. Creation) and carries Versace branding. Designer Wallcoverings carries the Versace Home line as a genuine, licensed product."
+ },
+ {
+ "q": "What patterns does Versace wallpaper come in?",
+ "a": "The most requested designs are the Medusa medallion, the Greca Greek-key border, Barocco baroque damask, the La Coupe des Dieux mythological scenic, and animalier (leopard) prints, in colorways from black-and-gold to ivory and jewel tones."
+ },
+ {
+ "q": "How do I hang Versace wallpaper?",
+ "a": "Most Versace Home rolls are non-woven and paste-the-wall — you apply adhesive to the wall and hang the dry panel, which makes installation cleaner and future removal easier than traditional paste-the-paper hangings. Order one extra roll for pattern-match waste."
+ },
+ {
+ "q": "Can I get a sample of Versace wallpaper before I buy?",
+ "a": "Yes — Designer Wallcoverings offers a $4.25 memo sample on Versace Home patterns so you can check the true color, sheen, and gilding in your own light before committing to full rolls."
+ }
+]
\ No newline at end of file
diff --git a/docs/aeo-drafts/collection-metafields/versace-wallpaper.metafieldsSet.json b/docs/aeo-drafts/collection-metafields/versace-wallpaper.metafieldsSet.json
new file mode 100644
index 0000000..15b2e81
--- /dev/null
+++ b/docs/aeo-drafts/collection-metafields/versace-wallpaper.metafieldsSet.json
@@ -0,0 +1 @@
+{"query":"mutation SetAeoMetafields($metafields: [MetafieldsSetInput!]!) {\n metafieldsSet(metafields: $metafields) {\n metafields { key namespace ownerType type }\n userErrors { field message }\n }\n}","variables":{"metafields":[{"ownerId":"gid://shopify/Collection/79911911536","namespace":"custom","key":"faq","type":"json","value":"[{\"q\":\"What is Versace wallpaper?\",\"a\":\"Versace wallpaper is the official wallcovering range of the Italian fashion house Versace, produced under license and sold through specialty design retailers including Designer Wallcoverings. It renders Versace's Baroque design language — the Medusa emblem, the Greek-key Greca border, and Barocco damask — as premium non-woven wall panels.\"},{\"q\":\"How much does Versace wallpaper cost?\",\"a\":\"Versace Home wallpaper is a luxury line; pricing is per roll and varies by pattern and colorway. Designer Wallcoverings lists current per-roll pricing on each product page and offers a $4.25 memo sample so you can confirm color and scale before ordering full rolls.\"},{\"q\":\"Is Versace wallpaper authentic?\",\"a\":\"Versace Home wallcovering is produced under official license (manufactured by A.S. Creation) and carries Versace branding. Designer Wallcoverings carries the Versace Home line as a genuine, licensed product.\"},{\"q\":\"What patterns does Versace wallpaper come in?\",\"a\":\"The most requested designs are the Medusa medallion, the Greca Greek-key border, Barocco baroque damask, the La Coupe des Dieux mythological scenic, and animalier (leopard) prints, in colorways from black-and-gold to ivory and jewel tones.\"},{\"q\":\"How do I hang Versace wallpaper?\",\"a\":\"Most Versace Home rolls are non-woven and paste-the-wall — you apply adhesive to the wall and hang the dry panel, which makes installation cleaner and future removal easier than traditional paste-the-paper hangings. Order one extra roll for pattern-match waste.\"},{\"q\":\"Can I get a sample of Versace wallpaper before I buy?\",\"a\":\"Yes — Designer Wallcoverings offers a $4.25 memo sample on Versace Home patterns so you can check the true color, sheen, and gilding in your own light before committing to full rolls.\"}]"},{"ownerId":"gid://shopify/Collection/79911911536","namespace":"custom","key":"category","type":"single_line_text_field","value":"wallcovering"}]}}
\ No newline at end of file
diff --git a/docs/aeo-drafts/collection-metafields/zuber-wallcoverings.faq.json b/docs/aeo-drafts/collection-metafields/zuber-wallcoverings.faq.json
new file mode 100644
index 0000000..e75bf97
--- /dev/null
+++ b/docs/aeo-drafts/collection-metafields/zuber-wallcoverings.faq.json
@@ -0,0 +1,26 @@
+[
+ {
+ "q": "What is Zuber wallpaper?",
+ "a": "Zuber wallpaper is scenic, hand-block-printed panoramic wallpaper made by Zuber & Cie of Rixheim, France, founded in 1797. Zuber is the only manufacturer still printing these panoramas from its original 18th- and 19th-century woodblocks, using the same distemper technique."
+ },
+ {
+ "q": "Why is Zuber wallpaper so expensive?",
+ "a": "Each Zuber scenic is hand-printed one woodblock and one color at a time — a full panorama can take thousands of block impressions and hundreds of distinct colors, produced by hand in Alsace. That craftsmanship, plus the historic archive of original blocks, makes it among the most valuable wallpaper in the world."
+ },
+ {
+ "q": "Is Zuber wallpaper in the White House?",
+ "a": "Yes. Zuber's Vues d'Amerique du Nord ('Views of North America,' first printed 1834) hangs in the Diplomatic Reception Room of the White House, one of the most famous installations of scenic wallpaper anywhere."
+ },
+ {
+ "q": "Where can I buy Zuber wallpaper?",
+ "a": "Zuber is sold through select luxury retailers. Designer Wallcoverings offers Zuber scenic panoramas and decorative papers; because these are made to order, reach out for current pricing and lead times, and request a memo sample to confirm colors."
+ },
+ {
+ "q": "How is Zuber wallpaper made?",
+ "a": "It is printed by hand from carved wooden blocks — each color is applied with a separate block, layer by layer, using opaque distemper paint on paper. The original blocks, some over 200 years old, are still used today."
+ },
+ {
+ "q": "Can Zuber panoramas be customized?",
+ "a": "Zuber scenics are made to order and can often be adapted in colorway, ground, and panel layout to suit a specific wall. Contact Designer Wallcoverings to discuss a bespoke Zuber installation."
+ }
+]
\ No newline at end of file
diff --git a/docs/aeo-drafts/collection-metafields/zuber-wallcoverings.metafieldsSet.json b/docs/aeo-drafts/collection-metafields/zuber-wallcoverings.metafieldsSet.json
new file mode 100644
index 0000000..2df2763
--- /dev/null
+++ b/docs/aeo-drafts/collection-metafields/zuber-wallcoverings.metafieldsSet.json
@@ -0,0 +1 @@
+{"query":"mutation SetAeoMetafields($metafields: [MetafieldsSetInput!]!) {\n metafieldsSet(metafields: $metafields) {\n metafields { key namespace ownerType type }\n userErrors { field message }\n }\n}","variables":{"metafields":[{"ownerId":"gid://shopify/Collection/299575803955","namespace":"custom","key":"faq","type":"json","value":"[{\"q\":\"What is Zuber wallpaper?\",\"a\":\"Zuber wallpaper is scenic, hand-block-printed panoramic wallpaper made by Zuber & Cie of Rixheim, France, founded in 1797. Zuber is the only manufacturer still printing these panoramas from its original 18th- and 19th-century woodblocks, using the same distemper technique.\"},{\"q\":\"Why is Zuber wallpaper so expensive?\",\"a\":\"Each Zuber scenic is hand-printed one woodblock and one color at a time — a full panorama can take thousands of block impressions and hundreds of distinct colors, produced by hand in Alsace. That craftsmanship, plus the historic archive of original blocks, makes it among the most valuable wallpaper in the world.\"},{\"q\":\"Is Zuber wallpaper in the White House?\",\"a\":\"Yes. Zuber's Vues d'Amerique du Nord ('Views of North America,' first printed 1834) hangs in the Diplomatic Reception Room of the White House, one of the most famous installations of scenic wallpaper anywhere.\"},{\"q\":\"Where can I buy Zuber wallpaper?\",\"a\":\"Zuber is sold through select luxury retailers. Designer Wallcoverings offers Zuber scenic panoramas and decorative papers; because these are made to order, reach out for current pricing and lead times, and request a memo sample to confirm colors.\"},{\"q\":\"How is Zuber wallpaper made?\",\"a\":\"It is printed by hand from carved wooden blocks — each color is applied with a separate block, layer by layer, using opaque distemper paint on paper. The original blocks, some over 200 years old, are still used today.\"},{\"q\":\"Can Zuber panoramas be customized?\",\"a\":\"Zuber scenics are made to order and can often be adapted in colorway, ground, and panel layout to suit a specific wall. Contact Designer Wallcoverings to discuss a bespoke Zuber installation.\"}]"},{"ownerId":"gid://shopify/Collection/299575803955","namespace":"custom","key":"category","type":"single_line_text_field","value":"mural"}]}}
\ No newline at end of file
diff --git a/docs/aeo-drafts/render-proof/render-verify-20260726-2053.json b/docs/aeo-drafts/render-proof/render-verify-20260726-2053.json
new file mode 100644
index 0000000..6e9086c
--- /dev/null
+++ b/docs/aeo-drafts/render-proof/render-verify-20260726-2053.json
@@ -0,0 +1,41 @@
+[
+ {
+ "url": "https://www.designerwallcoverings.com/collections/versace-wallpaper",
+ "kind": "collection body_html",
+ "status": 200,
+ "htmlLen": 1523689,
+ "hasAeoAnswer": true,
+ "hasAeoBlock": true,
+ "hasFaq": true,
+ "hasPhrase": true,
+ "hasJsonLdFaq": false,
+ "excerpt": "dw-aeo-block\"> <p class=\"dw-aeo-answer\"><strong>Versace wallpaper</strong> is the wallcovering line of the Italian luxury house Gianni Versace S.r.l., translating the maison's signature Baroque motifs — the Medusa head, ",
+ "hasRte": true
+ },
+ {
+ "url": "https://www.designerwallcoverings.com/collections/osborne-little",
+ "kind": "collection body_html",
+ "status": 200,
+ "htmlLen": 1503151,
+ "hasAeoAnswer": true,
+ "hasAeoBlock": true,
+ "hasFaq": true,
+ "hasPhrase": true,
+ "hasJsonLdFaq": false,
+ "excerpt": "dw-aeo-block\"> <p class=\"dw-aeo-answer\"><strong>Osborne & Little</strong> is a British luxury wallpaper and fabric house founded in London in 1968 by brothers-in-law Peter Osborne and Antony Little. Known for hand-cr",
+ "hasRte": true
+ },
+ {
+ "url": "https://www.designerwallcoverings.com/pages/wall-coverings",
+ "kind": "new page body",
+ "status": 200,
+ "htmlLen": 1242909,
+ "hasAeoAnswer": true,
+ "hasAeoBlock": true,
+ "hasFaq": true,
+ "hasPhrase": true,
+ "hasJsonLdFaq": false,
+ "excerpt": "dw-aeo-block\" data-aeo=\"wall-coverings\"> <p class=\"dw-aeo-answer\"><strong>Wall coverings</strong> are decorative or protective materials applied to interior walls — including wallpaper, grasscloth, vinyl, cork, silk, flo",
+ "hasRte": true
+ }
+]
diff --git a/docs/aeo-drafts/theme-snippets/APPLY-page-jsonld.sh b/docs/aeo-drafts/theme-snippets/APPLY-page-jsonld.sh
new file mode 100755
index 0000000..6c4e6e0
--- /dev/null
+++ b/docs/aeo-drafts/theme-snippets/APPLY-page-jsonld.sh
@@ -0,0 +1,44 @@
+#!/usr/bin/env bash
+# TK-20 GATED — install the handle-keyed page JSON-LD snippet on the LIVE theme.
+# Emits WebPage + FAQPage JSON-LD on /pages/wall-coverings + /pages/designer-wallpaper.
+# DO NOT RUN until Steve GO. Requires SHOPIFY_THEME_TOKEN (theme asset write scope).
+#
+# Preconditions:
+# - LIVE theme id 144396058675 (main). Re-confirm before running.
+# - This script lives in docs/aeo-drafts/theme-snippets/ next to the two source files.
+set -euo pipefail
+TOKEN="${SHOPIFY_THEME_TOKEN:?export SHOPIFY_THEME_TOKEN first}"
+STORE="designer-laboratory-sandbox.myshopify.com"
+THEME="144396058675"
+API="https://$STORE/admin/api/2024-10/themes/$THEME/assets.json"
+DIR="$(cd "$(dirname "$0")" && pwd)"
+
+echo "== [0/3] backup current sections/page.liquid =="
+curl -s "$API?asset%5Bkey%5D=sections/page.liquid" -H "X-Shopify-Access-Token: $TOKEN" \
+ | node -e 'let d="";process.stdin.on("data",c=>d+=c).on("end",()=>{require("fs").writeFileSync(process.argv[1],JSON.parse(d).asset.value)})' \
+ "$DIR/sections-page.liquid.LIVE-BACKUP-$(date +%Y%m%dT%H%M%S)"
+echo " backup saved to $DIR/"
+
+echo "== [1/3] PUT snippets/dw-aeo-jsonld.liquid =="
+node -e '
+ const fs=require("fs");
+ const val=fs.readFileSync(process.argv[1],"utf8");
+ process.stdout.write(JSON.stringify({asset:{key:"snippets/dw-aeo-jsonld.liquid",value:val}}));
+' "$DIR/dw-aeo-jsonld.liquid" > /tmp/aeo-snippet-put.json
+curl -s -X PUT "$API" -H "X-Shopify-Access-Token: $TOKEN" -H "Content-Type: application/json" \
+ --data-binary @/tmp/aeo-snippet-put.json | tee /tmp/aeo-snippet-put-resp.json | head -c 300; echo
+
+echo "== [2/3] PUT sections/page.liquid (adds the render hook) =="
+node -e '
+ const fs=require("fs");
+ // strip the leading TK-20 comment block from the .PROPOSED before shipping
+ let val=fs.readFileSync(process.argv[1],"utf8");
+ val=val.replace(/^{%- comment -%}[\s\S]*?{%- endcomment -%}\n/, "");
+ process.stdout.write(JSON.stringify({asset:{key:"sections/page.liquid",value:val}}));
+' "$DIR/sections-page.liquid.PROPOSED" > /tmp/aeo-page-put.json
+curl -s -X PUT "$API" -H "X-Shopify-Access-Token: $TOKEN" -H "Content-Type: application/json" \
+ --data-binary @/tmp/aeo-page-put.json | tee /tmp/aeo-page-put-resp.json | head -c 300; echo
+
+echo "== [3/3] verify (re-render with Playwright) =="
+echo " node ../../scripts/aeo-render-verify.mjs # expect hasJsonLdFaq:true on the page"
+echo "DONE — rollback: PUT the sections-page.liquid.LIVE-BACKUP-* file back, and DELETE snippets/dw-aeo-jsonld.liquid."
diff --git a/docs/aeo-drafts/theme-snippets/dw-aeo-jsonld.liquid b/docs/aeo-drafts/theme-snippets/dw-aeo-jsonld.liquid
new file mode 100644
index 0000000..a7aafc9
--- /dev/null
+++ b/docs/aeo-drafts/theme-snippets/dw-aeo-jsonld.liquid
@@ -0,0 +1,393 @@
+{%- comment -%}
+ dw-aeo-jsonld.liquid — DRAFT (TK-20, DW consulting) — do NOT inject until Steve GO.
+
+ Emits the reviewed/approved FAQPage (and WebPage for landing pages) JSON-LD for the
+ striking-distance AEO targets, KEYED ON HANDLE. Generated from the committed
+ docs/aeo-drafts/*.jsonld by scripts/aeo-build-jsonld-snippet.mjs — regenerate, do not
+ hand-edit, so the schema stays in sync with the approved copy.
+
+ WHY THIS SNIPPET EXISTS
+ -----------------------
+ * PAGES (/pages/wall-coverings, /pages/designer-wallpaper): sections/page.liquid renders
+ page.content visibly but emits NO FAQPage/WebPage JSON-LD. This snippet supplies it.
+ * COLLECTIONS (versace-wallpaper, osborne-little, zuber-wallcoverings): the theme ALREADY
+ emits FAQPage + CollectionPage + BreadcrumbList from sections/dw-collection-hero.liquid
+ when the collection's custom.faq metafield is populated. The RECOMMENDED path for
+ collections is therefore to WRITE THE METAFIELDS (see the memo), not this snippet.
+ The collection branches below are a FALLBACK — they emit FAQPage ONLY, and only when
+ custom.faq is blank, so they never double-emit.
+
+ INSTALL (both are Steve-gated theme writes — see the memo for exact PUT commands):
+ 1. PUT this file to snippets/dw-aeo-jsonld.liquid on the live theme.
+ 2. Add {% render 'dw-aeo-jsonld' %} near the end of sections/page.liquid
+ (covers pages). For the collection fallback, also add it to
+ sections/dw-collection-hero.liquid (guarded branch handles the dedupe).
+{%- endcomment -%}
+{%- liquid
+ assign _tpl = template.name
+ if _tpl == 'page'
+ assign _aeo_handle = page.handle
+ elsif _tpl == 'collection'
+ assign _aeo_handle = collection.handle
+ else
+ assign _aeo_handle = ''
+ endif
+-%}
+{%- case _aeo_handle -%}
+ {%- when 'versace-wallpaper' -%}
+ {%- assign _mf_faq = collection.metafields.custom.faq.value -%}
+ {%- if _mf_faq == blank -%}
+ <script type="application/ld+json">
+ {
+ "@context": "https://schema.org",
+ "@graph": [
+ {
+ "@type": "FAQPage",
+ "@id": "https://www.designerwallcoverings.com/collections/versace-wallpaper#faq",
+ "mainEntity": [
+ {
+ "@type": "Question",
+ "name": "What is Versace wallpaper?",
+ "acceptedAnswer": {
+ "@type": "Answer",
+ "text": "Versace wallpaper is the official wallcovering range of the Italian fashion house Versace, produced under license and sold through specialty design retailers including Designer Wallcoverings. It renders Versace's Baroque design language — the Medusa emblem, the Greek-key Greca border, and Barocco damask — as premium non-woven wall panels."
+ }
+ },
+ {
+ "@type": "Question",
+ "name": "How much does Versace wallpaper cost?",
+ "acceptedAnswer": {
+ "@type": "Answer",
+ "text": "Versace Home wallpaper is a luxury line; pricing is per roll and varies by pattern and colorway. Designer Wallcoverings lists current per-roll pricing on each product page and offers a $4.25 memo sample so you can confirm color and scale before ordering full rolls."
+ }
+ },
+ {
+ "@type": "Question",
+ "name": "Is Versace wallpaper authentic?",
+ "acceptedAnswer": {
+ "@type": "Answer",
+ "text": "Versace Home wallcovering is produced under official license (manufactured by A.S. Creation) and carries Versace branding. Designer Wallcoverings carries the Versace Home line as a genuine, licensed product."
+ }
+ },
+ {
+ "@type": "Question",
+ "name": "What patterns does Versace wallpaper come in?",
+ "acceptedAnswer": {
+ "@type": "Answer",
+ "text": "The most requested designs are the Medusa medallion, the Greca Greek-key border, Barocco baroque damask, the La Coupe des Dieux mythological scenic, and animalier (leopard) prints, in colorways from black-and-gold to ivory and jewel tones."
+ }
+ },
+ {
+ "@type": "Question",
+ "name": "How do I hang Versace wallpaper?",
+ "acceptedAnswer": {
+ "@type": "Answer",
+ "text": "Most Versace Home rolls are non-woven and paste-the-wall — you apply adhesive to the wall and hang the dry panel, which makes installation cleaner and future removal easier than traditional paste-the-paper hangings. Order one extra roll for pattern-match waste."
+ }
+ },
+ {
+ "@type": "Question",
+ "name": "Can I get a sample of Versace wallpaper before I buy?",
+ "acceptedAnswer": {
+ "@type": "Answer",
+ "text": "Yes — Designer Wallcoverings offers a $4.25 memo sample on Versace Home patterns so you can check the true color, sheen, and gilding in your own light before committing to full rolls."
+ }
+ }
+ ]
+ }
+ ]
+ }
+ </script>
+ {%- endif -%}
+ {%- when 'osborne-little' -%}
+ {%- assign _mf_faq = collection.metafields.custom.faq.value -%}
+ {%- if _mf_faq == blank -%}
+ <script type="application/ld+json">
+ {
+ "@context": "https://schema.org",
+ "@graph": [
+ {
+ "@type": "FAQPage",
+ "@id": "https://www.designerwallcoverings.com/collections/osborne-little#faq",
+ "mainEntity": [
+ {
+ "@type": "Question",
+ "name": "Who are Osborne & Little?",
+ "acceptedAnswer": {
+ "@type": "Answer",
+ "text": "Osborne & Little is a British design house founded in London in 1968 by Peter Osborne and Antony Little. It designs and manufactures luxury wallpapers and fabrics and is regarded as one of England's leading interior-design brands."
+ }
+ },
+ {
+ "@type": "Question",
+ "name": "Where can I buy Osborne & Little wallpaper?",
+ "acceptedAnswer": {
+ "@type": "Answer",
+ "text": "Osborne & Little is sold through specialty interior retailers, including Designer Wallcoverings, which carries the Osborne & Little wallpaper and fabric range with full-roll ordering, current pricing on each product page, and $4.25 memo samples."
+ }
+ },
+ {
+ "@type": "Question",
+ "name": "Is Osborne & Little wallpaper expensive?",
+ "acceptedAnswer": {
+ "@type": "Answer",
+ "text": "Osborne & Little is a premium designer line, priced per roll above mass-market wallpaper. Exact pricing depends on the collection and colorway and is shown on each Designer Wallcoverings product page; order a $4.25 memo sample first to confirm the match."
+ }
+ },
+ {
+ "@type": "Question",
+ "name": "Does Osborne & Little make fabric as well as wallpaper?",
+ "acceptedAnswer": {
+ "@type": "Answer",
+ "text": "Yes. Osborne & Little produces both wallpapers (sold by the roll) and coordinating fabrics (sold by the yard). Designer Wallcoverings carries both, so you can pair a wallcovering with a matching or complementary drapery or upholstery fabric."
+ }
+ },
+ {
+ "@type": "Question",
+ "name": "What is Osborne & Little known for?",
+ "acceptedAnswer": {
+ "@type": "Answer",
+ "text": "Pattern-led British design — botanical and floral trails, damasks, chinoiserie, and bold geometrics, often on metallic or richly colored grounds. The group also produces the Nina Campbell and Matthew Williamson lines."
+ }
+ },
+ {
+ "@type": "Question",
+ "name": "Can I order a sample of Osborne & Little wallpaper?",
+ "acceptedAnswer": {
+ "@type": "Answer",
+ "text": "Yes — Designer Wallcoverings offers a $4.25 memo sample so you can see the true color, scale, and finish in your own room before buying full rolls."
+ }
+ }
+ ]
+ }
+ ]
+ }
+ </script>
+ {%- endif -%}
+ {%- when 'zuber-wallcoverings' -%}
+ {%- assign _mf_faq = collection.metafields.custom.faq.value -%}
+ {%- if _mf_faq == blank -%}
+ <script type="application/ld+json">
+ {
+ "@context": "https://schema.org",
+ "@graph": [
+ {
+ "@type": "FAQPage",
+ "@id": "https://www.designerwallcoverings.com/collections/zuber-wallcoverings#faq",
+ "mainEntity": [
+ {
+ "@type": "Question",
+ "name": "What is Zuber wallpaper?",
+ "acceptedAnswer": {
+ "@type": "Answer",
+ "text": "Zuber wallpaper is scenic, hand-block-printed panoramic wallpaper made by Zuber & Cie of Rixheim, France, founded in 1797. Zuber is the only manufacturer still printing these panoramas from its original 18th- and 19th-century woodblocks, using the same distemper technique."
+ }
+ },
+ {
+ "@type": "Question",
+ "name": "Why is Zuber wallpaper so expensive?",
+ "acceptedAnswer": {
+ "@type": "Answer",
+ "text": "Each Zuber scenic is hand-printed one woodblock and one color at a time — a full panorama can take thousands of block impressions and hundreds of distinct colors, produced by hand in Alsace. That craftsmanship, plus the historic archive of original blocks, makes it among the most valuable wallpaper in the world."
+ }
+ },
+ {
+ "@type": "Question",
+ "name": "Is Zuber wallpaper in the White House?",
+ "acceptedAnswer": {
+ "@type": "Answer",
+ "text": "Yes. Zuber's Vues d'Amerique du Nord ('Views of North America,' first printed 1834) hangs in the Diplomatic Reception Room of the White House, one of the most famous installations of scenic wallpaper anywhere."
+ }
+ },
+ {
+ "@type": "Question",
+ "name": "Where can I buy Zuber wallpaper?",
+ "acceptedAnswer": {
+ "@type": "Answer",
+ "text": "Zuber is sold through select luxury retailers. Designer Wallcoverings offers Zuber scenic panoramas and decorative papers; because these are made to order, reach out for current pricing and lead times, and request a memo sample to confirm colors."
+ }
+ },
+ {
+ "@type": "Question",
+ "name": "How is Zuber wallpaper made?",
+ "acceptedAnswer": {
+ "@type": "Answer",
+ "text": "It is printed by hand from carved wooden blocks — each color is applied with a separate block, layer by layer, using opaque distemper paint on paper. The original blocks, some over 200 years old, are still used today."
+ }
+ },
+ {
+ "@type": "Question",
+ "name": "Can Zuber panoramas be customized?",
+ "acceptedAnswer": {
+ "@type": "Answer",
+ "text": "Zuber scenics are made to order and can often be adapted in colorway, ground, and panel layout to suit a specific wall. Contact Designer Wallcoverings to discuss a bespoke Zuber installation."
+ }
+ }
+ ]
+ }
+ ]
+ }
+ </script>
+ {%- endif -%}
+ {%- when 'wall-coverings' -%}
+ {%- comment -%} page: theme emits no FAQPage; safe to emit {%- endcomment -%}
+ <script type="application/ld+json">
+ {
+ "@context": "https://schema.org",
+ "@graph": [
+ {
+ "@type": "WebPage",
+ "@id": "https://www.designerwallcoverings.com/pages/wall-coverings#webpage",
+ "url": "https://www.designerwallcoverings.com/pages/wall-coverings",
+ "name": "Wall Coverings — Types, Materials & How to Choose",
+ "description": "A guide to wall coverings: wallpaper, grasscloth, vinyl, cork, silk, flocked, mural, and commercial Type II wallcoverings — and how to choose. Thousands of designs with $4.25 memo samples.",
+ "about": {
+ "@type": "Thing",
+ "name": "Wall coverings"
+ },
+ "isPartOf": {
+ "@type": "WebSite",
+ "name": "Designer Wallcoverings",
+ "url": "https://www.designerwallcoverings.com"
+ },
+ "keywords": "wall coverings, wallcoverings, types of wall coverings, grasscloth, vinyl wallcovering, cork, silk, flocked, commercial wallcovering, type ii"
+ },
+ {
+ "@type": "FAQPage",
+ "@id": "https://www.designerwallcoverings.com/pages/wall-coverings#faq",
+ "mainEntity": [
+ {
+ "@type": "Question",
+ "name": "What are wall coverings?",
+ "acceptedAnswer": {
+ "@type": "Answer",
+ "text": "Wall coverings are materials applied to interior walls for decoration or protection. They include wallpaper, grasscloth, vinyl, cork, silk, flocked, and mural wallcoverings, as well as durable commercial (Type II) contract wallcoverings. Designer Wallcoverings carries thousands across these categories."
+ }
+ },
+ {
+ "@type": "Question",
+ "name": "What is the difference between wallpaper and wall coverings?",
+ "acceptedAnswer": {
+ "@type": "Answer",
+ "text": "'Wallpaper' usually refers to printed paper or non-woven wall material, while 'wall coverings' is the broader umbrella that also includes grasscloth, vinyl, cork, silk, textile, and commercial-grade materials. All wallpaper is a wall covering, but not all wall coverings are paper."
+ }
+ },
+ {
+ "@type": "Question",
+ "name": "What are the most durable wall coverings?",
+ "acceptedAnswer": {
+ "@type": "Answer",
+ "text": "Type II commercial vinyl wallcoverings are the most durable and are rated for high-traffic and hospitality use; they resist scrubbing and abrasion. For residential durability, non-woven and washable vinyl papers hold up well in kitchens and baths."
+ }
+ },
+ {
+ "@type": "Question",
+ "name": "How much do wall coverings cost?",
+ "acceptedAnswer": {
+ "@type": "Answer",
+ "text": "It depends on the material and design house — residential designer wallpaper is priced per roll, textiles and specialty materials per yard, and hand-crafted scenics are made to order. Designer Wallcoverings shows current pricing on every product page and offers a $4.25 memo sample."
+ }
+ },
+ {
+ "@type": "Question",
+ "name": "Can I get samples of wall coverings before buying?",
+ "acceptedAnswer": {
+ "@type": "Answer",
+ "text": "Yes. Designer Wallcoverings offers a $4.25 memo sample on most patterns so you can confirm color, texture, and scale in your own light before ordering full rolls or yardage."
+ }
+ },
+ {
+ "@type": "Question",
+ "name": "What types of wall coverings does Designer Wallcoverings carry?",
+ "acceptedAnswer": {
+ "@type": "Answer",
+ "text": "Residential and commercial: designer wallpaper, grasscloth, vinyl, cork, silk, flocked, metallic/mica, and murals/scenics — from houses including Cole & Son, Osborne & Little, Versace Home, Zuber, de Gournay, Schumacher, and Thibaut."
+ }
+ }
+ ]
+ }
+ ]
+ }
+ </script>
+ {%- when 'designer-wallpaper' -%}
+ {%- comment -%} page: theme emits no FAQPage; safe to emit {%- endcomment -%}
+ <script type="application/ld+json">
+ {
+ "@context": "https://schema.org",
+ "@graph": [
+ {
+ "@type": "WebPage",
+ "@id": "https://www.designerwallcoverings.com/pages/designer-wallpaper#webpage",
+ "url": "https://www.designerwallcoverings.com/pages/designer-wallpaper",
+ "name": "Designer Wallpaper — Luxury Wallpaper from the World's Leading Houses",
+ "description": "Designer wallpaper from Cole & Son, Osborne & Little, Versace Home, Zuber, de Gournay, Schumacher, Thibaut and more. Original artwork, premium materials, $4.25 memo samples.",
+ "about": {
+ "@type": "Thing",
+ "name": "Designer wallpaper"
+ },
+ "isPartOf": {
+ "@type": "WebSite",
+ "name": "Designer Wallcoverings",
+ "url": "https://www.designerwallcoverings.com"
+ },
+ "keywords": "designer wallpaper, luxury wallpaper, high end wallpaper, cole and son, osborne and little, versace home, zuber, de gournay, schumacher, thibaut"
+ },
+ {
+ "@type": "FAQPage",
+ "@id": "https://www.designerwallcoverings.com/pages/designer-wallpaper#faq",
+ "mainEntity": [
+ {
+ "@type": "Question",
+ "name": "What is designer wallpaper?",
+ "acceptedAnswer": {
+ "@type": "Answer",
+ "text": "Designer wallpaper is premium wallpaper created by established design houses and studios — such as Cole & Son, Osborne & Little, Versace Home, and Zuber — featuring original artwork, higher-grade materials, and limited production, as opposed to mass-market wallpaper."
+ }
+ },
+ {
+ "@type": "Question",
+ "name": "What makes wallpaper 'designer' rather than regular wallpaper?",
+ "acceptedAnswer": {
+ "@type": "Answer",
+ "text": "Original, copyrighted artwork; premium substrates (non-woven, grasscloth, silk, hand-printed or hand-painted grounds); and production by a named design house or studio. Designer papers are typically sold through trade and specialty retailers rather than big-box stores."
+ }
+ },
+ {
+ "@type": "Question",
+ "name": "Which designer wallpaper brands does Designer Wallcoverings carry?",
+ "acceptedAnswer": {
+ "@type": "Answer",
+ "text": "Leading houses including Cole & Son, Osborne & Little, Versace Home, Zuber, de Gournay, Schumacher, Thibaut, Ralph Lauren Home, Phillip Jeffries, and Maya Romanoff, among many others."
+ }
+ },
+ {
+ "@type": "Question",
+ "name": "How much does designer wallpaper cost?",
+ "acceptedAnswer": {
+ "@type": "Answer",
+ "text": "Designer wallpaper is priced per roll and sits above mass-market wallpaper; hand-crafted and made-to-order lines (like Zuber or de Gournay) are higher still. Designer Wallcoverings shows current pricing on each product page and offers a $4.25 memo sample."
+ }
+ },
+ {
+ "@type": "Question",
+ "name": "Where can I buy designer wallpaper online?",
+ "acceptedAnswer": {
+ "@type": "Answer",
+ "text": "Designer Wallcoverings sells designer wallpaper online from hundreds of houses, with per-roll ordering, current pricing on each product page, and $4.25 memo samples so you can confirm the design in your own space first."
+ }
+ },
+ {
+ "@type": "Question",
+ "name": "Can I order a sample of designer wallpaper?",
+ "acceptedAnswer": {
+ "@type": "Answer",
+ "text": "Yes — a $4.25 memo sample is available on most designer patterns so you can check the true color, texture, and scale before buying full rolls."
+ }
+ }
+ ]
+ }
+ ]
+ }
+ </script>
+ {%- else -%}
+{%- endcase -%}
diff --git a/docs/aeo-drafts/theme-snippets/sections-page.liquid.PROPOSED b/docs/aeo-drafts/theme-snippets/sections-page.liquid.PROPOSED
new file mode 100644
index 0000000..de285cd
--- /dev/null
+++ b/docs/aeo-drafts/theme-snippets/sections-page.liquid.PROPOSED
@@ -0,0 +1,20 @@
+{%- comment -%}
+ TK-20 DRAFT — PROPOSED sections/page.liquid.
+ Only change vs LIVE: the final {% render 'dw-aeo-jsonld' %} line, which emits
+ handle-keyed WebPage + FAQPage JSON-LD on /pages/wall-coverings + /pages/designer-wallpaper.
+ The snippet no-ops on every other page handle. Nothing else is modified.
+ DO NOT PUT to the live theme until Steve GO (theme write is gated).
+{%- endcomment -%}
+<h1 class="page-title">{{ page.title }}</h1>
+
+{% render 'breadcrumbs' %}
+
+<div class="page-content rte">
+ {{ page.content }}
+</div>
+
+{% if settings.dw_enable_recently_viewed %}
+ {% render 'recently-viewed' %}
+{% endif %}
+
+{% render 'dw-aeo-jsonld' %}
diff --git a/scripts/aeo-build-collection-metafields.mjs b/scripts/aeo-build-collection-metafields.mjs
new file mode 100644
index 0000000..7b7952d
--- /dev/null
+++ b/scripts/aeo-build-collection-metafields.mjs
@@ -0,0 +1,85 @@
+#!/usr/bin/env node
+// TK-20 — Build the DRAFT collection-metafield payload + ready-to-run (GATED)
+// `metafieldsSet` mutations that populate custom.faq (json) + custom.category
+// (single_line_text_field) on the 3 AEO collections, from the committed FAQ drafts.
+// The live theme's sections/dw-collection-hero.liquid already renders these
+// metafields as a VISIBLE FAQ <details> + emits FAQPage + CollectionPage JSON-LD.
+// DRAFT-ONLY: writes files into the repo. Performs NO Shopify write.
+import fs from 'fs';
+import path from 'path';
+import { fileURLToPath } from 'url';
+
+const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
+const DRAFTS = path.join(ROOT, 'docs/aeo-drafts');
+const OUTDIR = path.join(DRAFTS, 'collection-metafields');
+
+// handle → { gid, file, category } (category = brand-voice default; hero falls back to 'wallcovering')
+const COLL = [
+ { handle: 'versace-wallpaper', gid: 'gid://shopify/Collection/79911911536', file: 'versace-wallpaper.jsonld', category: 'wallcovering' },
+ { handle: 'osborne-little', gid: 'gid://shopify/Collection/298974314547', file: 'osborne-and-little.jsonld', category: 'wallcovering' },
+ { handle: 'zuber-wallcoverings', gid: 'gid://shopify/Collection/299575803955', file: 'zuber-wallpaper.jsonld', category: 'mural' },
+];
+
+const read = f => JSON.parse(fs.readFileSync(path.join(DRAFTS, f), 'utf8'));
+
+// Pull the FAQPage mainEntity → [{q,a}] exactly as the theme expects (item.q / item.a).
+function faqPairs(file) {
+ const j = read(file);
+ const faq = (j['@graph'] || []).find(n => n['@type'] === 'FAQPage');
+ if (!faq) throw new Error('no FAQPage in ' + file);
+ return faq.mainEntity.map(qa => ({ q: qa.name, a: qa.acceptedAnswer.text }));
+}
+
+fs.mkdirSync(OUTDIR, { recursive: true });
+const mutations = [];
+for (const c of COLL) {
+ const pairs = faqPairs(c.file);
+ // payload the metafield stores: a JSON *string* (json metafield value is a stringified array)
+ const faqValueString = JSON.stringify(pairs);
+ fs.writeFileSync(path.join(OUTDIR, `${c.handle}.faq.json`), JSON.stringify(pairs, null, 2));
+
+ // Ready-to-run GraphQL metafieldsSet mutation (GATED — do not run until Steve GO).
+ const vars = {
+ metafields: [
+ { ownerId: c.gid, namespace: 'custom', key: 'faq', type: 'json', value: faqValueString },
+ { ownerId: c.gid, namespace: 'custom', key: 'category', type: 'single_line_text_field', value: c.category },
+ ],
+ };
+ mutations.push({ handle: c.handle, gid: c.gid, count: pairs.length, vars });
+}
+
+const MUT = `mutation SetAeoMetafields($metafields: [MetafieldsSetInput!]!) {
+ metafieldsSet(metafields: $metafields) {
+ metafields { key namespace ownerType type }
+ userErrors { field message }
+ }
+}`;
+
+// Emit a single shell file with one curl per collection (each carries its own variables).
+const STORE = 'designer-laboratory-sandbox.myshopify.com';
+let sh = `#!/usr/bin/env bash
+# TK-20 GATED — populate custom.faq + custom.category on the 3 AEO collections.
+# The live theme (sections/dw-collection-hero.liquid) renders these as a VISIBLE
+# FAQ + emits FAQPage + CollectionPage JSON-LD. DO NOT RUN until Steve GO.
+# Requires SHOPIFY_ADMIN_TOKEN with write_products scope (collection metafields).
+set -euo pipefail
+TOKEN="\${SHOPIFY_ADMIN_TOKEN:?export SHOPIFY_ADMIN_TOKEN first}"
+STORE="${STORE}"
+API="https://$STORE/admin/api/2024-10/graphql.json"
+`;
+const MUT_JSON = JSON.stringify(MUT);
+for (const m of mutations) {
+ const body = JSON.stringify({ query: MUT, variables: m.vars });
+ fs.writeFileSync(path.join(OUTDIR, `${m.handle}.metafieldsSet.json`), body);
+ sh += `
+echo "== ${m.handle} (${m.count} FAQ) =="
+curl -s "$API" -H "X-Shopify-Access-Token: $TOKEN" -H "Content-Type: application/json" \\
+ --data-binary @"$(dirname "$0")/${m.handle}.metafieldsSet.json" | tee /tmp/aeo-mf-${m.handle}.json
+`;
+}
+fs.writeFileSync(path.join(OUTDIR, 'APPLY-metafields.sh'), sh);
+fs.chmodSync(path.join(OUTDIR, 'APPLY-metafields.sh'), 0o755);
+
+console.log('wrote collection-metafields/ :',
+ fs.readdirSync(OUTDIR).join(', '));
+console.log('FAQ counts:', mutations.map(m => `${m.handle}=${m.count}`).join(' '));
diff --git a/scripts/aeo-build-jsonld-snippet.mjs b/scripts/aeo-build-jsonld-snippet.mjs
new file mode 100644
index 0000000..f721aaa
--- /dev/null
+++ b/scripts/aeo-build-jsonld-snippet.mjs
@@ -0,0 +1,96 @@
+#!/usr/bin/env node
+// TK-20 — Build the DRAFT handle-keyed theme snippet `dw-aeo-jsonld.liquid`
+// from the committed docs/aeo-drafts/*.jsonld files, so the FAQPage schema the
+// snippet emits stays in EXACT sync with the reviewed/approved draft content.
+// DRAFT-ONLY: writes a .liquid file into the repo. It performs NO theme write.
+import fs from 'fs';
+import path from 'path';
+import { fileURLToPath } from 'url';
+
+const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
+const DRAFTS = path.join(ROOT, 'docs/aeo-drafts');
+const OUT = path.join(DRAFTS, 'theme-snippets', 'dw-aeo-jsonld.liquid');
+
+// handle → { file, template } . template = 'collection' | 'page'
+const MAP = [
+ { handle: 'versace-wallpaper', file: 'versace-wallpaper.jsonld', template: 'collection' },
+ { handle: 'osborne-little', file: 'osborne-and-little.jsonld', template: 'collection' },
+ { handle: 'zuber-wallcoverings', file: 'zuber-wallpaper.jsonld', template: 'collection' },
+ { handle: 'wall-coverings', file: 'wall-coverings.jsonld', template: 'page' },
+ { handle: 'designer-wallpaper', file: 'designer-wallpaper.jsonld', template: 'page' },
+];
+
+const read = f => JSON.parse(fs.readFileSync(path.join(DRAFTS, f), 'utf8'));
+
+// From a committed graph, keep only the schema nodes that are SAFE to add without
+// duplicating what the theme already emits:
+// - pages : WebPage + FAQPage (sections/page.liquid emits neither)
+// - collections: FAQPage ONLY (sections/dw-collection-hero.liquid already
+// emits CollectionPage + BreadcrumbList; we must NOT re-emit them)
+function schemaFor(entry) {
+ const j = read(entry.file);
+ const graph = (j['@graph'] || []).filter(n => {
+ if (n['@type'] === 'FAQPage') return true;
+ if (entry.template === 'page' && n['@type'] === 'WebPage') return true;
+ return false; // drop CollectionPage on collections (theme already emits it)
+ });
+ return { '@context': 'https://schema.org', '@graph': graph };
+}
+
+let cases = '';
+for (const e of MAP) {
+ const obj = schemaFor(e);
+ // pretty JSON, indented under the script tag
+ const jsonStr = JSON.stringify(obj, null, 2).split('\n').map(l => ' ' + l).join('\n');
+ const guard = e.template === 'collection'
+ // only emit if the theme's metafield-driven FAQ is NOT set, to avoid a
+ // duplicate FAQPage (dw-collection-hero emits FAQPage from custom.faq).
+ ? ` {%- assign _mf_faq = collection.metafields.custom.faq.value -%}\n {%- if _mf_faq == blank -%}`
+ : ` {%- comment -%} page: theme emits no FAQPage; safe to emit {%- endcomment -%}`;
+ const close = e.template === 'collection' ? ` {%- endif -%}\n` : ``;
+ cases += ` {%- when '${e.handle}' -%}\n${guard}\n <script type="application/ld+json">\n${jsonStr}\n </script>\n${close}`;
+}
+
+const snippet = `{%- comment -%}
+ dw-aeo-jsonld.liquid — DRAFT (TK-20, DW consulting) — do NOT inject until Steve GO.
+
+ Emits the reviewed/approved FAQPage (and WebPage for landing pages) JSON-LD for the
+ striking-distance AEO targets, KEYED ON HANDLE. Generated from the committed
+ docs/aeo-drafts/*.jsonld by scripts/aeo-build-jsonld-snippet.mjs — regenerate, do not
+ hand-edit, so the schema stays in sync with the approved copy.
+
+ WHY THIS SNIPPET EXISTS
+ -----------------------
+ * PAGES (/pages/wall-coverings, /pages/designer-wallpaper): sections/page.liquid renders
+ page.content visibly but emits NO FAQPage/WebPage JSON-LD. This snippet supplies it.
+ * COLLECTIONS (versace-wallpaper, osborne-little, zuber-wallcoverings): the theme ALREADY
+ emits FAQPage + CollectionPage + BreadcrumbList from sections/dw-collection-hero.liquid
+ when the collection's custom.faq metafield is populated. The RECOMMENDED path for
+ collections is therefore to WRITE THE METAFIELDS (see the memo), not this snippet.
+ The collection branches below are a FALLBACK — they emit FAQPage ONLY, and only when
+ custom.faq is blank, so they never double-emit.
+
+ INSTALL (both are Steve-gated theme writes — see the memo for exact PUT commands):
+ 1. PUT this file to snippets/dw-aeo-jsonld.liquid on the live theme.
+ 2. Add {% render 'dw-aeo-jsonld' %} near the end of sections/page.liquid
+ (covers pages). For the collection fallback, also add it to
+ sections/dw-collection-hero.liquid (guarded branch handles the dedupe).
+{%- endcomment -%}
+{%- liquid
+ assign _tpl = template.name
+ if _tpl == 'page'
+ assign _aeo_handle = page.handle
+ elsif _tpl == 'collection'
+ assign _aeo_handle = collection.handle
+ else
+ assign _aeo_handle = ''
+ endif
+-%}
+{%- case _aeo_handle -%}
+${cases} {%- else -%}
+{%- endcase -%}
+`;
+
+fs.mkdirSync(path.dirname(OUT), { recursive: true });
+fs.writeFileSync(OUT, snippet);
+console.log('wrote', path.relative(ROOT, OUT), `(${snippet.length} bytes, ${MAP.length} handles)`);
diff --git a/scripts/aeo-render-verify.mjs b/scripts/aeo-render-verify.mjs
new file mode 100644
index 0000000..4d77c47
--- /dev/null
+++ b/scripts/aeo-render-verify.mjs
@@ -0,0 +1,48 @@
+#!/usr/bin/env node
+// TK-20 READ-ONLY storefront render verification.
+// Loads each AEO target in a real Chromium browser and greps the RENDERED DOM
+// for the AEO marker class + a signature phrase. No writes of any kind.
+import pw from '/Users/macstudio3/Projects/animals/node_modules/playwright/index.js';
+const { chromium } = pw;
+
+const TARGETS = [
+ { url: 'https://www.designerwallcoverings.com/collections/versace-wallpaper', phrase: 'Medusa', kind: 'collection body_html' },
+ { url: 'https://www.designerwallcoverings.com/collections/osborne-little', phrase: 'Osborne', kind: 'collection body_html' },
+ { url: 'https://www.designerwallcoverings.com/pages/wall-coverings', phrase: 'wall covering', kind: 'new page body' },
+];
+
+const browser = await chromium.launch({ headless: true });
+const ctx = await browser.newContext({
+ userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36',
+ viewport: { width: 1280, height: 900 },
+});
+const results = [];
+for (const t of TARGETS) {
+ const page = await ctx.newPage();
+ const r = { url: t.url, kind: t.kind };
+ try {
+ const resp = await page.goto(t.url, { waitUntil: 'domcontentloaded', timeout: 45000 });
+ r.status = resp ? resp.status() : null;
+ // give the theme a moment to hydrate
+ await page.waitForTimeout(2500);
+ const html = await page.content();
+ r.htmlLen = html.length;
+ r.hasAeoAnswer = /dw-aeo-answer/i.test(html);
+ r.hasAeoBlock = /dw-aeo-block/i.test(html);
+ r.hasFaq = /dw-aeo-faq/i.test(html);
+ r.hasPhrase = new RegExp(t.phrase.replace(/[.*+?^${}()|[\]\\]/g,'\\$&'), 'i').test(html);
+ r.hasJsonLdFaq = /"@type"\s*:\s*"FAQPage"/i.test(html);
+ // Grab a small excerpt around the marker if present
+ const idx = html.search(/dw-aeo-answer|dw-aeo-block/i);
+ r.excerpt = idx >= 0 ? html.slice(idx, idx + 220).replace(/\s+/g,' ') : null;
+ // Also check whether body_html content area exists at all (RTE / description container)
+ r.hasRte = /class="[^"]*\brte\b/i.test(html) || /collection[-_]?description/i.test(html);
+ } catch (e) {
+ r.error = String(e).split('\n')[0];
+ } finally {
+ await page.close();
+ }
+ results.push(r);
+}
+await browser.close();
+console.log(JSON.stringify(results, null, 2));
← 63824ff refine: fix 3 contrarian FIX-FIRST findings (DTD opt1, 5/5)
·
back to Consulting Designerwallcoverings Com
·
TK-20: AEO JSON-LD injector draft + read-only render-verify d9016b7 →