Skip to main content

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

  1. The SEO description is authored once in the CSV register (Description column) and mirrored into the Markdown frontmatter description: — the two must stay identical (enforced by validate-inventory.py).
  2. The sync pipeline (sync.pywp-sync-bridge.php) sends the frontmatter for initial publication and unpublished updates only.
  3. The bridge writes dedicated SEOPress per-post meta:
    • _seopress_titles_title = frontmatter title
    • _seopress_titles_desc = frontmatter description
    • post_excerpt = frontmatter description (fallback + excerpt display)
  4. 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 keyValue sourceUsed for
_seopress_titles_titleFrontmatter titlePer-post SEO <title>
_seopress_titles_descFrontmatter descriptionPer-post <meta name="description">
post_excerptFrontmatter descriptionExcerpt fallback + archive display
_id86_doc_idFrontmatter id (PID)Sync identity
_id86_source_pathRepo-relative file pathSync matching
_id86_source_hashSHA-256 of file contentChange 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.

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 fieldSEO effectAuthoring 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 onlyUsed during research; informs the description
Tags (CSV / frontmatter)WordPress post tagsMax 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_title written from frontmatter title on create/update
  • _seopress_titles_desc written from frontmatter description on 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)