Template API
The flat surface ($page->seoneo->renderTitle(), ->ogTitle) and namespace surface ($page->seoneo->og->render(), ->hreflang->alternates) — value getters, partial renderers, and SeoMaestro migration tips.
Two surfaces, one data source
SEO NEO exposes two API surfaces that return the same resolved data. Use whichever reads best in your templates — most projects pick one and stick with it.
- Flat surface — prefix-mangled keys directly on
$page->seoneo:->title,->ogTitle,->renderOg() - Namespace surface — grouped proxies:
->og->title,->og->render(),->twitter->card
Hooks on the underlying resolvers apply to both surfaces — $page->seoneo->og->title === $page->seoneo->ogTitle always.
Full render
The most common case — let SEO NEO inject the full meta block automatically and call the render in your <head> if auto-inject is off:
<?= $page->seoneo->render() ?>
<?= $page->seoneo ?> // Same — __toString delegates to render()
This emits the full <!-- SeoNeo --> … <!-- /SeoNeo --> block. If auto-inject is enabled in module config you don't need to call this at all.
Partial renderers — flat surface
Render individual sections of the head. Each returns HTML (or an empty string if there's nothing to emit) and is hookable:
$page->seoneo->renderTitle() // <title>…</title>
$page->seoneo->renderDescription() // <meta name="description">
$page->seoneo->renderCanonical() // <link rel="canonical">
$page->seoneo->renderRobots() // <meta name="robots"> (only when non-default)
$page->seoneo->renderOg() // All og:* tags
$page->seoneo->renderTwitter() // All twitter:* tags
$page->seoneo->renderHreflang() // <link rel="alternate" hreflang="…"> set
$page->seoneo->renderVerification() // Search-engine verification tags
$page->seoneo->renderAuthor() // <meta name="author">
$page->seoneo->renderSchema() // JSON-LD <script> block (Beta)
Partials don't include the <!-- SeoNeo --> block-marker comments — keeping the output clean for embedding in your own markup.
Partial renderers — namespace surface
The namespace surface groups render and value getters by concern. This mirrors the SeoMaestro API shape, so migrating templates is usually a find-replace of $page->seo to $page->seoneo:
echo $page->seoneo->og->render() // All og:* tags (alias: ->opengraph->render())
echo $page->seoneo->twitter->render()
echo $page->seoneo->hreflang->render()
echo $page->seoneo->verification->render()
echo $page->seoneo->schema->render() // Beta
// Or use __toString — same result
echo $page->seoneo->og
echo $page->seoneo->twitter
Value getters — flat surface
Read resolved values (after the full fallback chain) without markup:
$page->seoneo->title // "Page Title | Site Name"
$page->seoneo->description // "Resolved description"
$page->seoneo->canonical // "https://example.com/page/"
$page->seoneo->robots // "index,follow"
$page->seoneo->keywords // "keyword one, keyword two"
$page->seoneo->author // "Jane Doe"
$page->seoneo->siteName // "Your Site Name"
$page->seoneo->ogTitle // "Page Title" (without separator/site name)
$page->seoneo->ogImage // "https://example.com/site/assets/files/123/hero.jpg"
$page->seoneo->ogType // "article"
$page->seoneo->ogLocale // "en_GB"
$page->seoneo->twitterSite // "@yoursite"
$page->seoneo->twitterCreator // "@author"
$page->seoneo->hreflangCode // "en-GB"
Multi-value getters return arrays (empty array when nothing resolved):
$page->seoneo->authors // ['Jane Doe', 'John Smith']
$page->seoneo->keywordsList // ['keyword one', 'keyword two']
$page->seoneo->ogImageData // ['url' => …, 'width' => …, 'height' => …, …]
$page->seoneo->ogLocaleAlternates // ['de_DE', 'fi_FI']
$page->seoneo->hreflangAlternates // ['en-GB' => 'https://…', 'de' => 'https://…/de/', 'x-default' => '…']
$page->seoneo->schemaGraph // ['@context' => '…', '@graph' => […]] (Beta)
Value getters — namespace surface
The same values via the grouped proxies:
// Open Graph
$page->seoneo->og->title // = ogTitle
$page->seoneo->og->description // = description
$page->seoneo->og->image // = ogImage (URL string)
$page->seoneo->og->imageData // = ogImageData
$page->seoneo->og->type // = ogType
$page->seoneo->og->locale // = ogLocale
$page->seoneo->og->localeAlternates // = ogLocaleAlternates
$page->seoneo->og->url // = canonical
// Twitter
$page->seoneo->twitter->site // = twitterSite
$page->seoneo->twitter->creator // = twitterCreator
// Hreflang
$page->seoneo->hreflang->code // = hreflangCode ("en-GB")
$page->seoneo->hreflang->alternates // = hreflangAlternates
// Schema (Beta)
$page->seoneo->schema->graph // The @graph array
json_encode($page->seoneo->schema) // Full {"@context": …, "@graph": […]} payload
Composing your own <head>
When you want SEO NEO to handle the resolver chain but need fine control over where each section lands in your <head>, disable Auto-inject in module config and compose manually:
<head>
<meta charset="utf-8">
<?= $page->seoneo->renderTitle() ?>
<?= $page->seoneo->renderDescription() ?>
<?= $page->seoneo->renderCanonical() ?>
<?= $page->seoneo->renderRobots() ?>
<?= $page->seoneo->renderOg() ?>
<?= $page->seoneo->renderTwitter() ?>
<link rel="stylesheet" href="/site/templates/styles/main.css">
<?= $page->seoneo->renderHreflang() ?>
<?= $page->seoneo->renderVerification() ?>
<?= $page->seoneo->renderSchema() ?>
</head>
Migrating from SeoMaestro
The namespace surface intentionally mirrors SeoMaestro's API. The most common migration is a find-replace in your template files:
// Before (SeoMaestro) // After (SEO NEO)
echo $page->seo; → echo $page->seoneo;
echo $page->seo->render(); → echo $page->seoneo->render();
echo $page->seo->opengraph->render();
→ echo $page->seoneo->opengraph->render();
// or: $page->seoneo->og->render()
echo $page->seo->twitter->render();
→ echo $page->seoneo->twitter->render();
See Migrating from MarkupSEO or Seo Maestro for the full field-name mapping and migration script.
See also
- Hooks & Customisation — hooking into resolver and render methods to override any value.
- Migrating from MarkupSEO or Seo Maestro — API shape comparison and migration steps.
- Smart-Map & Fallbacks — how resolved values are computed before the getters return them.
Last updated