Title: GEOforge Schema
Author: GEOforge
Published: <strong>May 20, 2026</strong>
Last modified: July 30, 2026

---

Search plugins

![](https://ps.w.org/geoforge-schema/assets/icon-256x256.png?rev=3538484)

# GEOforge Schema

 By [GEOforge](https://profiles.wordpress.org/delchostanimirov/)

[Download](https://downloads.wordpress.org/plugin/geoforge-schema.1.6.0.zip)

 * [Details](https://ewe.wordpress.org/plugins/geoforge-schema/#description)
 * [Reviews](https://ewe.wordpress.org/plugins/geoforge-schema/#reviews)
 *  [Installation](https://ewe.wordpress.org/plugins/geoforge-schema/#installation)
 * [Development](https://ewe.wordpress.org/plugins/geoforge-schema/#developers)

 [Support](https://wordpress.org/support/plugin/geoforge-schema/)

## Description

GEOforge generates JSON-LD schema markup and meta descriptions for the articles 
it publishes. WordPress strips inline `<script>` tags from post bodies (KSES sanitization)
and hides underscore-prefixed meta from the REST API by default, so neither can 
be set by an external publishing tool without a companion plugin.

This plugin solves that by:

 1. Registering a `_geoforge_jsonld` post-meta key, exposed via the REST API for every
    public REST-enabled post type, that GEOforge writes to when publishing or updating
    an article.
 2. Printing the stored JSON-LD inside a proper `<script type="application/ld+json"
    >` tag in the page `<head>` on any singular view — posts, pages, and custom post
    types.
 3. Registering the SEO post-meta keys used by Yoast SEO (`_yoast_wpseo_metadesc`),
    Rank Math (`rank_math_description`), and The SEO Framework (`_genesis_title` / `
    _genesis_description`) for REST API write access, so GEOforge can sync SEO titles
    and meta descriptions on publish. Each registration uses an `edit_post` auth check
    and `sanitize_text_field`-based sanitization capped at 320 characters. Registration
    is idempotent — if the SEO plugin already exposes the key for REST, our registration
    is a no-op.

No configuration required for schema and meta delivery. Install, activate, and any
GEOforge-published article will get its schema markup rendered correctly and its
meta description handed to whichever SEO plugin is active.

Optionally, the plugin can detect AI-bot crawls (e.g. GPTBot, ClaudeBot, PerplexityBot)
and report them to GEOforge for content-visibility measurement. This feature is **
off by default** and stays completely inert — no outbound request is ever made —
until a webhook URL and secret are stored on the site. You can set them two ways:
enable crawl tracking from inside GEOforge (which writes both values via an authenticated
REST call, requiring an Administrator-level connection), or paste them yourself 
under Settings  GEOforge Schema, which needs no Administrator connection at all.

### External services

This plugin’s optional crawl-tracking feature communicates with the GEOforge platform.
It is disabled by default and only becomes active once a webhook URL and secret 
are stored — either by connecting the site from within GEOforge, or by entering 
them under Settings  GEOforge Schema.

When active, and only when an incoming request’s User-Agent matches a known AI crawler,
the plugin sends a single HTTPS request to the GEOforge webhook URL you configured
containing: the crawled URL on your site, the request’s User-Agent string, and a
source identifier (“wordpress”). No personal data or visitor content is sent. Nothing
is sent for normal human visitors, and nothing is sent at all while the feature 
is disabled.

GEOforge is a service provided by Hop AI. Terms: https://getgeoforge.com/terms —
Privacy policy: https://getgeoforge.com/privacy

## Installation

 1. Upload the plugin zip via Plugins  Add New  Upload Plugin.
 2. Activate.
 3. Publish from GEOforge as normal — schema will appear in `<head>` on each article.

## FAQ

### Do I need GEOforge to use this plugin?

The plugin is designed to render JSON-LD that GEOforge writes during publish. It
will work with any tool that writes a JSON-encoded string to the `_geoforge_jsonld`
post-meta key via the REST API, but on its own it does nothing — the settings screen
covers crawl tracking only, and there is no admin UI for entering schema by hand.

### Can I configure crawl tracking without giving GEOforge an Administrator account?

Yes. Go to Settings  GEOforge Schema and paste the webhook URL and secret shown 
in GEOforge under Settings  Integrations  Crawl Tracker  Manual setup, then click“
Verify & activate” back in GEOforge. Only your own WordPress administrator uses 
that screen — the WordPress user you connect to GEOforge then needs publishing capabilities
only (an Editor account is enough). Connecting an Administrator-level user remains
supported and lets GEOforge install, update, and configure the plugin for you in
one click.

### Will this conflict with Yoast SEO, Rank Math, The SEO Framework, or All in One SEO?

No. Multiple `<script type="application/ld+json">` blocks per page are valid Schema.
org and supported by Google — search engines merge the data. If both your SEO plugin
and GEOforge emit schema, both will appear in the page head.

For SEO titles and meta descriptions, the plugin registers the Yoast, Rank Math,
and The SEO Framework meta keys for REST so the active plugin renders GEOforge’s
values instead of auto-generating its own. The registration calls are idempotent—
if the SEO plugin has already registered the key itself, our call is a no-op. The
auth callback restricts writes to users with `edit_post` capability on the target
post. All in One SEO stores its data in a custom table rather than post meta, so
it is not covered.

### Why is the meta key prefixed with an underscore?

WordPress treats underscore-prefixed meta as “protected” — hidden from the default
Custom Fields UI in the post editor. This prevents accidental editing of the JSON
blob while still allowing the REST API (and this plugin) to read and write it.

### What happens if I deactivate the plugin?

The stored schema data is preserved in post meta. Re-activating restores schema 
rendering on the front end. Uninstalling the plugin does not remove the meta.

## Reviews

There are no reviews for this plugin.

## Contributors & Developers

“GEOforge Schema” is open source software. The following people have contributed
to this plugin.

Contributors

 *   [ GEOforge ](https://profiles.wordpress.org/delchostanimirov/)

[Translate “GEOforge Schema” into your language.](https://translate.wordpress.org/projects/wp-plugins/geoforge-schema)

### Interested in development?

[Browse the code](https://plugins.trac.wordpress.org/browser/geoforge-schema/), 
check out the [SVN repository](https://plugins.svn.wordpress.org/geoforge-schema/),
or subscribe to the [development log](https://plugins.trac.wordpress.org/log/geoforge-schema/)
by [RSS](https://plugins.trac.wordpress.org/log/geoforge-schema/?limit=100&mode=stop_on_copy&format=rss).

## Changelog

#### 1.6.0

 * Add a settings screen (Settings  GEOforge Schema) for entering the crawl-tracking
   webhook URL and secret by hand. Crawl tracking previously required connecting
   an Administrator-level WordPress user to GEOforge, because the values could only
   be written through the `manage_options`-gated `geoforge/v1/configure` REST route—
   the crawl detection itself never needed those privileges. With manual setup the
   connected user only needs publishing capabilities. Values are sanitized with `
   esc_url_raw` / `sanitize_text_field`, and the screen is `manage_options`-gated
   like any options page.
 * Crawl tracking: the public `geoforge/v1/status` route now also reports `secret_fingerprint`—
   the first 8 hex characters of `sha256(webhook secret)`, or `null` when unconfigured—
   so GEOforge can confirm the correct secret was pasted during manual setup. The
   secret itself is never exposed, and the fingerprint is not reversible.

#### 1.5.1

 * Crawl tracking: the `geoforge/v1/status` health-check route is now public and
   reports the plugin version. Previously it required `manage_options`, so sites
   that connected GEOforge with a non-Administrator user (publishing needs only `
   publish_posts`) had their installed plugin misreported as “Not installed”. The
   route exposes only presence, version, and whether crawl tracking is configured—
   never the webhook secret. The `geoforge/v1/configure` route still requires `manage_options`.

#### 1.5.0

 * 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.

#### 1.0.0

 * Initial release.

## Meta

 *  Version **1.6.0**
 *  Last updated **4 days ago**
 *  Active installations **Fewer than 10**
 *  WordPress version ** 5.6 or higher **
 *  Tested up to **6.9.5**
 *  PHP version ** 7.4 or higher **
 *  Language
 * [English (US)](https://wordpress.org/plugins/geoforge-schema/)
 * Tags
 * [geo](https://ewe.wordpress.org/plugins/tags/geo/)[JSON-LD](https://ewe.wordpress.org/plugins/tags/json-ld/)
   [schema](https://ewe.wordpress.org/plugins/tags/schema/)[seo](https://ewe.wordpress.org/plugins/tags/seo/)
 *  [Advanced View](https://ewe.wordpress.org/plugins/geoforge-schema/advanced/)

## Ratings

No reviews have been submitted yet.

[Your review](https://wordpress.org/support/plugin/geoforge-schema/reviews/#new-post)

[See all reviews](https://wordpress.org/support/plugin/geoforge-schema/reviews/)

## Contributors

 *   [ GEOforge ](https://profiles.wordpress.org/delchostanimirov/)

## Support

Got something to say? Need help?

 [View support forum](https://wordpress.org/support/plugin/geoforge-schema/)