Open Graph + Twitter Cards
og:* and twitter:* tags injected into <head>, with image fallback to product/category image and a configurable global default.
Tags emitted
| Tag | Source |
|---|---|
og:type | product on product pages, website everywhere else |
og:title | The current pageConfig.getTitle() (after meta-template observer) |
og:description | The current pageConfig.getDescription() |
og:url | urlBuilder.getCurrentUrl() |
og:site_name | Config byte8_seosuite/open_graph/site_name, falls back to store name |
og:image | Product → product_base_image cache URL. Category → getImageUrl(). Else → configured default image |
twitter:card | Configurable: summary, summary_large_image (default), app, player |
twitter:title | Same as og:title |
twitter:description | Same as og:description |
twitter:image | Same as og:image |
twitter:site | Configurable @handle (skipped if not set) |
Configuration
Stores → Configuration → SEO Suite → Open Graph & Twitter Cards
| Field | Default |
|---|---|
| Enable social meta tags | No |
| og:site_name | (store name) |
| Default share image URL | Empty — set this; product/category images are not always present |
| Twitter card type | summary_large_image |
| Twitter @handle | Empty |
Per-store overrides supported. The default share image accepts either an absolute URL or a path relative to the store base URL.
How og:title and og:description are sourced
The OG ViewModel reads the rendered values from pageConfig — so:
- The meta-template observer fires first (writes templated values into
pageConfigif natives are empty) - The OG ViewModel renders, picking up whatever
pageConfigended up with
This composition means OG tags automatically get the same templated meta as the <title> tag, with no duplication.
GraphQL
Same logic, exposed as seo.open_graph on ProductInterface, CategoryInterface, CmsPage, CmsPageItem:
{
products(filter: { sku: { eq: "AWP-001" } }) {
items {
seo {
open_graph { name content }
}
}
}
}
Returns a flat list of {name, content} pairs — exactly the shape Next.js Metadata.openGraph wants. See VelaFront for a worked example.
Validation
LinkedIn caches aggressively — re-scrape via Post Inspector when you change OG tags or it'll keep showing the old preview for ~7 days.
Notes
- The OG
<meta property="...">rendering and Twitter<meta name="...">rendering are both handled in one phtml — the template detects thetwitter:prefix and uses the right HTML attribute - No JS — pure server-rendered tags. Works identically on Luma, Hyvä, and headless storefronts