Docs SEO NEO Version 1.x Configuration

Configuration

A guided tour of every setting in Modules > Configure > SeoNeo, fieldset by fieldset: title format, injection, canonical policy, smart-map, Open Graph, Twitter, robots, verification, and JSON-LD.

Where to find the settings

Go to Modules > Configure > SeoNeo in the ProcessWire admin. Settings are grouped into fieldsets — you can work through them top to bottom on first setup, then come back to individual sections as your needs evolve.

Title and site name

  • Site name — the text appended to every page title. Typically your brand name (e.g. "Peter Knight Digital").
  • Per-language site name — optional per-language overrides, one per line in the format langname=name (e.g. de=Mein Beispiel). Only shown when ProcessWire's multi-language support is active.
  • Title format — how the <title> tag is assembled. Default: {title}{separator}{site_name}.
  • Title separator — the character(s) between the page title and site name. Default: | (space-pipe-space).

Two pagination placeholders are available in the title format and per-template defaults:

  • {pageNum} — blank on page 1, " — Page 2", " — Page 3" on subsequent pages. Use this when you want the format to read cleanly on the first page.
  • {pageNumber} — always numeric (1, 2, 3). Use this when you want explicit page numbers in every title.

Injection

  • Auto-inject meta tags into <head> — when enabled (the default), SEO NEO hooks into ProcessWire's page render and inserts the meta block automatically. Disable this if you want to call echo $page->seoneo->render() from your own template file.
  • Injection positionTop places the block immediately after the opening <head> tag; Bottom (default) places it just before </head>.

Canonical URL policy

  • Pagination behaviourInclude the page number (default, recommended) keeps /news/page2/ as its own canonical. Always page 1 collapses every paginated variant to /news/. Language-aware page-number prefixes from $config->pageNumUrlPrefixes are honoured automatically.
  • URL segment behaviourInclude the segment string (default, recommended) keeps /news/2024/article-slug/ as its own canonical. Parent page only collapses every segment-driven variant to /news/.

Per-page overrides via the Canonical URL field always win — the policies above apply only to the auto-generated fallback.

Robots and indexing defaults

  • Site-wide noindex — emergency switch. When enabled, every page is rendered with noindex. Use this for staging copies, pre-launch previews, or any time you need to take the site out of the index without changing per-page settings.
  • Site-wide nofollow — companion switch. When enabled, every page is rendered with nofollow, telling crawlers not to follow links from the site.
  • Auto-noindex unpublished pages — enabled by default. Prevents search engines from indexing drafts that a superuser has opened on the frontend for preview.
  • Auto-noindex hidden pages — off by default. Enable this if you use the Hidden flag as a "not for search" signal.

Per-page noindex/nofollow checkboxes always override the auto-defaults. Site-wide noindex/nofollow override everything — they are the highest-priority signal in the chain.

Smart field mapping

This is the fallback chain for title and description. When a page's own seoneo_title or seoneo_description field is empty, SEO NEO tries the fields you map here.

Enter one mapping per line in key=field1,field2 format:

title=headline,title
description=summary,body
  • Dotted paths reach into nested data: description=banner.image.description,matrix_blocks.first.body
  • Prefix any field with * to walk ancestor pages: description=*section_description,summary
  • Within a comma-separated list, fields are tried left to right; the first non-empty value wins

See Smart-Map & Fallbacks for the full resolution order.

Per-template defaults

Set default meta values per template. Use [template-name] sections with key=value lines:

[blog-post]
title={title} — {site_name} Blog
description={summary|body}
og_type=article

Supported placeholders:

  • {title} — the page's own title.
  • {site_name} — the configured site name (per-language aware).
  • {separator} — the configured title separator.
  • {page.fieldname} — any field on the current page (e.g. {page.headline}, {page.summary}).
  • {fieldname} — shorthand for {page.fieldname}. {summary} is equivalent to {page.summary}.
  • {pageNum} / {pageNumber} — pagination placeholders, as described above.

Pipe-separated fallbacks pick the first non-empty value: {summary|body|page.intro}.

Open Graph image and type

  • OG image fields — which image fields to scan for og:image after the dedicated seoneo_og_image field, comma-separated. Default: og_image,screenshot,images,image,blog_images. Supports dotted paths (banner.image, gallery.first).
  • Inherit OG image from closest ancestor — off by default. When enabled, if no image is found on the current page SEO NEO walks $page->parents() and uses the first ancestor that has an image. Useful for section landing pages.
  • Default OG image — fallback image URL used when no image is found on the page or any ancestor.
  • Default OG type — site-wide fallback for og:type. Default: website. Override per page via the seoneo_og_type field (installed by default) or per template via the per-template defaults.

The Default OG type select supports the full set of common Open Graph types: website, article, book, profile, music.song, music.album, music.playlist, music.radio_station, video.movie, video.episode, video.tv_show, video.other, and product.

Open Graph locale

  • Default OG locale — site-wide fallback for og:locale (e.g. en_US). Used on single-language sites and as the fallback when no language-specific entry exists.
  • Locale map for languages — per-language overrides, one per line: default=en_GB, de=de_AT. Powers both og:locale and og:locale:alternate.

Twitter / X

  • Twitter / X site handle — the @username of the site itself, emitted as twitter:site. The leading @ is added automatically.
  • Default Twitter / X creator handle — the @username of the content author, emitted as twitter:creator. Hookable per-page via ___getTwitterCreator($page).

Granular Google directives

These four optional settings compose into the <meta name="robots"> tag. All default to empty (nothing emitted) until you opt in:

  • max-snippet — character cap for SERP text snippets. -1 for no limit, 0 to suppress, positive integer for the cap.
  • max-image-preview — image preview size in search results: none, standard, or large.
  • max-video-preview — seconds of video preview. -1 for no limit, 0 to suppress.
  • unavailable_after — an RFC 850 or ISO 8601 datetime. Google drops the page from its index after this moment. Useful for event listings or time-limited offers.

AI / LLM opt-out

  • noai — asks AI crawlers not to use the site's content for generative-AI training.
  • noimageai — asks AI crawlers not to include the site's images in AI training datasets.

Both are honoured by some AI crawlers. They're a polite request, not enforcement — blocking specific bots at robots.txt or HTTP level is more reliable.

Search engine verification

Paste the bare token or the full <meta name="…" content="…"> snippet for any of the supported providers: Google Search Console, Bing Webmaster Tools, Yandex, Pinterest, Facebook Domain, Baidu. SEO NEO extracts the content attribute either way.

  • Verification tags on homepage only — enabled by default. Emits the verification meta tags only when rendering the homepage. Most providers only need to see them there.
  • Disable the checkbox to emit them on every page — useful when verifying subdomains, per-language country variants, or properties scoped to a section URL.

Author meta tag

  • Default author — site-wide value for <meta name="author">. Leave blank to omit the tag.
  • For per-page overrides, add a FieldtypeText field named seoneo_author to any template. When it has a value it wins over the site default.

Google SERP Preview budgets

The character counter beneath the seoneo_title and seoneo_description fields is colour-coded against three thresholds. Defaults are tuned to Google's current SERP truncation:

  • Title (desktop) — green up to 60 characters, amber from 61–70, red above 70. Mobile: green 50, amber 51–60.
  • Description (desktop) — green up to 160 characters, amber from 161–180, red above 180. Mobile: green 120, amber 121–140.

All four green/amber thresholds (counter_title_green, counter_title_amber, counter_desc_green, counter_desc_amber) and the two mobile targets (counter_title_mobile, counter_desc_mobile) are individually configurable in the Google SERP Preview fieldset.

  • Hard-cap title / description input length — optional. Enforces browser-level maxlength on the page-edit form. Off by default; the soft amber/red counter is preferred for most teams as it doesn't block the editor mid-word.

JSON-LD structured data (Beta)

  • Emit JSON-LD — master switch. Enabled by default. Article templates are blank by default; add templates when you want Article nodes in the graph.
  • Pretty-print JSON-LDon by default. When enabled, the JSON is indented with line breaks for human readability. Disable for minified production output.
  • Publisher typeOrganization (default), Person, LocalBusiness, NewsMediaOrganization, or EducationalOrganization. Choose Person for solo author / personal-brand sites where the publisher is an individual rather than a company.
  • Publisher name (per language) / Publisher description (per language)langname=value map for multilingual Organization nodes.
  • Publisher logo URL — absolute URL to a square logo image. Emitted as logo.url on the publisher node and as publisher.logo on Article nodes. Required by Google for certain rich-result eligibility.
  • Publisher sameAs URLs — one URL per line. These become the publisher's sameAs array — typically your social profiles (LinkedIn, X, GitHub, Crunchbase, Wikipedia).
  • Article templates — comma-separated template names whose pages get an Article node in the graph (e.g. blog_post,journal_post).
  • Default Article author — select a ProcessWire User page as fallback author on Article nodes when the page has no resolvable author. Pages with a seoneo_author field override this.
  • Emit BreadcrumbListon by default. Adds a BreadcrumbList node when the page has at least one parent. Disable if your site has no meaningful breadcrumb hierarchy.

See Structured Data (JSON-LD) for more detail on the graph composition and hooks.

Field mapping

Advanced — you only need this if your site has legacy SEO fields with names other than the SEO NEO defaults, and you want to keep them.

  • Title field — name of the field that holds the SEO title. Default: seoneo_title.
  • Description field — default: seoneo_description.
  • Keywords field — default: seoneo_keywords.
  • Canonical field — default: seoneo_canonical.
  • Noindex field — default: seoneo_noindex.
  • Nofollow field — default: seoneo_nofollow.
  • Author field — default: seoneo_author.
  • Custom HTML field — default: seoneo_custom.

Point any of these at an existing field on your templates and SEO NEO will read from it instead of the default name. Useful when migrating from MarkupSEO or SEO Maestro and you want to keep the legacy field names in place.

SEO tab label and NEO badge

  • SEO tab label — Wire tab text for the SeoNeo fieldset. Default: SEO. Synced to the seoneo_tab field on config save.
  • Show NEO badge on tab — small NEO pill beside the tab label. On by default; helps distinguish from MarkupSEO's SEO tab during migration.

Custom tag mappings

Advanced — global mappings that turn arbitrary fields into <meta> tags. One rule per line: fieldname=<tag template with %s>:

seoneo_keywords=<meta name="keywords" content="%s">
seoneo_og_type=<meta property="og:type" content="%s">

The field value replaces %s. Empty fields are skipped; values are escaped before insertion. See Custom Meta Tags for when to use mappings vs seoneo_custom.

See also

Last updated