Title: GEOforge Schema
Author: GEOforge
Published: <strong>May 20, 2026</strong>
Last modified: August 13, 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.7.2.zip)

 * [Details](https://test.wordpress.org/plugins/geoforge-schema/#description)
 * [Reviews](https://test.wordpress.org/plugins/geoforge-schema/#reviews)
 *  [Installation](https://test.wordpress.org/plugins/geoforge-schema/#installation)
 * [Development](https://test.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.7.2

 * Crawl tracking: stop reporting requests for pages that don’t exist. Detection
   now runs on the `wp` action instead of `send_headers`, because at `send_headers`
   WordPress has not yet decided whether a request is a 404 — so missing pages were
   reported as genuine AI-crawler visits. This matters more than it sounds: a User-
   Agent is trivially forged, and credential scanners impersonate AI crawlers precisely
   because those are the identities sites allow through, then sweep for files like`/.
   env` that do not exist. On one site those forgeries were 45% of apparent AI-crawler
   traffic. Requests to the WordPress admin and to `robots.txt` are skipped for 
   the same reason.

#### 1.7.1

 * Crawl tracking: added two AI crawlers the plugin was not detecting. `DuckAssistBot`(
   DuckDuckGo’s assistant) was missing entirely, so its crawls were never reported
   and showed as a permanent zero in GEOforge — indistinguishable from never being
   crawled. `Amzn-SearchBot` (Amazon’s search-index crawler, distinct from the `
   Amazonbot` training crawler) is now listed explicitly; it had been matching only
   by coincidence, because its User-Agent happens to contain an `amazonbot` support
   URL, and would have stopped being detected if Amazon ever changed that URL.

#### 1.7.0

 * Crawl tracking: corrected the list of AI crawlers the plugin detects. `Google-
   Extended` and `Applebot-Extended` have been removed — they are robots.txt opt-
   out tokens rather than crawlers, so they never appear in a request’s User-Agent
   and could never have matched. Added the search-index and user-triggered agents
   that were missing: `OAI-SearchBot`, `Claude-SearchBot`, `Claude-User`, `Perplexity-
   User`, and `Applebot`. These are the agents that fetch pages to answer questions,
   so they are the ones that reflect whether an AI assistant can actually cite your
   content; the previous list covered mostly model-training crawlers.

#### 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.7.2**
 *  Last updated **6 days ago**
 *  Active installations **Fewer than 10**
 *  WordPress version ** 5.6 or higher **
 *  Tested up to **6.9.7**
 *  PHP version ** 7.4 or higher **
 *  Language
 * [English (US)](https://wordpress.org/plugins/geoforge-schema/)
 * Tags
 * [geo](https://test.wordpress.org/plugins/tags/geo/)[JSON-LD](https://test.wordpress.org/plugins/tags/json-ld/)
   [schema](https://test.wordpress.org/plugins/tags/schema/)[seo](https://test.wordpress.org/plugins/tags/seo/)
 *  [Advanced View](https://test.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/)