Guide

Schema SEO architecture

Maintainer overview of SEO data sources, resolve pipeline, output, and Parse.ly integration.

High-level flow

Post meta (_prc_seo_data)
Term meta (_prc_seo_term_data)
Template defaults (wp_options)
Art Direction meta
        │
        ▼
Template_Context → Metadata → Template_Defaults → resolve_for_display()
        │
        ├── Meta_Tags (OG, Twitter, robots, canonical)
        ├── Generator (schema objects)
        └── JSON_Output (JSON-LD in wp_head)
Flow

Resolve and output

4 relationships
Singular and archive contexts share the resolve step.

Bootstrap components

class-plugin.php wires Metadata, REST field registration, Generator, JSON_Output, Meta_Tags, Template_Defaults, Cache_Invalidator, Parsely_Integration, Editor_UI, Taxonomy_UI, plus redirect / QR / Search Console / reading-score modules under includes/.

Storage

  • Post SEO: _prc_seo_data serialized array (includes primary_terms)
  • Term SEO: _prc_seo_term_data
  • Template patterns: prc_schema_seo_templates (and related options)

Editor save path

React SEO panel → @wordpress/core-data useEntityProp → core REST prc_seo_data field → plugin REST update handlers → Metadata::update_seo_data() → cache clear (seo_data_*, schema_*, meta_tags_*).

Frontend render path

On wp_head, Meta_Tags and JSON_Output call resolve_for_display() with Template_Context so singular, term, home, and archive pages get the right defaults and overrides.

Parse.ly (wp-parsely)

Parsely_Integration merges PRC SEO into Automattic’s plugin instead of emitting a parallel system:

ContextBehavior
Supported singularsEnrich wp_parsely_metadata / wp_parsely_permalink from Metadata::get_seo_data() / resolve_for_display()
Front page, term archives, post type archivesEmit PRC parsely-* meta at wp_head priority 3; return empty array from wp_parsely_metadata so wp-parsely’s renderer bails
RLS template singularSuppress wp-parsely; RLS owns its tags

Do not gate with wp_parsely_should_insert_metadata — wp-parsely evaluates it once at init before conditional tags are reliable.

Archive Parse.ly HTML fragments cache in group prc_schema_seo_parsely_07142026 (1 hour TTL).

Caching

Unified group prc_schema_seo_07142026 for post-level seo_data / schema / meta_tags (see includes/class-cache-keys.php). Separate groups for versioned term meta tags and Parse.ly fragments.

Was this helpful?