• 3.0.3 1aa9f3ba2d

    v3.0.3 Stable

    javier released this 2026-07-18 17:40:02 +00:00 | 0 commits to main since this release

    3.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
  • 3.0.2 57b74446bd

    v3.0.2 Stable

    javier released this 2026-07-18 17:38:56 +00:00 | 1 commits to main since this release

    3.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 (PluginDocumentSettingPanel via assets/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 via get_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's product_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 global category / tag / post_type_archive settings when the term has the override enabled. Backed by register_term_meta() with show_in_rest=true so headless consumers can read them.

    Compatibility

    • WordPress: 5.7 - 7.1
    • PHP: 7.2 - 8.5

    Tests

    • Added tests/test-term-meta.php covering registration, save handler, front-end override precedence, and uninstall cleanup.
    Downloads
  • 3.0.1 ef4259b3c2

    v3.0.1 Stable

    javier released this 2026-07-18 16:19:22 +00:00 | 2 commits to main since this release

    3.0.1 [2026-07-18]

    Fixed

    • Self-healing v3 migration. If noindex_seo_config_version claims migration completed (version >= 3) but the consolidated noindex_seo_settings option 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. Reduces wp_options autoload 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 one noindex_seo_settings array. 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_settings clears the noindex_seo_options transient via the update_option_noindex_seo_settings hook. 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 by noindex_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.php deletes 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
  • 2.0.2 8d5551a8b5

    v2.0.2 Stable

    javier released this 2026-07-18 15:38:08 +00:00 | 3 commits to main since this release

    2.0.2 [2026-07-18]

    Fixed

    • Bulk action "Enable Robots Override" no longer creates duplicate postmeta rows. The previous implementation used INSERT ... ON DUPLICATE KEY UPDATE, but WordPress's postmeta table has no unique key on (post_id, meta_key), so the ON DUPLICATE KEY UPDATE branch never fired and every bulk run on a post that already had the meta inserted a duplicate row. The bulk handler now uses update_post_meta() and delete_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.php retains its own copy (technical constraint: the main plugin file is not loaded during uninstall) with a sync warning comment.
    • Corrected phpcs.xml minimum_supported_wp_version from 6.6 to 5.7 to match the plugin header. This setting was stale from before the 2.0.1 minimum-WP correction.
    • Updated readme.txt description 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 to update_option_noindexseo, a hook that never fires because noindexseo is the Settings API group name, not an option name. The function now emits a deprecation notice via _deprecated_function() and continues to clear the noindex_seo_options transient if called directly. The transient is cleared correctly inside noindex_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 … EXIT cleanup, no more predictable /tmp/composer-audit.* paths that were vulnerable to symlink overwrite on shared hosting); fixed 2>/null typo; added rsync / .distignore / build-tree-non-empty guards so the forbidden-artefact scan cannot pass vacuously; replaced npm-audit subshell with pushd/popd so 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.json deny rules for deploy.sh, git push, git tag, and git 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
  • 2.0.1 127b065c2f

    v2.0.1 Stable

    javier released this 2026-06-02 16:51:12 +00:00 | 4 commits to main since this release

    2.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_robots filter, introduced in WP 5.7). Verified with johnbillion/wp-compat.
    • Custom post types registered by plugins or themes on the init hook 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_VERSION constant; all enqueued assets now use it for cache-busting.
    • PHP type safety: replaced (string) casts on mixed values from get_option(), get_post_meta(), and $_POST/$_GET/$_REQUEST superglobals with proper is_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_contexts filter documentation: documents the str_replace-based directive key derivation and the noindex_seo_{context} key format requirement.
    • Removed dead code: isset($field['conditional']) block (key never existed in field shape), redundant isset($field['suggestion']) guard, redundant isset($section_icons[$section_id]) guard, and a provably non-empty $meta_query check.
    • 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
  • 2.0.0 d5f90ee55e

    v2.0.0 Stable

    javier released this 2026-06-02 16:50:02 +00:00 | 5 commits to main since this release

    2.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
  • 1.2.0 a5d8d53047

    v1.2.0 Stable

    javier released this 2026-06-02 16:48:54 +00:00 | 6 commits to main since this release

    1.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
  • 1.1.0 e407125dc7

    v1.1.0 Stable

    javier released this 2026-06-02 16:44:02 +00:00 | 7 commits to main since this release

    1.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
  • 1.0.12 57b59511c7

    v1.0.12 Stable

    javier released this 2026-06-02 16:42:59 +00:00 | 8 commits to main since this release

    1.0.12

    • Compatibility: WordPress 4.1 - WordPress 6.4.
    • Compatibility: PHP 5.6 - PHP 8.3.
    • Compatibility: WordPress Coding Standards 3.0.1.
    Downloads
  • 1.0.11 e1d3060924

    v1.0.11 Stable

    javier released this 2026-06-02 16:41:49 +00:00 | 9 commits to main since this release

    1.0.11

    • Fix showing all the text.
    Downloads