• 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