Docs SEO NEO Version 1.x Template API

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

Last updated