Title: Minorank SEO
Author: MarketUp
Published: <strong>July 19, 2026</strong>
Last modified: August 4, 2026

---

Search plugins

![](https://ps.w.org/minorank-seo/assets/banner-772x250.png?rev=3623846)

![](https://ps.w.org/minorank-seo/assets/icon.svg?rev=3623846)

# Minorank SEO

 By [MarketUp](https://profiles.wordpress.org/fotibout/)

[Download](https://downloads.wordpress.org/plugin/minorank-seo.1.6.93.zip)

 * [Details](https://li.wordpress.org/plugins/minorank-seo/#description)
 * [Reviews](https://li.wordpress.org/plugins/minorank-seo/#reviews)
 *  [Installation](https://li.wordpress.org/plugins/minorank-seo/#installation)
 * [Development](https://li.wordpress.org/plugins/minorank-seo/#developers)

 [Support](https://wordpress.org/support/plugin/minorank-seo/)

## Description

**Minorank SEO** is a full-featured SEO plugin for WordPress that covers every layer
of on-page and technical SEO — meta tags, structured data (JSON-LD schema), XML 
sitemaps, redirects, and real-time content analysis — plus a set of proactive site-
health tools most plugins don’t include at all: a broken internal link checker, 
a keyword cannibalization detector, orphan content detection, and a bulk editor 
for updating SEO fields across many posts or taxonomy terms at once. Every feature
works standalone from a clean, built-in admin interface — no external platform account,
no API keys, and no AI dependency required.

Running a multilingual site with WPML, Polylang, or TranslatePress? The optional
Hreflang Health addon audits your existing hreflang setup for broken or duplicate
translation links — and it never outputs any tags of its own, so there’s no risk
of conflicting with what your multilingual plugin already generates. It also stays
completely out of the way (no visible option at all) on single-language sites.

#### Core Features

**Meta Management**
 Write and read SEO title, meta description, and focus keywords
for posts, pages, custom post types, and all taxonomies (categories, tags, WooCommerce
product categories, etc.).

**Gutenberg SEO Metabox**
 A 4-tab SEO panel appears in the block editor sidebar
for every post and page:

 * **General** — SEO title & description with live SERP preview and character-count
   indicators; focus keywords with per-keyword scoring.
 * **Advanced** — noindex / nofollow / nosnippet / noimageindex checkboxes; max-
   snippet and max-image-preview controls; canonical URL field; pillar content toggle.
 * **Schema** — per-post JSON-LD schema type override (Article, BlogPosting, FAQPage,
   HowTo, Product, LocalBusiness, and more).
 * **Social** — Facebook Open Graph preview with OG title / description / image;
   Twitter/X Card preview with independent title / description / image fields; all
   fields fall back to core meta automatically.

**Elementor Support**
 A floating, draggable SEO analysis panel appears inside the
Elementor editor — same keyword scoring and meta fields, no page reload needed.

**Content Analysis**
 Real-time scoring for each focus keyword: placement in title,
meta description, slug, and headings; content length; image alt text; internal and
external links. Each keyword gets an independent green / yellow / red score chip.
A sortable SEO Score column also appears on the Posts, Pages, Products, and custom
post type list tables.

**Readability Analysis**
 Flesch Reading Ease, passive voice percentage, long-sentence
percentage, paragraph length, transition words, and a title power-word check — independent
of the keyword-based SEO score. Auto-detects Greek vs. Latin content and adapts 
its checks accordingly instead of showing scores that don’t apply cross-lingually.

**Term & Taxonomy SEO**
 SEO title, description, focus keyword, social share image,
and noindex control for categories, tags, WooCommerce product categories, and any
custom taxonomy — the same coverage posts and pages get.

**Bulk SEO Editor**
 Edit SEO Title, Meta Description, and Focus Keyword for many
posts, pages, or taxonomy terms at once from a single filterable, searchable screen—
with a live SEO Score that recomputes after every edit, and a one-click no-index
toggle.

**Keyword Cannibalization Detector**
 Finds published posts competing for the same
focus keyword, with an inline editor warning, a dedicated report page, and an admin
notice — so you catch it at the moment it happens, not months later in Search Console.

**Internal Links & Broken Link Checker**
 Finds published pages with zero internal
links pointing to them (orphan content), surfaces link suggestions while you write,
and separately scans every internal link on your site — including custom fields 
and WooCommerce product variations — for ones that no longer resolve. Built to stay
fast at full catalog scale: incremental background scanning, no full-page rendering,
no external requests.

**WooCommerce Filter & Faceted-Navigation SEO**
 Automatically noindexes and canonicalizes
filtered/sorted shop and category URLs (price, attribute, sort order) to prevent
duplicate-content and crawl-budget waste from the near-infinite combinations these
widgets create — opt-in, off by default.

**Hreflang Health (Addon)**
 For WPML, Polylang, or TranslatePress sites — audits
the translation-link data those plugins use to build their own hreflang tags, flagging
broken or duplicate links. Never outputs hreflang tags itself, and stays completely
out of the way on single-language sites.

**XML Sitemap**
 Automatically generates a sitemap index at `/sitemap.xml` with 
per-type sub-sitemaps (posts, pages, categories, WooCommerce products and product
categories). Supports pagination, image entries (Google image sitemap namespace),
and per-post-type exclusions. Toggle each post type and taxonomy independently from
the Settings page.

**Image SEO Addon**
 Automatically fills missing alt text and title attributes on
images using configurable token-based format strings (`%post_title%`, `%filename%`,`%
focus_keyword%`, etc.). Supports casing rules and find-and-replace rules. Operates
on rendered HTML — the database is never modified.

**Redirections**
 Full CRUD admin UI for managing 301, 302, 307, 410, and 451 redirects
stored in the database. Features: search by source or target, filter by type and
group, bulk delete, group autocomplete. Redirections fire before WordPress loads
any templates — zero overhead.

**404 Monitor**
 Logs every 404 hit with URL, referrer, user agent, IP address, 
and cumulative hit count. Lets you sort by any column, bulk-dismiss entries, and
convert any 404 directly into a redirect with one click.

**JSON-LD Schema**
 Outputs structured data for every page type: WebSite + SearchAction
on the homepage, LocalBusiness (with address, geo, opening hours, social profiles),
Article / BlogPosting / NewsArticle on posts, WebPage on pages, Product on WooCommerce
products, CollectionPage on category archives, and BreadcrumbList on all content
pages.

**Local Business Schema Addon**
 Full Local Business JSON-LD configuration — business
name, type (110+ schema.org types in grouped categories), address, phone, email,
and logo.

**IndexNow**
 Automatically pings the IndexNow API (Bing, Yandex) whenever a post
is published or updated. Also lets you manually ping any URL or the homepage on 
demand.

**LLMs.txt**
 Generates a `/llms.txt` file following the [llmstxt.org](https://llmstxt.org)
specification so AI crawlers can understand your site structure.

**Post Type & URL Monitor**
 Detects new custom post types registered by newly activated
plugins and notifies you in the admin so you can configure their SEO settings. Also
monitors URL changes (renamed slugs, trashed or deleted posts) and creates redirects
automatically.

**REST API**
 Every feature is exposed via a versioned REST API at `/wp-json/minorank/
v1/`. Endpoints accept either an `X-Minorank-Key` header or a standard WordPress
admin session — no separate auth plugin needed.

#### Why Minorank SEO?

 * **No bloat** — vanilla PHP and JavaScript, no npm build step, no React dependency
   for admin pages, loads only on the pages that need it.
 * **No AI required** — every feature works standalone: no API keys to manage, no
   per-generation costs, no external platform account needed.
 * **Proactive site health, not just page-level checklists** — broken link checking,
   keyword cannibalization detection, and orphan content detection ship in the free
   plugin, catching problems most SEO plugins leave to a separate audit tool (or
   a paid tier).
 * **Built to stay fast at scale** — the broken link checker, internal link graph,
   and bulk editor all use incremental background scanning and cursor-paginated 
   queries, not full-site re-scans, so they stay usable on stores with tens of thousands
   of products.
 * **Data-safe updates** — all settings and logs are stored in WordPress options
   and custom database tables using `dbDelta()`; plugin updates never wipe your 
   data.
 * **WooCommerce-aware** — product sitemaps, product category schema, WooCommerce
   detection, and opt-in faceted-navigation SEO built in.
 * **Standards-compliant** — GPL-2.0-or-later, follows WordPress Coding Standards,`
   declare(strict_types=1)` throughout.

### External Services

This plugin connects to the following external services:

**1. IndexNow API**
 * **URL:** `https://api.indexnow.org/` * **When:** Automatically
when a post is published or updated (if IndexNow is enabled), and on-demand via 
the Settings page. * **Data sent:** Your site’s IndexNow key and the URL of the 
published/updated post. No personal data is included. * **Purpose:** Notifies Bing,
Yandex, and other IndexNow-compatible search engines of content changes for faster
indexing. * **Privacy policy:** https://www.microsoft.com/en-us/privacy/privacystatement

**Plugin privacy policy:** https://minorank.com/privacy-policy

## Screenshots

[⌊SEO Settings — XML sitemap toggles, LLMs.txt, IndexNow controls, Term & Taxonomy
SEO, and the AI Meta Generator subscription card.⌉⌊SEO Settings — XML sitemap toggles,
LLMs.txt, IndexNow controls, Term & Taxonomy SEO, and the AI Meta Generator subscription
card.⌉[

SEO Settings — XML sitemap toggles, LLMs.txt, IndexNow controls, Term & Taxonomy
SEO, and the AI Meta Generator subscription card.

[⌊Schema Markup — default JSON-LD type per content type, plus Custom Field Mapping
for reading price data from non-WooCommerce post types.⌉⌊Schema Markup — default
JSON-LD type per content type, plus Custom Field Mapping for reading price data 
from non-WooCommerce post types.⌉[

Schema Markup — default JSON-LD type per content type, plus Custom Field Mapping
for reading price data from non-WooCommerce post types.

[⌊Redirections — grouped, searchable, filterable table with bulk actions and inline
edit.⌉⌊Redirections — grouped, searchable, filterable table with bulk actions and
inline edit.⌉[

Redirections — grouped, searchable, filterable table with bulk actions and inline
edit.

[⌊404 Monitor — unique URL and total hit stat cards, sortable table, bot/system 
noise filter, one-click redirect creation.⌉⌊404 Monitor — unique URL and total hit
stat cards, sortable table, bot/system noise filter, one-click redirect creation
.⌉[

404 Monitor — unique URL and total hit stat cards, sortable table, bot/system noise
filter, one-click redirect creation.

[⌊Addons — Image SEO, Local Business Schema, WooCommerce SEO, and Hreflang Health
cards with one-click enable and dedicated settings.⌉⌊Addons — Image SEO, Local Business
Schema, WooCommerce SEO, and Hreflang Health cards with one-click enable and dedicated
settings.⌉[

Addons — Image SEO, Local Business Schema, WooCommerce SEO, and Hreflang Health 
cards with one-click enable and dedicated settings.

[⌊Keyword Conflicts — finds posts competing for the same focus keyword, grouped 
by keyword.⌉⌊Keyword Conflicts — finds posts competing for the same focus keyword,
grouped by keyword.⌉[

Keyword Conflicts — finds posts competing for the same focus keyword, grouped by
keyword.

[⌊Broken Links — scans internal links site-wide, including WooCommerce product variations,
for URLs that no longer resolve.⌉⌊Broken Links — scans internal links site-wide,
including WooCommerce product variations, for URLs that no longer resolve.⌉[

Broken Links — scans internal links site-wide, including WooCommerce product variations,
for URLs that no longer resolve.

[⌊Internal Links — orphan content detection: finds published pages with zero internal
links pointing to them.⌉⌊Internal Links — orphan content detection: finds published
pages with zero internal links pointing to them.⌉[

Internal Links — orphan content detection: finds published pages with zero internal
links pointing to them.

[⌊Bulk Editor — edit SEO Title, Meta Description, Focus Keyword, and no-index for
many posts or taxonomy terms at once, with a live-updating SEO Score.⌉⌊Bulk Editor—
edit SEO Title, Meta Description, Focus Keyword, and no-index for many posts or 
taxonomy terms at once, with a live-updating SEO Score.⌉[

Bulk Editor — edit SEO Title, Meta Description, Focus Keyword, and no-index for 
many posts or taxonomy terms at once, with a live-updating SEO Score.

## Installation

 1. Upload the `minorank-seo` folder to `/wp-content/plugins/`, or install it via **
    Plugins  Add New** in the WordPress admin.
 2. Activate the plugin through **Plugins  Installed Plugins**.
 3. Navigate to **Minorank SEO  SEO Settings** in the admin menu.
 4. (Optional) Generate an API key in Settings and use it to authenticate REST API 
    calls from external tools.

On activation the plugin automatically creates two custom database tables (`minorank_404s`
and `minorank_redirections`) and registers all rewrite rules for sitemaps, LLMs.
txt, and IndexNow.

## FAQ

### Does this replace Rank Math or Yoast SEO?

Yes — Minorank SEO is a standalone plugin and does not require Rank Math or Yoast.
It reads existing Rank Math and Yoast meta keys alongside its own for backwards-
compatible imports.

### Where is data stored?

 * SEO meta: standard WordPress post meta and term meta tables.
 * Plugin settings: `wp_options` (keys prefixed with `minorank_`).
 * 404 logs: `{prefix}minorank_404s` custom table.
 * Redirections: `{prefix}minorank_redirections` custom table.
 * Internal Links (orphan content graph): `{prefix}minorank_internal_links` custom
   table.
 * Broken Links: `{prefix}minorank_broken_links` custom table.

All data persists across plugin updates. Uninstalling the plugin removes all options
and custom tables. Hreflang Health has no custom table of its own — it reads live
from your multilingual plugin’s own data on each check rather than storing a separate
copy.

### Will I lose my settings when I update the plugin?

No. Settings are stored in the WordPress database, not in plugin files. Updating
the plugin files never touches your options or custom tables.

### How does the REST API work?

All endpoints live under `/wp-json/minorank/v1/`. You can authenticate with:

 * An `X-Minorank-Key: your-api-key` request header, **or**
 * A standard WordPress admin session (cookie + WP REST nonce) — no API key needed
   when logged in as an admin.

### Does it work with WooCommerce?

Yes. Product sitemaps, product category sitemaps, Product schema markup, and WooCommerce-
specific content analysis are all built in.

### Does it support custom post types?

Yes. Meta management, the SEO metabox, and content analysis work on any registered
post type. The sitemap section lets you toggle any public post type individually.

### Does Hreflang Health add its own hreflang tags?

No. WPML, Polylang, and TranslatePress all already generate their own `hreflang`
tags automatically. Hreflang Health only reads the same translation-link data those
plugins use internally and flags problems in it (a link pointing at a deleted page,
two translations claiming the same language) — it never writes any tags itself, 
so there’s no risk of duplicate or conflicting hreflang output. It’s also invisible
on single-language sites.

### What redirect types are supported?

301 (Moved Permanently), 302 (Found / Temporary), 307 (Temporary Redirect), 410 (
Gone), and 451 (Unavailable For Legal Reasons).

### How does IndexNow work?

On activation a random key is generated and stored in `wp_options`. When you publish
or update a post, the plugin pings `https://api.indexnow.org/` with that key and
the post URL. You can also trigger manual pings from the Settings page.

## Reviews

There are no reviews for this plugin.

## Contributors & Developers

“Minorank SEO” is open source software. The following people have contributed to
this plugin.

Contributors

 *   [ MarketUp ](https://profiles.wordpress.org/fotibout/)
 *   [ minoRank ](https://profiles.wordpress.org/minorank/)

[Translate “Minorank SEO” into your language.](https://translate.wordpress.org/projects/wp-plugins/minorank-seo)

### Interested in development?

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

## Changelog

#### 1.6.93

 * Fixed: API-key-authenticated requests (used by the Minorank platform integration)
   to the Meta, Internal Links, Keyword Conflicts, Broken Links, and Bulk Editor
   content endpoints were incorrectly rejected as permission-denied. These routes’
   per-object ownership check didn’t recognize a valid API key the way the route-
   level check already did, so a trusted server-to-server request was evaluated 
   as an anonymous visitor and always denied.
 * Security fix: SEO meta fields (title, description, focus keyword, etc.) are registered
   with `show_in_rest`, so they’re also writable through WordPress core’s own REST
   API, independent of the plugin’s own save handlers — which do sanitize input.
   That core write path had no `sanitize_callback`, so a non-admin role granted 
   a narrow on-page capability could store raw HTML/script in the title field, which
   is then echoed unescaped into the page’s `<title>` tag for every visitor. Both
   ends are now fixed: the meta registration sanitizes on write, and the `<title
   >` output is escaped as defense in depth.
 * Security fix: the Internal Links and Broken Links “ignore” endpoints didn’t check
   whether the requesting user could actually edit the specific post being flagged,
   unlike every other object-scoped endpoint in the plugin — a role granted only
   the Internal Links or Broken Links capability could suppress the SEO report for
   any post on the site, not just ones they have edit access to.

#### 1.6.92

 * Fixed: Elementor’s sidebar could get stuck on our SEO tab — after editing SEO
   fields, clicking elsewhere (to select a widget, add a new one, etc.) sometimes
   did nothing until the page was reloaded. Our SEO panel is a standalone overlay
   so Elementor’s own panel switching doesn’t affect its visibility, but the code
   that hid it again in response to a click was bound to a specific navigation element
   that Elementor replaces when the panel context changes (e.g. selecting a widget),
   silently going dead. Now uses a listener that survives those replacements, plus
   a backup check that force-hides the panel the moment Elementor shows widget-editing
   tabs.

#### 1.6.91

 * Security fix: the main-image detection used by the SEO metabox (Gutenberg, classic
   editor, and Elementor) called `maybe_unserialize()` on every public custom field
   value on a post, which allows unrestricted PHP object instantiation. Any user
   able to save custom fields (Editor, Author) could store a crafted payload that
   would run when an admin later opened that post — now uses the same restricted,`
   allowed_classes: false` unserialize already used for redirect import data.

#### 1.6.90

 * Security fix: the server-to-server API key was being sent to every Minorank admin
   page (Redirections, 404 Monitor, Schema, Bulk Editor, etc.), not only the Settings
   page that actually displays it. It now only reaches the browser on the Settings
   page, reducing what a future unrelated XSS bug on any other admin page could 
   possibly expose.

#### 1.6.89

 * Security fix: the server-to-server API key (used by the external Minorank platform
   integration, and capable of bypassing every per-tool capability check) was being
   sent to the browser for any user with any Minorank capability, not only administrators.
   It is now only exposed to users who hold `manage_options`.
 * Security fix: the Bulk Editor’s post-content endpoint returned a post or term’s
   raw title/content/slug without checking whether the requesting user could actually
   edit that specific item.
 * Security fix: JSON-LD schema output did not escape `<`/`>` characters, so a stored
   value containing `</script>` could break out of the schema `<script>` tag and
   run arbitrary JavaScript for site visitors.
 * Fixed: redirects to external domains were silently being sent to the WordPress
   admin URL instead of their real destination.
 * Security fix: the 404 Monitor no longer trusts the attacker-controllable `X-Forwarded-
   For`/`X-Real-IP` headers for the logged visitor IP — only the actual connection
   IP is used.
 * Security fix: Rank Math redirect import now tries JSON decoding before falling
   back to a hardened `unserialize()` call (object instantiation disabled), removing
   a PHP object-injection vector from imported data.
 * Fixed: the 404 Monitor’s diagnostic trace and log no longer include the site’s
   database name and table prefix, which weren’t needed for troubleshooting.

#### 1.6.88

 * Fixed: removed a stray `.DS_Store` file that had been accidentally included in
   the plugin folder.
 * Fixed: several direct database queries had PHPCS suppression comments placed 
   incorrectly, so the intended exemption silently failed to apply on multi-line
   statements; comments are now correctly scoped so static analysis tools don’t 
   flag safe, hardcoded-table queries as unescaped input. No functional or behavioral
   change — all affected queries already used safe, hardcoded table names or `$wpdb-
   >prepare()` placeholders.

#### 1.6.87

 * Fixed: the Gutenberg “Image alt text contains keyword” check could still report
   the featured image’s alt text as missing even when correctly set, because the
   check ran once before the image’s data had finished loading and never re-checked
   afterwards. Now reads the featured image fresh on every analysis pass instead
   of relying on a stale snapshot.

#### 1.6.86

 * Fixed: the “Image alt text contains keyword” content-analysis check ignored the
   featured/main image entirely in Gutenberg and Elementor — it only ever looked
   at `<img>` tags inside the post content, so a keyword placed correctly in the
   main image’s alt text (and nowhere else) was reported as missing. The classic
   editor (used for WooCommerce products and CPTs on the Classic Editor) already
   checked this correctly; Gutenberg and Elementor now match it, reusing the same
   main-image resolver that already handles custom-field-based images for CPT builders
   like JetEngine.

#### 1.6.85

 * Security fix: Elementor’s native SEO tab (a separate integration not covered 
   by the earlier Role Manager work) had no capability check at all — it preloaded
   a post’s SEO meta for any user who could open Elementor, regardless of their 
   granted on-page capabilities. Also fixed a related regression: legitimately on-
   page-granted roles were getting 403 errors using that same tab, since its save
   requests share the /meta endpoint with the Bulk Editor, which had been narrowed
   to Bulk-Editor-only in the previous update.

#### 1.6.84

 * Changed: the Role Manager’s single “Edit SEO Meta” capability is now split into
   4, matching Rank Math’s on-page structure — On-Page General (title/description/
   focus keyword/analysis), On-Page Advanced (robots/canonical), On-Page Schema,
   and On-Page Social. A role can now be granted access to specific metabox tabs
   instead of all-or-nothing. Enforced both in the tab UI (Gutenberg and classic
   editor) and server-side at save time for every field.

#### 1.6.83

 * Security fix: the /meta endpoint (the post/term editor metabox) and three related
   read-only endpoints (link suggestions, keyword-conflict check, broken-links-for-
   post) now verify the current user can edit the _specific_ post or term requested,
   not just that they hold the general “Edit SEO Meta” capability — closes a gap
   where a role granted that capability could have read or written SEO meta for 
   any post/term site-wide instead of only ones they already have edit rights to.

#### 1.6.82

 * Fixed: the Role Manager’s “Update Capabilities” button gave no clear confirmation
   that changes were actually saved — it now shows “✓ Saved” directly on the button
   for a couple seconds after a successful save.

#### 1.6.81

 * Added a Role Manager page — grant specific WordPress roles (Editor, Author, custom
   roles, etc.) access to individual Minorank SEO tools instead of everything being
   all-or-nothing behind manage_options. 11 capabilities: SEO Settings, Schema Markup,
   Redirections, 404 Monitor, Internal Links, Keyword Conflicts, Broken Links, Bulk
   Editor, SEO Analyzer, Addons, and Edit SEO Meta (the post-editor metabox). Administrator
   always has full access and can’t be changed. Existing installs are unaffected—
   Administrator automatically retains every capability on update.

#### 1.6.80

 * Added a new SEO Analyzer page — an on-demand health check (you click “Run Analysis”,
   nothing runs automatically) with a Rank Math-style score ring, pass/warning/failed
   progress bars, and an All / Passed Tests / Warnings / Failed Tests tab layout.
   The last scan is stored and loads instantly on revisit — no re-scan just from
   opening the page. Two categories: Structure (permalink structure, tagline, search
   engine visibility, H1/H2 headings, title/description length, image ALT attributes,
   canonical tag, noindex meta, OpenGraph meta) and Site Health, which reuses real,
   site-wide data from Broken Links, Internal Links, Keyword Conflicts, and Redirections
   instead of shallow homepage-only re-checks.

#### 1.6.76

 * Fixed: the Bulk Editor listed Elementor’s internal template-library items (footer,
   header, popups, the site’s Default Kit) alongside real content — these are now
   excluded, since they’re never pages a site owner would want SEO meta on.

#### 1.6.75

 * Changed: Local Business Schema now defaults to OFF for fresh installs instead
   of being enabled automatically. Sites that already had real business data configured
   are unaffected (a migration preserves their existing enabled state).
 * Fixed: the Broken Links checker flagged working `/wp-content/` links (uploaded
   PDFs, images, theme/plugin assets) as broken, since those are direct file paths
   rather than post permalinks and can never resolve via url_to_postid(). Now verified
   against the actual file on disk instead.

#### 1.6.74

 * Added a 404 Monitor settings card: a master on/off switch for logging, and a 
   retention setting (default 90 days, 0 = forever) that auto-purges stale entries
   daily via cron — prevents unbounded log growth on large or heavily-scanned sites.

#### 1.6.73

 * Fixed: the Gutenberg editor’s Social Share Image field showed “No image selected”
   even when a featured image was set, instead of previewing it as the automatic
   default (the classic editor and the actual front-end output already did this 
   correctly — only the Gutenberg sidebar was missing it).

#### 1.6.72

 * Added taxonomy term counts to the Quick Import status (“N taxonomy terms, N already
   have Minorank SEO data”) and to the Rank Math/Yoast import buttons, alongside
   the existing post counts — confirms custom post types and custom taxonomies are
   already fully covered by the import, not just built-in posts/pages.

#### 1.6.71

 * Added a warning notice when another SEO plugin (Rank Math, Yoast, All in One 
   SEO, SEOPress, or The SEO Framework) is active alongside Minorank SEO, since 
   running two SEO plugins at once causes duplicate meta tags and conflicting sitemaps/
   schema.

#### 1.6.70

 * Fixed: the redirect target picker’s search queried all post types (and all taxonomies)
   under one shared result limit, so a large product catalog could crowd Pages/Posts(
   or regular categories/tags) out of the results entirely. Each post type and taxonomy
   now gets its own slice of results.

#### 1.6.69

 * Added a searchable target picker to the redirect Target URL field — search your
   site’s own pages, posts, products (by title or SKU), and other post types, plus
   taxonomy terms, grouped by type, and click a result to fill in its real URL.

#### 1.6.68

 * Fixed: adding a redirect source that already exists now clearly explains why 
   it wasn’t created (showing the target it already redirects to) instead of a vague
   partial-success count.
 * Added a redirect health check — detects redirect loops (including self-redirects)
   and redirect chains, with a one-click scan from the Redirections page.
 * Added an Import & Migration addon consolidating all import tools in one place:
   a Quick Import (one click) for SEO meta and redirects from Rank Math or Yoast,
   plus CSV import with your own column mapping for meta and for redirects — so 
   exports from any other SEO plugin can be brought in, not just Rank Math/Yoast.
 * Added Rank Math redirect import — brings in active, exact-match redirects with
   automatic conflict/duplicate detection.
 * Removed the old standalone “Import from another SEO plugin” section from Settings
   and the standalone Rank Math redirect import button from Redirections, both now
   folded into the Import & Migration addon.

#### 1.6.63

 * Added Hreflang Health (Addon) for WPML, Polylang, and TranslatePress sites — 
   audits the translation-link data those plugins already use to build their own
   hreflang tags, flagging broken links (pointing at a deleted/trashed page) and
   duplicate-language entries within a translation group. Never generates or outputs
   any hreflang tags itself, avoiding duplicate/conflicting tags — and stays completely
   hidden on single-language sites rather than showing as a disabled option.
 * Removed the AI Meta Generator (post editor “Generate with AI” button and its 
   REST endpoint) — AI-assisted meta generation is now exclusively available through
   a Minorank platform subscription, and the free plugin no longer makes any direct
   calls to a third-party AI API.
 * Added taxonomy term support (categories, tags, custom taxonomies) to the Bulk
   SEO Editor, alongside posts and pages — including a live SEO Score for terms,
   computed against the term description.
 * Added bulk-select-to-ignore (with select-all and a bulk action bar) to the Internal
   Links and Broken Links report pages.
 * Fixed: robots/noindex meta was never output on taxonomy archive pages, even when
   explicitly set.

#### 1.6.61

 * Added a Broken Link Checker — scans every internal link on your site (post content,
   WooCommerce product variations, and any custom field containing a real link) 
   for URLs that no longer resolve to a published page. No external requests; safe
   at full catalog scale via incremental background scanning. Surfaced in a dedicated
   report page and inline in the post editor.
 * Added a Keyword Cannibalization Detector — finds published posts competing for
   the same focus keyword, with an inline editor warning, a report page, and an 
   admin notice.
 * Added the Bulk SEO Editor — edit SEO Title, Meta Description, and Focus Keyword
   for many posts at once, with a live-recomputed SEO Score and a one-click no-index
   toggle.
 * Added a sortable SEO Score column to the Posts, Pages, Products, and custom post
   type list tables.
 * Added WooCommerce filter/faceted-navigation SEO (opt-in, off by default): automatically
   noindexes and canonicalizes filtered/sorted shop and category URLs to prevent
   duplicate-content and crawl-budget waste.
 * Added real-time Link Suggestions in the post editor — surfaces related, unlinked
   pages while writing.
 * Added an “Internal Links” report page — finds published pages with zero internal
   links pointing to them.
 * Added Content & Title Readability analysis (Flesch Reading Ease, passive voice,
   sentence/paragraph length, transition words), with Greek-language support.
 * Added per-type Schema readiness badges, FAQPage auto-extraction and manual entry,
   and Merchant Listing schema fixes (return policy, GTIN, delivery time).
 * Security: fixed broken per-object authorization on registered post/term meta 
   that allowed any user with a generic edit capability to read Minorank SEO meta
   for any post/term via WordPress core’s REST API; fixed CSV/formula injection 
   in exports; switched API key comparisons to constant-time; removed the URL query-
   parameter fallback for API key auth.
 * Numerous UX fixes found via live testing: admin notice positioning, list-table
   column registration timing, classic-editor parity for the SEO Score column, WooCommerce
   Cart/My Account false-positive broken links, and more.

#### 1.6.16

 * Fixed: the 404 Monitor admin page always showed “No 404 errors logged” even when
   404s were being logged correctly — the page requested more rows per page than
   the REST API allowed, and the resulting validation error was silently treated
   as an empty list.
 * Added a “Run Diagnostics” tool to the 404 Monitor page that verifies the log 
   table, database writes, and the most recent real request, to make this class 
   of issue self-diagnosable in the future.
 * Fixed: the “Total Hits” stat on the 404 Monitor page concatenated hit counts 
   as text instead of summing them (a JavaScript string-vs-number bug that also 
   silently broke sorting by the Hits column).
 * Fixed: long URLs in the 404 Monitor table could overflow the layout.
 * Added CSV export to both 404 Monitor and Redirections — exports the full log/
   list (not capped at what’s on screen, and not capped at Search Console’s 1,000-
   row export limit).
 * Added a “Hide bot/system noise” filter to 404 Monitor that excludes common vulnerability-
   scanner probes and browser auto-requests (favicon, touch icons) from the view
   and CSV export.
 * Added bulk redirect creation: select multiple 404 entries and redirect them all
   to the same target URL in one action; the selected entries are automatically 
   cleared from the 404 log afterward.

#### 1.6.9

 * Added Term & Taxonomy SEO: title, description, focus keyword, and social share
   image fields on category/tag/custom taxonomy edit screens, with a taxonomy picker
   in a new Term & Taxonomy SEO settings card.
 * Added a taxonomy monitor (mirrors the existing post type monitor) that detects
   newly registered taxonomies — e.g. from JetEngine or other CPT builders — and
   surfaces them in the SEO Alerts banner.
 * Added a classic (non-block-editor) meta box for post types that don’t use the
   Gutenberg editor — WooCommerce Products and many CPT-builder post types previously
   had no SEO fields at all. Includes the same 4-tab layout (General/Advanced/Schema/
   Social), full SEO analysis engine, multi-keyword scoring, SERP preview, and automatic
   main-image detection as the Gutenberg sidebar.
 * Fixed: per-post Schema type override was saved but never actually output — schema
   output now correctly respects it.
 * Fixed: schema output only worked for posts, pages, and products — any other post
   type got no schema at all, regardless of settings.
 * Schema types are now multi-select (e.g. Product + FAQPage on the same page) instead
   of single-select.
 * Added automatic suppression of WooCommerce’s native Product schema when Minorank
   SEO outputs its own, avoiding duplicate/conflicting structured data.
 * Enriched Product schema with SKU, brand (via a configurable taxonomy), real WooCommerce
   review data (aggregateRating), and multiple images.
 * Added optional shipping cost and return policy settings (WooCommerce SEO addon)
   that populate Google’s shippingDetails/hasMerchantReturnPolicy schema fields.
 * Added Custom Field Mapping (new Schema Markup settings page) so Product schema
   pricing can be read automatically from an existing custom field on non-WooCommerce
   post types (e.g. a Cars CPT), instead of manual re-entry per post.
 * Added a dedicated “Schema Markup” page in the admin menu, split out of the general
   SEO Settings page.
 * Fixed a broken internal/external link detection regex that failed to match ordinary`
   <a href="...">` markup, affecting SEO score accuracy across the block editor,
   classic editor, and Elementor content analysis.
 * Frontend meta description now falls back to the post excerpt when no explicit
   description is set, instead of omitting the tag.

#### 1.6.8

 * Fixed Anthropic Terms of Service URL — corrected to https://www.anthropic.com/
   legal/commercial-terms (previous link returned 404).

#### 1.6.7

 * Fixed Anthropic Terms of Service link in readme — corrected from AUP to commercial
   terms.

#### 1.6.6

 * Security: removed JSON_UNESCAPED_SLASHES from both JSON-LD script tag outputs—
   forward slashes are now escaped to `\/` preventing any `</script>` sequence in
   stored data from breaking out of the script tag.
 * Added fotibout to contributors list.
 * Removed screenshot assets from plugin zip (uploaded separately via SVN per WP.
   org guidelines).

#### 1.6.5

 * Plugin Check: switched all multi-line DB query blocks from `phpcs:ignore` to `
   phpcs:disable`/`phpcs:enable` — `phpcs:ignore` only covers one line, so `PreparedSQL.
   NotPrepared` and `InterpolatedNotPrepared` were still firing on inner string-
   concatenation lines inside multi-line `prepare()` calls (404, redirections, sitemap
   classes).
 * Plugin Check: suppressed `NonceVerification.Recommended` on REST API key fallback(`
   $_GET['mnrk_key']`) — intentional, nonce-free API key auth.
 * Plugin Check: suppressed `Squiz.DiscouragedFunctions` for `@set_time_limit(300)`
   in bulk importer — required for long-running operations.
 * Plugin Check: suppressed VIP `WPQueryParams.PostNotIn` performance warnings on
   sitemap exclusion lists — standard feature, not a VIP host.
 * Plugin Check: added inline `phpcs:ignore` for `$_SERVER['REQUEST_URI']` in 404
   monitor `current_url()`.
 * Trimmed readme short description to 140 characters (WP.org limit is 150).

#### 1.6.4

 * Plugin Check: fixed remaining `PreparedSQL.NotPrepared` errors — added correct
   phpcs:ignore to all queries using string-concatenated class constants (`. self::
   TABLE .`) in 404, redirections, and sitemap classes.
 * Plugin Check: replaced PHP native `parse_url()` with WordPress wrapper `wp_parse_url()`
   in redirections normalizer.
 * Plugin Check: added `phpcs:ignore` for `$_SERVER['REQUEST_URI']` in redirect 
   handler (used only for path comparison, never for output).
 * Plugin Check: replaced `(int)` cast with `absint()` in Elementor enqueue so PHPCS
   recognises it as sanitization.
 * Updated “Tested up to: 7.0”.

#### 1.6.3

 * Plugin Check: fixed all EscapeOutput errors — printf in SEO alerts notice now
   uses `wp_kses_post()` on the detail HTML and `esc_html()` on all string slots.
 * Plugin Check: fixed global variable names in `uninstall.php` — all top-level 
   variables now prefixed with `minorank_` per WordPress coding standards.
 * Plugin Check: fixed `$_SERVER` input handling in 404 monitor — `wp_unslash()`
   now called at point of read for all server variables.
 * Plugin Check: fixed `$_GET` unslash in content analysis Elementor enqueue.
 * Plugin Check: sanitized `$_GET`/`$_SERVER` in REST API `check_permission()`.
 * Plugin Check: added missing `phpcs:ignore` comments for `PreparedSQL.NotPrepared`
   on table-name-only COUNT queries in 404, redirections, and sitemap classes.
 * Plugin Check: added missing `phpcs:ignore` on `postmeta` direct queries in import
   handler.
 * Plugin Check: changed `wp_redirect()` to `wp_safe_redirect()` in redirections
   handler.
 * Plugin Check: updated “Tested up to” to WordPress 6.8.
 * Created `languages/` directory to match `Domain Path` plugin header.

#### 1.6.2

 * Redirections: fixed “Select all” checkbox appearing oversized — `.mn-filter-bar
   input` CSS now excludes `[type=checkbox]` so the `min-width` rule no longer inflates
   it.

#### 1.6.1

 * Import: import section now auto-hides after a successful migration and only reappears
   if “Reset import data” is clicked.
 * Redirections: fixed inconsistent column widths across accordion groups by switching
   to `table-layout:fixed` with explicit header widths.
 * Redirections: fixed oversized “Select all” and row checkboxes; changed edit button
   to plain text “Edit” for consistent rendering.
 * 404 Monitor: fixed hit counts always displaying 1 — SQL query now aliases `hit_count`
   as `hits` to match the JavaScript field name.
 * 404 Monitor: raised per-page cap from 100 to 500 entries.

#### 1.6.0

 * Added WooCommerce SEO addon — remove product base, remove category base, remove
   parent slugs, remove generator tag, remove schema on shop archives, and select
   brand taxonomy. Addon card is disabled when WooCommerce is not active.
 * SEO alerts notice: “View Details” now expands an accordion inline in the admin
   notice showing the full list of new post types and URL changes — no page navigation
   required.
 * Added `uninstall.php` — cleans up all plugin options and drops custom tables 
   on uninstall.

#### 1.5.8

 * Sitemap: replaced Exclude Posts and Exclude Terms text inputs with a searchable
   multi-select picker — click to browse all posts or terms, search to filter, select
   by clicking, or add any ID manually.
 * REST API: `/search-posts` and `/search-terms` endpoints now return up to 50 results
   when called without parameters (for initial dropdown population).

#### 1.5.7

 * Sitemap: added pagination support — large sites generate multiple sub-sitemaps(
   e.g. `sitemap-posts-2.xml`).
 * Sitemap: added image sitemap support — `<image:image>` entries added to each 
   URL using the Google image sitemap namespace.
 * Sitemap: added “Include Featured Images” toggle to include featured images even
   when not embedded in post content.
 * Sitemap: added “Images in Sitemaps” master toggle.
 * Sitemap: added “Links Per Sitemap” control (default 1000).
 * Sitemap: added Exclude Posts and Exclude Terms ID fields to remove specific entries
   from sitemaps.
 * REST API: added `/search-posts` and `/search-terms` endpoints for sitemap exclude
   pickers.

#### 1.5.6

 * Local Business addon: expanded business type list to 110+ schema.org LocalBusiness
   subtypes across 13 optgroups.

#### 1.5.5

 * Admin: save buttons now show a spinner while the request is in flight.
 * Admin: success/error messages after saving now persist until page navigation (
   no auto-dismiss).

#### 1.5.4

 * Image SEO addon: added token-based alt/title format system — `%post_title%`, `%
   filename%`, `%focus_keyword%`, `%attachment_title%`, `%site_name%`, `%category%`,
   and `%sep%` separator token.
 * Image SEO addon: added token picker UI with searchable dropdown and insert-at-
   cursor.
 * Image SEO addon: added separator field used between non-empty token segments.

#### 1.5.3

 * Added Addons page (`Minorank SEO → Addons`) with toggleable addon cards.
 * Image SEO settings moved from SEO Settings to the Addons page.
 * Local Business Schema settings moved from SEO Settings to the Addons page.

#### 1.5.2

 * Image SEO: added find-and-replace rules for alt and title text.
 * Image SEO: added casing options (lowercase, UPPERCASE, Title Case) for alt and
   title independently.
 * Image SEO: added avatar alt text support via `pre_get_avatar_data` filter.

#### 1.5.1

 * Image SEO: added `wp_get_attachment_image_attributes` filter for block editor
   images, galleries, and thumbnails.
 * Image SEO: added add-missing-alt and add-missing-title toggles with configurable
   fallback format.

#### 1.5.0

 * Added Image SEO addon (`class-image-seo.php`) — automatically fills missing alt
   and title attributes on images using resolved format strings. Database is never
   modified; operates on rendered HTML only.

#### 1.4.1

 * SEO alerts: clustered post type and URL change alerts into a single admin notice
   instead of separate notices.
 * Import: fixed import status response not returning correctly on partial imports.

#### 1.4.0

 * Added post type monitor (`class-post-type-monitor.php`) — detects newly registered
   custom post types and shows an admin notice.
 * Added URL monitor (`class-url-monitor.php`) — detects renamed slugs and trashed/
   deleted posts; creates redirects automatically.

#### 1.3.0

 * Settings UI: replaced AI settings panel with a subscription promo card (AI generation
   still available via REST API).
 * Schema: WooCommerce schema options hidden when WooCommerce is not active.

#### 1.2.4

 * Admin: added standalone three-page admin interface (SEO Settings, Redirections,
   404 Monitor) — no external platform required.
 * Redirections UI: search by source/target, filter by type and group, bulk delete,
   paginated fetch, group name autocomplete.
 * 404 Monitor UI: stat cards, sortable columns, bulk dismiss, one-click “Create
   Redirect” action.
 * Settings UI: Save All button with data-loss guard; API key auto-tested on every
   page load.
 * REST API: `check_permission()` is now `public`.

#### 1.2.3

 * Schema: `output_schema()` reads per-content-type schema type from settings; configurable
   from the Settings page.
 * REST API: `check_permission()` accepts both API key and logged-in WP admin sessions.
 * Sitemap: WooCommerce product and product_cat sub-sitemaps respect enabled toggles
   correctly.

#### 1.2.2

 * IndexNow: manual URL ping field and homepage ping button added to Settings.
 * Sitemap: each enabled sub-sitemap shows its URL inline for easy copying.
 * Settings: WooCommerce section conditionally shown only when WooCommerce is active.

#### 1.2.1

 * Content analysis: multiple focus keywords scored independently — each keyword
   gets its own green/yellow/red chip.
 * Meta: focus keywords persisted to `_minorank_focus_keywords` post meta.

#### 1.2.0

 * Meta: added 13 new `_minorank_*` meta fields (robots, canonical, OG, Twitter,
   schema type, pillar flag).
 * Output: emits robots meta, canonical link, full Open Graph tags, and Twitter 
   Card tags.
 * Gutenberg: new 4-tab SEO sidebar (General / Advanced / Schema / Social).

#### 1.1.9

 * Content analysis: keyword input replaced with tag/chip input — press Enter to
   add, × to remove.
 * Content analysis: each keyword chip colored by SEO score.

#### 1.1.7

 * Added Elementor editor support via floating draggable content analysis panel.

#### 1.1.6

 * Added block editor content analysis sidebar.

#### 1.1.5

 * Schema: configurable per-content-type schema via `output_schema()`.

#### 1.1.2

 * Redirections: added `group_name` column; extended type support to 307, 410, 451.

#### 1.1.0

 * Added XML sitemap generator, `/llms.txt` endpoint, IndexNow integration, and 
   JSON-LD schema output.

#### 1.0.0

 * Initial release — REST API, meta management, 404 monitor, redirections, admin
   settings.

## Meta

 *  Version **1.6.93**
 *  Last updated **1 week ago**
 *  Active installations **Fewer than 10**
 *  WordPress version ** 6.0 or higher **
 *  Tested up to **7.0.3**
 *  PHP version ** 8.0 or higher **
 *  Language
 * [English (US)](https://wordpress.org/plugins/minorank-seo/)
 * Tags
 * [redirects](https://li.wordpress.org/plugins/tags/redirects/)[schema](https://li.wordpress.org/plugins/tags/schema/)
   [seo](https://li.wordpress.org/plugins/tags/seo/)[sitemap](https://li.wordpress.org/plugins/tags/sitemap/)
   [woocommerce seo](https://li.wordpress.org/plugins/tags/woocommerce-seo/)
 *  [Advanced View](https://li.wordpress.org/plugins/minorank-seo/advanced/)

## Ratings

No reviews have been submitted yet.

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

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

## Contributors

 *   [ MarketUp ](https://profiles.wordpress.org/fotibout/)
 *   [ minoRank ](https://profiles.wordpress.org/minorank/)

## Support

Got something to say? Need help?

 [View support forum](https://wordpress.org/support/plugin/minorank-seo/)