SEOGeoX

Mô tả

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 via hreflang alternate 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 had manage_options, and advanced-field access defaults
    to whichever roles already had edit_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.

Cài đặt

  1. Zip the seogeox folder if it isn’t already, or upload it as-is
    via Plugins > Add New > Upload Plugin.
  2. Activate the plugin.
  3. 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.
  4. Edit any post or page — the SEOGeoX meta box appears below the
    content editor.

Hỏi đáp

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/faq

Google 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’s indexing.googleapis.com. Docs:
https://developers.google.com/search/apis/indexing-api/v3/quickstart —
Terms: https://developers.google.com/terms — Privacy:
https://policies.google.com/privacy

Google 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 the client_email and 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’s oauth2.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/privacy

Google 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/privacy

Google 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/privacy

Automated 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 with hreflang alternates) if either plugin
is active; see the note above about this not yet being tested against a
real multilingual install.

Đánh giá

Đọc tất cả 1 đánh giá

Người đóng góp & Lập trình viên

“SEOGeoX” là mã nguồn mở. Những người sau đã đóng góp vào plugin này.

Những người đóng góp

Nhật ký thay đổi

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 in assets/admin.js.
    Replaced with a plain <img> element (same visual result, styled via
    assets/admin.css) run through the file’s existing escapeHtml() helper.
  • Removed the one remaining literal onclick="..." example text from a code
    comment in assets/confirm-submit.js describing 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 with style="display:none;"). All of it now lives
    in assets/admin.css as 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
    own submit_button() helper as an onclick attribute — still a real
    inline event handler even though it wasn’t typed as literal HTML in the
    template. Replaced with a plain data-confirm attribute 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 to wp_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 like RCSEO_/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 inline onclick=""
    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.