Skip to content

Duplicate ability registrations during WP-CLI execution #2

@chubes4

Description

@chubes4

Problem

When running WP-CLI commands (e.g., wp datamachine-events health-check), multiple PHP notices are generated about duplicate ability registrations:

Notice: Function WP_Ability_Categories_Registry::register was called incorrectly. 
Ability category "datamachine" is already registered.

Notice: Function WP_Abilities_Registry::register was called incorrectly. 
Ability "datamachine/get-handlers" is already registered.

Notice: Function WP_Abilities_Registry::register was called incorrectly. 
Ability "datamachine/get-handler" is already registered.

Notice: Function WP_Abilities_Registry::register was called incorrectly. 
Ability "datamachine/validate-handler" is already registered.

Notice: Function WP_Abilities_Registry::register was called incorrectly. 
Ability "datamachine/get-handler-config-fields" is already registered.

Notice: Function WP_Abilities_Registry::register was called incorrectly. 
Ability "datamachine/apply-handler-defaults" is already registered.

Notice: Function WP_Abilities_Registry::register was called incorrectly. 
Ability "datamachine/get-handler-site-defaults" is already registered.

Additionally, some abilities are missing the required category string:

Notice: Function WP_Abilities_Registry::register was called incorrectly. 
The ability properties must contain a `category` string.

Root Cause

Abilities are being registered multiple times during a single WP-CLI request. This could be caused by:

  1. Registration code running on multiple hooks without deduplication
  2. Multiple plugins registering the same abilities
  3. Registration code being included/required multiple times

Expected Behavior

Each ability category and ability should only be registered once per request, with guards to prevent duplicate registration.

Suggested Fix

Add existence checks before registering:

// For categories
if ( ! WP_Ability_Categories_Registry::is_registered( 'datamachine' ) ) {
    wp_register_ability_category( 'datamachine', $args );
}

// For abilities
if ( ! WP_Abilities_Registry::is_registered( 'datamachine/get-handlers' ) ) {
    wp_register_ability( 'datamachine/get-handlers', $args );
}

Also ensure all ability registrations include the required category property.

Reproduction

homeboy wp extra-chill:events datamachine-events health-check --scope=upcoming

Environment

  • WordPress 6.9
  • datamachine-events plugin
  • WP-CLI execution context

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions