SEO Metadata Automation
Every id86.net documentation post gets its initial SEO title and meta description from Markdown frontmatter. After publication, Gutenberg and WordPress/SEOPress are authoritative for live editorial changes; later Markdown syncs cannot overwrite the published post.
The Pipeline
- The SEO description is authored once in the CSV register (
Descriptioncolumn) and mirrored into the Markdown frontmatterdescription:— the two must stay identical (enforced byvalidate-inventory.py). - The sync pipeline (
sync.py→wp-sync-bridge.php) sends the frontmatter for initial publication and unpublished updates only. - The bridge writes dedicated SEOPress per-post meta:
_seopress_titles_title= frontmattertitle_seopress_titles_desc= frontmatterdescriptionpost_excerpt= frontmatterdescription(fallback + excerpt display)
- SEOPress renders these into
<title>and<meta name="description">on the front page output.
What Gets Written (server)
When a document is synced, the bridge writes these meta keys to the WordPress post:
| Meta key | Value source | Used for |
|---|---|---|
_seopress_titles_title | Frontmatter title | Per-post SEO <title> |
_seopress_titles_desc | Frontmatter description | Per-post <meta name="description"> |
post_excerpt | Frontmatter description | Excerpt fallback + archive display |
_id86_doc_id | Frontmatter id (PID) | Sync identity |
_id86_source_path | Repo-relative file path | Sync matching |
_id86_source_hash | SHA-256 of file content | Change detection |
The bridge writes the SEOPress meta during creation and for unpublished updates. Once a post is published, the bridge returns protected; edit its SEO title and description directly in WordPress/SEOPress.
Why Dedicated SEOPress Meta (recommended)
The site enables dedicated per-post SEOPress meta instead of relying only on the global template fallback (%%post_excerpt%%). Recommended because:
- Initial source of truth — SEO text is authored in the CSV/frontmatter and applied automatically at first publication; later live edits belong in WordPress/SEOPress.
- Per-post control — each post carries its own explicit title/description rather than inheriting a site-wide template. Overriding one post never affects others.
- Deterministic output — the meta is written verbatim from the frontmatter, so what you see in the register is exactly what search engines get (no template-variable surprises).
- Hash-driven protection — unchanged unpublished files skip the write; published posts are protected even when the source hash changes.
This is the SEOPress "titles & metas" editor mode, populated programmatically by the pipeline instead of by hand.
Where the Values Come From
| Document field | SEO effect | Authoring rules |
|---|---|---|
Title (CSV) / title (frontmatter) | SEO <title> | Clear, keyword-aligned page title |
Description (CSV) / description (frontmatter) | Meta description | ~150–160 chars, contains target keyword, no keyword-stuffing |
Target Keyword (CSV) | Reference only | Used during research; informs the description |
Tags (CSV / frontmatter) | WordPress post tags | Max 5, lowercase, no # |
Full description and tag rules live in the Content Register.
How to Verify
Check what SEOPress meta a post actually carries (run from the server, GC-US-M10):
# List SEO + sync meta on a post
sudo -u Dmg59ZFtKg6bIws1 -- wp --path=/home/Dmg59ZFtKg6bIws1/id86net/public_html \
post meta list <POST_ID>
# Confirm the two SEOPress keys exist
sudo -u Dmg59ZFtKg6bIws1 -- wp --path=/home/Dmg59ZFtKg6bIws1/id86net/public_html \
post meta get <POST_ID> _seopress_titles_title
sudo -u Dmg59ZFtKg6bIws1 -- wp --path=/home/Dmg59ZFtKg6bIws1/id86net/public_html \
post meta get <POST_ID> _seopress_titles_desc
Or render the page and inspect <head>:
curl -ksS --resolve id86.net:443:127.0.0.1 "https://id86.net/<slug>/?$(date +%s)" \
| grep -E '<title>|<meta name="description"'
Manual Override (SEOPress CLI)
The pipeline writes the meta automatically, but you can still read/override per post with WP-CLI:
wp post meta get <ID> _seopress_titles_title
wp post meta update <ID> _seopress_titles_title "custom SEO title"
wp post meta update <ID> _seopress_titles_desc "custom meta description"
wp post meta delete <ID> _seopress_titles_title
Note: a manual override will be overwritten on the next sync if the frontmatter changes, because the bridge rewrites these keys on update. To keep a permanent custom meta, edit the frontmatter instead — that is the source of truth.
AI Metadata Generation (SEOPress Pro)
SEOPress Pro ships an AI metadata generator usable from the CLI:
wp seopress ai metadata --id=1,2,3,4,5 --meta=desc --language=en_US
wp seopress ai alt_text --id=1,2,3 --language=en_US
This can draft descriptions/alt text from post content. It is a manual/assisted tool — not wired into the sync pipeline. The pipeline always uses the authored frontmatter values so output stays deterministic and reviewable.
Relationship to Indexing
SEO metadata is about what search engines see (title/description); indexing is about discovery (sitemap + IndexNow). Both are automatic. See Search Engine Indexing for the discovery half.
Glossary Structured Data
SEOPress handles titles and meta descriptions, but glossary posts additionally need DefinedTermSet structured data to be eligible for definition/glossary rich results. This is documented as a recommendation, not yet wired into the pipeline: see Glossary SEO for the schema shape, the sync-time generation approach, and caveats.
Manual Schema Overrides
The local control mirror has an optional schema-seo/ directory for manually authored JSON-LD files. A document links to one with the Schema Path column in content-inventory.csv, and the filename is always the PID, for example:
schema-seo/SEO-000001.json
Leave the column empty when schema is generated from the Markdown or managed by SEOPress. The inventory validator checks populated paths and JSON syntax, and validate-schema.py checks PID identity and JSON-LD basics. The current content sync pipeline does not yet inject these files into WordPress. Do not use this directory for ordinary Article metadata or schema that can be generated deterministically from page content.
Verification Checklist
-
_seopress_titles_titlewritten from frontmattertitleon create/update -
_seopress_titles_descwritten from frontmatterdescriptionon create/update - After a sync, a new post's
<head>shows the expected title/description on origin - SEOPress AI metadata (
wp seopress ai metadata) available with Pro license (optional use)