Add optional AI-bot crawl tracking (merged in from the former stand-alone GEOforge Crawl Tracker plugin). Detects known AI crawlers via the request User-Agent and reports them to GEOforge for content-visibility measurement. Off by default and completely inert until enabled from GEOforge; configured/disabled remotely via the authenticated geoforge/v1/configure REST route (requires manage_options). See the new “External services” section for exactly what is sent and when.
1.4.0
Register The SEO Framework’s _genesis_title and _genesis_description post-meta keys for REST write access, alongside the existing Yoast and Rank Math keys, so GEOforge can sync the SEO title and meta description to sites using The SEO Framework. Same idempotent registration and edit_post auth check as the other SEO keys.
1.3.0
Register the _geoforge_jsonld, _yoast_wpseo_metadesc, and rank_math_description meta keys for every public REST-enabled post type (previously posts and pages only), so GEOforge can publish into custom post types with full schema and meta-description delivery. Registration runs at init priority 20 so post types registered by themes/plugins at the default priority are included.
Enqueue the scoped .geoforge-content stylesheet on all singular views, not just posts and pages, matching the JSON-LD emitter.
1.2.0
JSON-LD output: decode the stored value and re-encode via wp_json_encode with JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT (plus JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) before emitting. Every HTML-sensitive character is emitted as a uXXXX escape, replacing the prior str_replace(‘</’, ‘</’, $json) approach.
Register _yoast_wpseo_metadesc (Yoast SEO) and rank_math_description (Rank Math) post-meta keys for REST write access. Both use show_in_rest, an edit_post auth callback, and a sanitize_text_field-based sanitizer capped at 320 characters. Idempotent — no-op when the SEO plugin already exposes the key.
1.1.1
Readme: rewrite the short description so the wp.org renderer doesn’t strip the literal <head> tag and leave the sentence incomplete. Functionality unchanged.
1.1.0
Enqueue a small scoped stylesheet on single posts and pages that constrains .geoforge-content to a 768px max-width and makes inline images responsive. Fixes edge-to-edge text on themes that don’t apply a content container around the_content(). No typography or color rules — host theme keeps full control of look-and-feel.