Releases: PeterKnightDigital/SeoNeo
SeoNeo 1.1.4
Auto-inject resilience + docs polish
Hardens SeoNeo's head-rendering pipeline against unexpected failures and improves discoverability of two existing features that testers were missing.
Resilience
- Error boundary inside
___renderHead()— the full section-builder pipeline is now wrapped in a try-catch. If any resolver or section builder throws (a hookedgetTitlethat crashes, a field-type edge case, a null reference insidegetOgLines, etc.), the page renders normally without the SeoNeo block, and the error is written to a new ProcessWire log calledseoneo(site/assets/logs/seoneo.txt). The log is created on demand on first failure — clean installs stay clean. - Defence in depth — matching try-catches added to
SeoNeoAccessor::render()(the$page->seoneo->render()template path) andhookPageRenderInject()(the auto-inject hook path), so all three call paths are protected. - Null-template safety —
shouldAutoInject()andhookPageRenderInject()now guard against the (rare) case of a page with no template object, preventing a TypeError on PHP 8.x.
UX
- Config hint when no templates have
seoneo_tab— the auto-inject checkbox in module config shows a one-line note when no fieldgroup includesseoneo_tab, explaining that the field must be on at least one template for injection to take effect.
Documentation
- Installation: clearer auto-complete callout — emphasises that you only need to add
seoneo_tabto a template; the rest of the SEO fields are inserted automatically in the correct order on save (a 1.1.0 feature that was previously buried). - JSON-LD: custom Schema.org types — the hooks section now includes worked examples for adding a
Recipenode on a custom template and suppressingBreadcrumbListon the homepage, plus a link to the full structured-data reference.
Compatibility
Fully backwards-compatible. No database changes, no field changes, no template changes required. Drop in over 1.1.3 and refresh modules.
SeoNeo 1.1.3
SeoNeo 1.1.3
Fixes
- NEO badge on Wire tab — targets the tab link (
a#_Inputfield_seoneo_tab); re-runs after WireTabs initialises; badge centred with flexbox
Since 1.1.1 (also included in this download)
1.1.2 — Empty SeoNeo tab
- Upgrade self-heal backfills missing SEO fields when only
seoneo_tabwas present - Repairs
collapsedTabonseoneo_tabthat left child fields outside the Wire tab - Module config: NEO badge checkbox and tab label sync fixes
- Auto-complete runs on
ProcessTemplate::fieldAdded
1.1.1 — Migration-friendly editor tab
- Configurable SEO tab label and optional NEO badge (on by default)
data-seoneo-tab="1"on the Wire tab link- README: installing alongside MarkupSEO / Seo Maestro
Docs (this release)
- README: JSON-LD marked BETA consistently; removed broken
ROADMAP.mdreference; PRO scope note clarified
Full changelog: https://github.com/PeterKnightDigital/SeoNeo/blob/main/README.md#changelog
SeoNeo 1.1.1
What's new
Migration-friendly tab UI — when MarkupSEO (or another module) also adds an SEO tab, SeoNeo no longer looks identical:
- Editor tab label defaults to SEO (configurable)
- Small NEO badge on the Wire tab by default
data-seoneo-tab="1"on the tab link for stable admin styling
Configure under Modules → Configure → SeoNeo → Page editor tab:
- SEO tab label — e.g.
SEO,SEO Neo, or anything you prefer (synced to theseoneo_tabfield) - Show NEO badge on tab — turn off if you use a distinct label instead
Coexistence during migration — legacy SEO fields and SeoNeo fields can stay on the same template while you copy data across. Watch frontend auto-inject on both modules to avoid doubled meta tags in <head>.
Upgrade from 1.1.0
Replace module files and refresh. ProcessWire will run the upgrade path; the tab label syncs from module config automatically.
SeoNeo 1.1.0
What's new
When you add seoneo_tab to a template, SeoNeo now inserts any missing SEO fields (seoneo_preview, seoneo_title, seoneo_description, seoneo_canonical, etc.) in the canonical order when the fieldgroup is saved.
- Idempotent — safe on every template save
- Shows an admin notice when fields are added via ProcessTemplate
- Install step 4 in the README updated to document the behaviour
Install
Copy the SeoNeo folder to site/modules/, refresh modules in the PW admin, and install SeoNeo.
Upgrading from 1.0.0: replace the module files and refresh — ProcessWire will pick up the new version automatically.
SEO NEO 1.0.0 — First stable release
SEO NEO 1.0.0
First stable release. Upgrades cleanly from 1.0.0-beta.1.
What's new since beta.1
Google SERP Preview
- Field renamed to Google SERP Preview with a descriptive helper line beneath the heading
- Desktop / Mobile surface toggle above the card
- Language switcher (multilingual sites only) — switch language versions of the SERP without leaving the page
- Both control groups now use consistent active state: white pill, accent-coloured text, subtle shadow
- Button vertical padding increased for a more comfortable click target
Defensive upgrade self-heal
___upgrade()now re-assertsseoneo_preview->inputfieldClass = InputfieldSeoNeoPreview, repairs the field label and description, and ensures the companionInputfieldSeoNeoPreviewmodule is registered — guards against stale installs where the SERP card was silently falling back to a plain text input
CSS design tokens
SeoNeo.cssrebuilt with a three-layer token system (--sn-*namespace): primary palette → secondary palette → semantic tokens (border, radius, shadow, transition)- Accent colour reads
var(--pw-main-color, #eb1d61)— automatically matches the active ProcessWire admin theme
New test
tests/test-upgrade-self-heal.php— 9-check CLI smoke test covering version, companion-module install state, field wiring, helper idempotency, and live SERP card render
Upgrade path
- Copy module files to
site/modules/SeoNeo/(or pull if symlinked) Modules → Refreshin the PW admin- Click Upgrade on SeoNeo —
___upgrade()runs automatically and will surface an admin message if it repaired anything
Requirements
- ProcessWire ≥ 3.0.200
- PHP ≥ 8.1