-
v3.0.3 Stable
released this
2026-07-18 17:40:02 +00:00 | 0 commits to main since this release3.0.3 [2026-07-18]
Added
- "Robots" column on taxonomy list tables. When per-term granular control is on, the Categories / Tags / custom taxonomy list pages now show a "Robots" column with the same directive badges (🔍 noindex, 🔗 nofollow, 💾 noarchive, 📄 nosnippet, 🖼️ noimageindex) used on the post list. Makes it possible to scan at a glance which terms have an override and which directives are active — parity with the existing post-list UX.
Compatibility
- WordPress: 5.7 - 7.1
- PHP: 7.2 - 8.5
Tests
- Added 3 tests covering the term column renderer (no override, with override, passthrough for other columns).
Downloads
-
v3.0.2 Stable
released this
2026-07-18 17:38:56 +00:00 | 1 commits to main since this release3.0.2 [2026-07-18]
Fixed
- Duplicate "Search Engine Visibility" panel in the block editor. The plugin previously registered both a classic PHP meta box (
add_meta_box) AND a native Gutenberg sidebar panel (PluginDocumentSettingPanelviaassets/js/editor-sidebar.js) with the same title — both showed up in the block editor sidebar as two panels with the same name. The classic meta box is now suppressed on block-editor screens (detected viaget_current_screen()->is_block_editor, which respects the Classic Editor plugin's per-request override). Classic editor users still get the meta box.
Added
- Per-term granular control for taxonomies. Mirrors the existing per-post granular pattern: when "Enable per-term granular control" is on, every public taxonomy (
category,post_tag, and any custom public taxonomy like WooCommerce'sproduct_cat/product_tag) gets a "Search Engine Visibility" panel on the Edit Tag screen with an override checkbox and the five directive checkboxes. Term-level directives take precedence over the globalcategory/tag/post_type_archivesettings when the term has the override enabled. Backed byregister_term_meta()withshow_in_rest=trueso headless consumers can read them.
Compatibility
- WordPress: 5.7 - 7.1
- PHP: 7.2 - 8.5
Tests
- Added
tests/test-term-meta.phpcovering registration, save handler, front-end override precedence, and uninstall cleanup.
Downloads
- Duplicate "Search Engine Visibility" panel in the block editor. The plugin previously registered both a classic PHP meta box (
-
v3.0.1 Stable
released this
2026-07-18 16:19:22 +00:00 | 2 commits to main since this release3.0.1 [2026-07-18]
Fixed
- Self-healing v3 migration. If
noindex_seo_config_versionclaims migration completed (version >= 3) but the consolidatednoindex_seo_settingsoption is somehow missing,noindex_seo_check_migration()now re-runs the migration automatically. This recovers silently from partial failures: object-cache staleness after the write, request interrupted mid-migration, a third-party plugin clearing options, or DB write errors that did not raise a PHP error. Without this guard, the front-end would fall back to all-zero defaults (site fully indexable) until someone re-saved the settings page.
Compatibility
- WordPress: 5.7 - 7.1
- PHP: 7.2 - 8.5
Tests
- Added test for the self-healing migration path.
3.0.0 [2026-07-18]
Major release — storage consolidation. Settings are now stored in a single autoloaded option (
noindex_seo_settings) instead of ~110 individual options. Reduceswp_optionsautoload weight on every page load. Legacy options are preserved (marked non-autoloaded) for one major version to allow safe rollback to 2.x; they will be removed in 4.0.Added
- "Apply recommended defaults" button on the settings page. One click enables all 12 contexts flagged as "Recommended" in the UI (privacy policy, date archives, pagination, search results, attachment pages, preview/customize-preview, and 404). Previously required ~60 individual checkbox toggles.
- Filterable conflict-detection list. The list of plugins that may conflict with noindex SEO is now passed through
apply_filters('noindex_seo_conflicting_plugins', ...). Third-party code can extend or replace the list without editing the plugin.
Changed
- Storage consolidated: 110 directive options (
{directive}_seo_{context}) + 5 config options (noindex_seo_config_*) merged into onenoindex_seo_settingsarray. Reads go through new accessors (noindex_seo_get_settings(),noindex_seo_get_setting(),noindex_seo_get_config()). The hourly transient cache is preserved on top. - Transient invalidation is now automatic: any update to
noindex_seo_settingsclears thenoindex_seo_optionstransient via theupdate_option_noindex_seo_settingshook. Previously only the admin form save cleared it, leaving WP-CLI / REST / programmatic edits stale for up to one hour. - Migration: existing 2.x installs are migrated automatically on
plugins_loaded(idempotent, version-gated bynoindex_seo_config_version). Legacy options are kept and marked non-autoloaded so a rollback to 2.x restores the pre-3.0 state. - Uninstall retrocompatibility:
uninstall.phpdeletes both the new consolidated option and all legacy individual options (via wildcard SQL). Sites that upgrade from 2.x and later uninstall will be cleaned up completely regardless of whether migration ran.
Compatibility
- WordPress: 5.7 - 7.1
- PHP: 7.2 - 8.5
Tests
- Added PHPUnit test suite (previously the project shipped only a plugin-header smoke test). Coverage: contexts helper, settings accessors, v2→v3 migration, form save, bulk actions, meta box save, conflict-detection filter.
Downloads
- Self-healing v3 migration. If
-
v2.0.2 Stable
released this
2026-07-18 15:38:08 +00:00 | 3 commits to main since this release2.0.2 [2026-07-18]
Fixed
- Bulk action "Enable Robots Override" no longer creates duplicate
postmetarows. The previous implementation usedINSERT ... ON DUPLICATE KEY UPDATE, but WordPress'spostmetatable has no unique key on(post_id, meta_key), so theON DUPLICATE KEY UPDATEbranch never fired and every bulk run on a post that already had the meta inserted a duplicate row. The bulk handler now usesupdate_post_meta()anddelete_post_meta()exclusively. - Bulk action "Disable Robots Override" now removes the override meta entirely (previously set its value to
0, leaving a redundant row).
Changed
- Removed three dead contexts (
feed,comment_feed,robots) that were registered, migrated, and cleaned up but never evaluated at runtime and never exposed in the admin UI. The plugin now consistently registers and evaluates 22 page contexts (down from a nominal 25). Existing orphan options from earlier installs are cleaned by the uninstall routine's wildcard delete. - Extracted
noindex_seo_get_contexts()as the single source of truth for the context list shared by settings registration, v2 migration, form processing.uninstall.phpretains its own copy (technical constraint: the main plugin file is not loaded during uninstall) with a sync warning comment. - Corrected
phpcs.xmlminimum_supported_wp_versionfrom6.6to5.7to match the plugin header. This setting was stale from before the 2.0.1 minimum-WP correction. - Updated
readme.txtdescription counts from 25 to 22 page contexts. - Bulk action performance characteristic changed: the rewrite from a single batched SQL statement to per-post
update_post_meta()/delete_post_meta()calls trades O(1) queries for O(N) queries on bulk selections, in exchange for correctness (no more duplicate rows) and proper WP meta-cache invalidation. Typical admin bulk selections (≤200 posts) are unaffected; very large selections (thousands of posts) may take noticeably longer.
Deprecated
noindex_seo_clear_transient(): was hooked toupdate_option_noindexseo, a hook that never fires becausenoindexseois the Settings API group name, not an option name. The function now emits a deprecation notice via_deprecated_function()and continues to clear thenoindex_seo_optionstransient if called directly. The transient is cleared correctly insidenoindex_seo_process_form()after every successful save. The function will be removed in a future release.
Code Quality
bin/preflight.sh: hardened temp-file handling (mktemp moved to script top,trap … EXITcleanup, no more predictable/tmp/composer-audit.*paths that were vulnerable to symlink overwrite on shared hosting); fixed2>/nulltypo; added rsync /.distignore/ build-tree-non-empty guards so the forbidden-artefact scan cannot pass vacuously; replaced npm-audit subshell withpushd/popdso gate counters are not lost.- Added
bin/preflight.sh: automated pre-deploy verification covering PHPCS, PHPStan level 9, PHPCompatibility, PHPUnit, dependency audit, and candidate-ZIP artefact inspection. Prints a PASS/FAIL report per section and exits non-zero on any failure. - Added
.claude/settings.jsondeny rules fordeploy.sh,git push,git tag, andgit merge, enforcing the agent operating boundaries mandated by AGENTS.md mechanically rather than only in prose.
Compatibility
- WordPress: 5.7 - 7.1
- PHP: 7.2 - 8.5
Tests
- PHP Coding Standards: 3.13.5
- WordPress Coding Standards: 3.3.0
- PHPStan: 2.1.55
- PHPUnit: 9.6.34
Downloads
- Bulk action "Enable Robots Override" no longer creates duplicate
-
v2.0.1 Stable
released this
2026-06-02 16:51:12 +00:00 | 4 commits to main since this release2.0.1 [2026-05-25]
Added
- New option "Delete all plugin data on uninstall" (Settings → noindex SEO → General Configuration). By default, all data is preserved when the plugin is uninstalled. Enable this option to remove all settings and per-post directives on uninstall.
Changed
- Lowered minimum WordPress requirement from 6.6 to 5.7, matching the actual oldest API used (
wp_robotsfilter, introduced in WP 5.7). Verified withjohnbillion/wp-compat. - Custom post types registered by plugins or themes on the
inithook now correctly receive the Robots column, bulk actions, and list filter in granular control mode. Previously only built-in post types (post,page,attachment) were supported.
Code Quality
- Added
NOINDEX_SEO_VERSIONconstant; all enqueued assets now use it for cache-busting. - PHP type safety: replaced
(string)casts onmixedvalues fromget_option(),get_post_meta(), and$_POST/$_GET/$_REQUESTsuperglobals with properis_string()/is_scalar()narrowing guards. Passes PHPStan level 9 on PHP 8.5 with zero errors. - Extracted
noindex_seo_save_directives_from_post()helper; meta box save and Quick Edit save now share a single implementation. - Improved
noindex_seo_contextsfilter documentation: documents thestr_replace-based directive key derivation and thenoindex_seo_{context}key format requirement. - Removed dead code:
isset($field['conditional'])block (key never existed in field shape), redundantisset($field['suggestion'])guard, redundantisset($section_icons[$section_id])guard, and a provably non-empty$meta_querycheck. - Removed dead hook registration for
update_option_noindexseo(Settings API group name, not an option name; hook never fired).
Compatibility
- WordPress: 5.7 - 7.1
- PHP: 7.2 - 8.5
Tests
- PHP Coding Standards: 3.13.5
- WordPress Coding Standards: 3.3.0
- PHPStan: 2.1.55
- PHPUnit: 9.6.34
Downloads
-
v2.0.0 Stable
released this
2026-06-02 16:50:02 +00:00 | 5 commits to main since this release2.0.0 [2026-01-20]
New Features
- 5 independent robots directives: noindex, nofollow, noarchive, nosnippet, noimageindex
- Each directive can be enabled independently for any page context (125 total options)
- HTTP Headers support: Choose between HTML meta tags, HTTP headers, or both
- Granular per-post/page control (optional):
- Override global settings for individual posts/pages
- Meta boxes for Classic Editor
- Native Gutenberg sidebar panel for Block Editor
- Quick Edit support for fast inline editing
- Bulk actions to enable/disable overrides
- Custom "Robots" column in post lists
- Filter posts by override status
- Modern checkbox-based interface with emoji icons and tooltips
Security & Code Quality
- Modernized code with PHP 7.2+ strict types and type declarations
Compatibility & Migration
- WordPress: 6.6 - 6.9
- PHP: 7.2 - 8.5
- Automatic migration from v1.x (your existing settings are preserved)
- No manual configuration needed - just update and go
- Fully backward compatible
Downloads
-
v1.2.0 Stable
released this
2026-06-02 16:48:54 +00:00 | 6 commits to main since this release1.2.0 [2025-04-08]
Changes
- Improved functions documentation.
Fixes
- The way the options are saved.
Compatibility
- WordPress: 4.1 - 6.8
- PHP: 5.6 - 8.4
Tests
- PHP Coding Standards: 3.12.1
- WordPress Coding Standards: 3.1.0
- Plugin Check (PCP): 1.4.0
Downloads
-
v1.1.0 Stable
released this
2026-06-02 16:44:02 +00:00 | 7 commits to main since this release1.1.0 [2024-11-02]
Added
- Detects other WordPress SEO plugins, and creates a notice about it, to avoid conflicts.
- Has filters, so other plugins can hack.
Changed
- Uses native wp_robots functions (since WP 5.7+)
- Big refactory.
- Less size, improved code quality.
Compatibility
- WordPress: 4.1 - 6.7
- PHP: 5.6 - 8.4
Tests
- PHP Coding Standards: 3.10.3
- WordPress Coding Standards: 3.1.0
- Plugin Check (PCP): 1.1.0
Downloads
-
v1.0.12 Stable
released this
2026-06-02 16:42:59 +00:00 | 8 commits to main since this release1.0.12
- Compatibility: WordPress 4.1 - WordPress 6.4.
- Compatibility: PHP 5.6 - PHP 8.3.
- Compatibility: WordPress Coding Standards 3.0.1.
Downloads
-
v1.0.11 Stable
released this
2026-06-02 16:41:49 +00:00 | 9 commits to main since this release1.0.11
- Fix showing all the text.
Downloads