Deskripsi
SEOGeoX is a lean, fast SEO plugin built around one idea: do the
same core job as Yoast/RankMath, with less admin overhead and a fully
transparent scoring model — no opaque single-number score, no bundled JS
admin framework, and no assets loaded outside the one screen that needs
them. The “Geo” in the name is the built-in Local SEO toolkit further
down this list (address/geo-coordinate fields, LocalBusiness schema, and
a multi-location “SEO Locations” post type) rather than a separate
add-on — everywhere else, “geo” isn’t used as a stand-in for features
that don’t exist yet. This is a new plugin looking for real-world
testers before it grows further; see “Has this been tested on a live
site?” in the FAQ below for exactly where your testing would help most.
It currently includes:
- A single per-post meta box: SEO title, meta description, up to 5 focus
keyphrases (the first treated as primary), a live Google/Facebook/
Twitter-X preview, optional noindex, optional canonical override,
optional cornerstone-content flag, and an optional per-post schema type
override. - Frontend
<title>override, meta description, canonical link, Open
Graph tags, and Twitter Card tags — rendered from data already loaded on
the page request, with no extra database queries. - A social preview + snippet editor right in the meta box: live, no-
network-request previews of how a page will look in Google search
results, a Facebook/X link share, and a Twitter/X card, with optional
title/description/image overrides for the social cards (via the media
library) that never touch the SEO title or meta description search
engines see. Twitter/X reuses the Facebook card’s content unless you
opt into a separate title/description/image for it. - JSON-LD structured data: an Organization/WebSite graph sitewide, plus
Article and BreadcrumbList nodes on singular content. When WooCommerce
is active, product pages automatically get a Product node instead —
with Offer (or AggregateOffer for variable products), stock
availability, SKU, AggregateRating, and up to 10 individual Review
nodes (most recent first) when the product has reviews with a star
rating. A per-post Schema Type Override (in the meta box’s advanced
fields) can replace the automatic Article/Product node with an Event,
Course, Podcast Episode, Dataset, or FAQ Page node instead, each with
its own small set of type-specific fields. A GTIN/MPN/brand-override
section appears on WooCommerce product edit screens, feeding straight
into the Product node for better Google Merchant Center / Shopping
eligibility. When Organization type (SEOGeoX > General Settings) is set to
a business type (LocalBusiness, Store, Restaurant, etc.), the sitewide
Organization node also carries address, geo coordinates, phone, price
range, and opening hours from the new “Local Business Info” section
there. For multi-location businesses, a new “SEO Locations” post type
(nested under the SEOGeoX menu) gives each branch its own page,
its own LocalBusiness
node (same address/hours/geo fields, per location), and — since it’s a
public post type — its own entry in the XML sitemap automatically. - A cached XML sitemap at
/sitemap.xml(index) and
/sitemap-{post_type}.xml, rebuilt only when content changes — not on
every visit. When WPML or Polylang is active, each per-type sitemap
covers every active language in one file, with every translation
cross-linked viahreflangalternate tags — built against both
plugins’ public APIs, but not yet exercised against a live multilingual
install. Please verify the sitemap output on a real WPML/Polylang site
before relying on it, and let us know what you find. Each URL entry can
also carry<image:image>tags for its featured image and any images
found in the post content (toggle in SEOGeoX > General Settings) — pulled
with a lightweight regex scan, not a DOM parser, so it doesn’t add a
hard dependency on an extension not every host has enabled. Two more
specialized sitemaps are available, both off by default: a Google News
sitemap (/sitemap-news.xml, only for sites approved as a Google News
publisher — lists content published in the last 48 hours from
whichever post types you choose) and a video sitemap
(/sitemap-videos.xml, auto-detects self-hosted<video>tags and
YouTube/Vimeo embeds already in your post content — nothing extra to
fill in). - A client-side, in-browser on-page analyzer with per-check pass/warn/fail
reasoning (title length, description length, sentence length, passive
voice, paragraph length) instead of one opaque numeric score, scored
separately against every focus keyphrase you’ve added — not just one —
so each gets its own title/description/content-presence and density
checks. No external requests. - One lean settings screen built on WordPress’s core Settings API — no
bundled JS admin framework. - A redirect manager (SEOGeoX > SEO Redirects): add 301/302 redirects,
see hit counts and last-hit time per redirect, and get one created
automatically whenever a published post or page’s URL slug changes —
so old links don’t silently start 404ing. Matching is a single indexed
database lookup per request, not a cached map that has to be rebuilt
and unserialized on every page load. Alongside exact-path redirects,
wildcard patterns are supported too — e.g. old path/blog/*to target
/new-blog/$1 — checked only as a small cached fallback when the exact
lookup misses, so sites without any wildcard redirects pay nothing extra. - A bulk editor (SEOGeoX > SEO Bulk Editor): filter by post type, see a
paginated table of posts with inline SEO title/description fields and
live character counters, and save every row in one submit — instead of
opening each post individually. Focus keyword, noindex, and canonical
overrides already set on a post are left untouched by a bulk save. The
same screen flags duplicate SEO titles and duplicate meta descriptions
across every post of the filtered type — a summary list with edit
links, plus a “Duplicate” badge on affected rows in the current page. - A robots.txt editor (SEOGeoX > Robots.txt), using WordPress’s own
virtual-robots.txt filter — no file written to disk. Prefilled with
WordPress’s current effective default as a starting point, with a
“Sitemap:” line added automatically when the XML sitemap is enabled.
Warns when a physical robots.txt file on the server would override it,
and when the site’s “discourage search engines” setting is on (custom
content would override WordPress’s own blanket Disallow in that case). - Redirect CSV export/import, right on the Redirects screen: export
every redirect (including hit counts) as a CSV, or upload a CSV with
“source”/”target” columns (an optional “type” column, 301 default) to
bulk-add redirects — handy for migrating off another redirect plugin. - A Yoast SEO / Rank Math data migration screen (SEOGeoX > SEO
Migration): detects existing per-post titles, descriptions, focus
keywords, noindex flags, and canonical URLs from either plugin and
imports them in one click. Only fills posts that don’t already have
SEOGeoX data — nothing already set here is overwritten. Common
template variables (%%title%%, %sitename%, etc.) are resolved; anything
less common is left as literal text to clean up afterward in the Bulk
Editor. - A 404 monitor (SEOGeoX > 404 Monitor): logs real front-end 404s
(path, hit count, first/last seen), ranked by frequency, with a
one-click “Add Redirect” button that opens the Redirects screen with
the path pre-filled. Once a redirect exists for a logged path, it stops
accumulating new hits automatically — the redirect manager catches it
first. Noisy paths (wp-admin, wp-content, favicon.ico, etc.) are
excluded, and the log self-prunes to the least-hit, longest-stale 5,000
entries so bot scanning can’t grow it without bound. - A settings export/import screen (SEOGeoX > General Settings): export the
organization/logo/Twitter/sitemap/schema settings and robots.txt content
as a JSON file, or upload one to apply those same settings on another
site — handy for staging production deployment. Imported data is run
back through the same validation a manual save uses, not trusted as-is. - Instant Indexing (SEOGeoX > Instant Indexing): pings search engines the
moment a public post is published, updated, or unpublished, instead of
waiting for their next crawl. IndexNow (Bing, Yandex, Seznam, Naver, and
others) needs no account — just a generated key, verified by a plain-text
file this plugin serves automatically — and is off by default, so nothing
is sent anywhere until you turn it on in SEOGeoX > Instant Indexing. An
optional Google Indexing API integration is also included, off by default
and clearly flagged: Google officially restricts that API to JobPosting/
BroadcastEvent pages, so using it for ordinary content isn’t sanctioned by
Google even though it works in practice for many sites. Neither call ever
blocks a post save — both run a few seconds later via WP-Cron, with the
actual sent/failed result shown on the settings screen. - Internal linking (SEOGeoX > Internal Linking, plus a new “Cornerstone
content” checkbox in the meta box): an on-site internal-link graph is
kept in its own small table and rebuilt whenever a post is saved. An
Orphaned Content Finder lists cornerstone content with no incoming
internal links from anywhere else on the site; a Stale Cornerstone
Content Finder lists cornerstone content untouched for a configurable
number of months. While editing a post, a “Link suggestions” panel
shows other published posts worth linking to (cornerstone pages
surfaced first), with a one-click “Copy link” button — the only network
request this plugin’s admin JS makes anywhere, and it never leaves the
site. - A Role Manager (SEOGeoX > Role Manager): control which WordPress roles
can see and use each of this plugin’s settings screens, and which roles
can edit the “advanced” per-post fields (noindex, canonical override,
cornerstone). Built on WordPress’s own capabilities system, not a
separate permission layer. Defaults preserve exactly what already
worked before this screen existed — screen access defaults to whichever
roles already hadmanage_options, and advanced-field access defaults
to whichever roles already hadedit_posts— and any role that already
has full admin access is never editable from this screen, so there’s no
way to use it to lock yourself out. - Google Search Console integration (SEOGeoX > Search Console):
connects with a Google Cloud service account (the same auth approach
the Google Indexing API integration uses) and reads Search Console’s
own Search Analytics report — never by scraping live search results,
which would violate Google’s terms of service. One cached report
(refreshed every 6 hours) powers a sitewide clicks/impressions/CTR/
position overview, a Keyword Ranking table for up to 20 tracked
keywords/phrases (their real average position, clicks, impressions, and
CTR, straight from Search Console), and a Top Queries table that flags
queries already earning meaningful impressions but ranking past
position 10 as an “Opportunity” — a keyword suggestion backed by this
site’s own real search demand, not a generic volume guess. - A second, independent Google Keyword Suggestion tool sits right in the
meta box: a “Get keyword ideas” button next to focus keyphrases that
calls Google’s own public autocomplete endpoint — the same suggestions
the Google search box itself shows as you type. Off by default and
flagged the same way the Google Indexing API is (it’s not a documented,
supported Google API); enable it in SEOGeoX > General Settings.
Only the typed keyphrase is ever sent, and results are cached for 12
hours per term. - Automated Image SEO: fills in missing alt text automatically and for
free — from an image’s own caption or title, or a cleaned-up version of
its filename (WordPress’s own resize suffix and camera-generated
prefixes like “IMG_”/”DSC_” stripped) — never by looking at the image
itself, so it never claims to describe what’s actually depicted. Runs
once, automatically, right when an image is uploaded (only ever filling
an empty alt field), and a new Image SEO screen lists every image
already in the Media Library with missing alt text, with an editable
suggestion for each, fixed in bulk. The on-page analyzer also now flags
images in the post being edited that are missing alt text.
Assets (JS/CSS) load only on the specific admin screen that needs them —
never sitewide across wp-admin.
Roadmap ideas (not yet built)
Every item originally on this list — including every purely in-house
batch toward RankMath Pro / Yoast Premium parity, and the Search
Console / keyword ranking / keyword suggestion integrations that used to
be queued here as “bring your own API key” ideas — has now been built.
The only thing still queued is:
- AI-assisted title/content suggestions, using your own OpenAI/
Anthropic-style API key. This is the one item that genuinely can’t be
done as plain code — everything else originally queued for a
“bring-your-own-API-key” integration (keyword rank tracking, a Search
Console dashboard inside wp-admin) turned out to be buildable as a
fully-authenticated Search Console integration instead, needing only a
free Google Cloud service account rather than a paid third-party key.
AI-assisted content will always be off until you supply your own
credentials — this plugin will never bundle or resell access to
someone else’s API.
Instalasi
- Zip the
seogeoxfolder if it isn’t already, or upload it as-is
via Plugins > Add New > Upload Plugin. - Activate the plugin.
- Go to the new “SEOGeoX” menu in the main admin sidebar (its own
top-level menu, not nested under Settings) to set your organization
name, logo, Twitter handle, and toggle the sitemap/schema output. - Edit any post or page — the SEOGeoX meta box appears below the
content editor.
Tanya Jawab
-
Has this been tested on a live WordPress site?
-
Not extensively yet — this is a new plugin, and this release is
specifically meant to invite that testing rather than assume it. Areas
where real-site testing matters most: the WooCommerce schema output, the
WPML/Polylang sitemap output, the Yoast/Rank Math migration screen
against real existing data, the 404 monitor under real traffic, the
robots.txt filter against your actual server config, the settings
export/import round-trip, wildcard redirect matching, the image
sitemap’s<img>extraction, IndexNow’s key-file verification, the
Google Indexing API and Search Console integrations’ service-account
authentication, the internal-link graph and its suggestions panel,
multi-keyphrase scoring and the Role Manager’s capability defaults, the
social preview/snippet editor, the Event/Course/Podcast/Dataset/FAQ
schema types, the Google News/video sitemaps, the Local SEO / SEO
Locations post type, the top-level admin menu’s per-role visibility, the
Automated Image SEO auto-fill-on-upload behavior, and the Google Keyword
Suggestion button. If you hit something that doesn’t work as described,
please open a support topic — that report is exactly what this release
is asking for. -
Does this plugin send data to any external service?
-
Every integration below is off by default (none of them run until you turn
them on in the relevant settings screen), sends only the minimum data each
one needs to function, and is disclosed here in full:IndexNow — Off by default. Once enabled in SEOGeoX > Instant Indexing,
it sends the URL of a public post to the IndexNow API the moment that post
is published, updated, or unpublished, plus a plugin-generated key (not a
personal account credential) used to verify you control the site. Nothing
else about the post — its content, author, or any personal data — is
transmitted. This happens automatically in the background (via WP-Cron)
every time a matching post changes, for as long as the setting stays on.
Destination:https://api.indexnow.org/indexnow, run by Microsoft and
Yandex. Terms: https://www.indexnow.org/terms — Documentation:
https://www.indexnow.org/documentation — Privacy/FAQ:
https://www.indexnow.org/faqGoogle Indexing API — Off by default and requires you to first create
and paste in your own Google Cloud service account JSON key. Once
configured, publishing, updating, or unpublishing a public post sends that
post’s URL to Google’s Indexing API in the background (via WP-Cron), the
same way IndexNow does. A “Test Connection” button lets you verify the
credentials without submitting a real URL. Google officially restricts
this API to JobPosting/BroadcastEvent pages; using it for ordinary content
works in practice but isn’t a sanctioned use, which the settings screen
flags. Destination: Google’sindexing.googleapis.com. Docs:
https://developers.google.com/search/apis/indexing-api/v3/quickstart —
Terms: https://developers.google.com/terms — Privacy:
https://policies.google.com/privacyGoogle OAuth (service-account authentication) — Not a separate feature
you turn on; it’s the shared authentication step behind both the Google
Indexing API and Search Console integrations above; it runs only when one
of those is enabled and configured. This plugin never asks you (or your
site’s visitors) to sign in to a personal Google account — instead, it
reads theclient_emailand private key from the service account JSON
you paste in yourself, signs a short-lived authentication token locally
with PHP’s own OpenSSL extension, and exchanges that token directly with
Google for an access token scoped to only the one API being used. No
personal Google account, password, or visitor data is ever involved.
Destination: Google’soauth2.googleapis.com/token. Policies:
https://developers.google.com/identity/protocols/oauth2/policies and
https://developers.google.com/terms/api-services-user-data-policy —
Privacy: https://policies.google.com/privacyGoogle Autocomplete (Keyword Suggestion button) — Off by default;
enable it in SEOGeoX > General Settings. When you click “Get keyword
ideas” in the post-edit meta box, only the keyphrase you’ve typed at that
moment is sent — never post content, title, or any personal data — to
fetch the same suggestions Google’s own search box shows as you type.
Results are cached for 12 hours per term so retyping an idea doesn’t
repeat the request. Destination:suggestqueries.google.com, a public
endpoint Google uses for its own autocomplete UI. It isn’t part of any
documented, officially supported Google API, so there’s no dedicated
Terms of Service page for it specifically; Google’s general terms and
privacy policy apply: https://policies.google.com/terms and
https://policies.google.com/privacyGoogle Search Console — Off by default and, like the Indexing API,
requires your own Google Cloud service account first. Once configured,
this plugin only reads your site’s existing Search Console Search
Analytics report (clicks, impressions, position, and query data Google
already collected) on a schedule (cached for 6 hours) — it never writes
to, modifies, or submits anything to Search Console, and it never scrapes
live Google search results. Destination: Google’s
searchconsole.googleapis.com /www.googleapis.com/webmasters. Docs:
https://developers.google.com/webmaster-tools/v1/terms — Terms:
https://developers.google.com/terms — Privacy:
https://policies.google.com/privacyAutomated Image SEO, the on-page analyzer, XML sitemaps, redirects, the
404 monitor, and everything else this plugin does make no external
request of any kind — alt text, for example, is generated from the
image’s own filename/caption/title, entirely on your own server. -
Will this conflict with Yoast SEO or Rank Math?
-
Running two SEO plugins at once usually means duplicate meta tags and
duplicate JSON-LD schema, so deactivate the other one first. The SEO
Migration screen (SEOGeoX > SEO Migration) then copies over existing
titles, descriptions, focus keywords, noindex flags, and canonical URLs
from whichever of the two you were using, in one click. -
Does this work with WooCommerce, WPML, or Polylang?
-
WooCommerce product pages automatically get Product schema (price,
stock, SKU, ratings/reviews) instead of the default Article node, plus a
GTIN/MPN/brand fields section on the product edit screen — no
configuration needed beyond having WooCommerce active. WPML and Polylang
are supported in the XML sitemap (every active language in one sitemap
per post type, cross-linked withhreflangalternates) if either plugin
is active; see the note above about this not yet being tested against a
real multilingual install.
Ulasan
Kontributor & Pengembang
“SEOGeoX” adalah perangkat lunak open source. Berikut ini mereka yang sudah berkontribusi pada plugin ini.
KontributorTerjemahkan “SEOGeoX” dalam bahasa Anda.
Tertarik mengembangkan?
Lihat kode, periksa repositori SVN , atau mendaftar ke log pengembangan melalui RSS.
Log Perubahan
1.0.5
Closes a gap in 1.0.3’s IndexNow/Google Indexing API enabled-state fix: that
round guarded the callers (the automatic publish/update ping and the
“Resubmit All” button) but not the function that actually sends the HTTP
request. That was enough for both normal paths, but not for a request
already queued on WordPress’s cron before the integration got disabled —
such a request would reach send() directly, skipping both guarded
callers. Added the same enabled check inside send() itself in both
includes/class-indexnow.php and includes/class-google-indexing.php, so
neither integration can reach its external API once disabled, regardless of
which code path gets there.
1.0.4
Small follow-up to 1.0.3, closing the last two spots a text-based scanner
(rather than a person) could still flag:
- The social preview card’s image was rendered with a dynamically generated
style=”background-image:url(…)” attribute inassets/admin.js.
Replaced with a plain<img>element (same visual result, styled via
assets/admin.css) run through the file’s existingescapeHtml()helper. - Removed the one remaining literal
onclick="..."example text from a code
comment inassets/confirm-submit.jsdescribing the earlier fix, for the
same reason literal examples were cleaned out of other comments in 1.0.3.
1.0.3
A second round of fixes on the same “SEOGeoX” review:
- Removed every remaining inline
style=""attribute from admin screens
(field widths, table column widths, form spacing, and show/hide states
that used to be set withstyle="display:none;"). All of it now lives
inassets/admin.cssas reusable classes, or is toggled via
classList in JavaScript instead of writing to.style.display
directly. - Removed three remaining inline click-confirm handlers (Clear All 404s,
Regenerate IndexNow Key, Migrate Now) that were passed to WordPress’s
ownsubmit_button()helper as anonclickattribute — still a real
inline event handler even though it wasn’t typed as literal HTML in the
template. Replaced with a plaindata-confirmattribute and one small
shared enqueued script (assets/confirm-submit.js). - Fixed the JSON-LD schema output’s JSON encoding: it was passing
JSON_UNESCAPED_SLASHES towp_json_encode(), which would let a
literal</sequence through unescaped — meaning post content
containing</script>could break out of the structured-data<script>
tag it’s embedded in. Removed that flag (PHP’s default behavior escapes
/ as\/, which prevents this) and added an explicit</<\/
replacement as defense in depth. - IndexNow’s “Resubmit All Published URLs” button (and, for the same
reason, the Google Indexing API’s equivalent button) now checks that
the integration is actually enabled before doing anything — previously
a disabled integration’s automatic pinging correctly stayed off, but
the manual resubmit button could still reach the API even while the
toggle was off. - Removed a couple of literal
<script>/onclick=examples from code
comments (describing fixes from the previous round) that a text-based
scanner can’t distinguish from the real thing still being present. - Trimmed the readme’s changelog: the full multi-generation rename history
(three product names, two different company names, and internal
class-prefix details likeRCSEO_/SEOP_) has been collapsed into
short, brand-neutral notes. That level of internal development history
doesn’t belong in a public-facing readme, and specifically shouldn’t
reference a company name unrelated to this submission. - A stray code comment left over from an earlier rename still said
“SEO Presence” instead of “SEOGeoX” — fixed.
1.0.2
Addresses the WordPress.org review feedback on the “SEOGeoX” submission:
- IndexNow (Instant Indexing) is now off by default, matching every other
integration in the plugin that calls an external service: Google
Indexing API, Search Console, and Keyword Suggestions were already off
until you supplied credentials or flipped a setting, but IndexNow
previously started pinging Bing/Yandex/Seznam/Naver on every publish/
update/unpublish the moment the plugin was activated, with no
configuration required first. That’s now consistent — turn it on in
SEOGeoX > Instant Indexing when you’re ready to use it. No other
behavior changed; if you already turned it on deliberately, this update
does not turn it back off for you (the setting is only re-defaulted for
installs that never touched it). - The “Does this plugin send data to any external service?” FAQ entry now
documents every integration individually — IndexNow, the Google Indexing
API, the shared Google service-account authentication step, the Google
Autocomplete-based Keyword Suggestion button, and Google Search Console —
with exactly what each one sends, when, where it goes, and links to its
Terms of Service and (where one exists specifically for it) Privacy
Policy. - Removed the one inline
<script>tag and the one inlineonclick=""
attribute this plugin printed directly into an admin page (both on the
SEO Redirects screen); that behavior now lives in a properly enqueued
assets/redirects.js, loaded only on that one screen. The plugin’s other
use of an inline<script type="application/ld+json">block (front-end
structured data) is intentionally unchanged — it’s a per-page JSON data
payload, not executable logic, and can’t be moved into a static enqueued
file; this is the same approach every major SEO plugin uses for schema
markup. - Fixed the
Contributors:line below to the correct WordPress.org
username.
1.0.0 – 1.0.1
Internal development milestones before this plugin’s first public
submission, including settling on its final name and branding. No
end-user-facing features changed in either step.
0.1.0 – 0.22.0
Pre-1.0 development releases that built out the feature set described
above, one batch at a time, before the first public submission.