Changeset 62094
- Timestamp:
- 03/23/2026 07:39:45 PM (5 days ago)
- Location:
- trunk
- Files:
-
- 5 edited
-
src/wp-includes/abilities-api.php (modified) (5 diffs)
-
src/wp-includes/abilities-api/class-wp-abilities-registry.php (modified) (2 diffs)
-
src/wp-includes/abilities-api/class-wp-ability.php (modified) (2 diffs)
-
tests/phpunit/tests/abilities-api/wpAbilitiesRegistry.php (modified) (1 diff)
-
tests/phpunit/tests/rest-api/wpRestAbilitiesV1RunController.php (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/wp-includes/abilities-api.php
r61602 r62094 133 133 * Ability names must follow these rules: 134 134 * 135 * - Contain 2 to 4 segments separated by forward slashes 136 * (e.g., `my-plugin/my-ability`, `my-plugin/resource/find`, `my-plugin/resource/sub/find`). 135 * - Include a namespace prefix (e.g., `my-plugin/my-ability`). 137 136 * - Use only lowercase alphanumeric characters, dashes, and forward slashes. 138 137 * - Use descriptive, action-oriented names (e.g., `process-payment`, `generate-report`). … … 227 226 * @see wp_unregister_ability() 228 227 * 229 * @param string $name The name of the ability. Must be the fully-namespaced 230 * string identifier, e.g. `my-plugin/my-ability` or `my-plugin/resource/my-ability`. 228 * @param string $name The name of the ability. Must be a namespaced string containing 229 * a prefix, e.g., `my-plugin/my-ability`. Can only contain lowercase 230 * alphanumeric characters, dashes, and forward slashes. 231 231 * @param array<string, mixed> $args { 232 232 * An associative array of arguments for configuring the ability. … … 319 319 * 320 320 * @param string $name The name of the ability to unregister, including namespace prefix 321 * (e.g., 'my-plugin/my-ability' or 'my-plugin/resource/find').321 * (e.g., 'my-plugin/my-ability'). 322 322 * @return WP_Ability|null The unregistered ability instance on success, `null` on failure. 323 323 */ … … 352 352 * 353 353 * @param string $name The name of the ability to check, including namespace prefix 354 * (e.g., 'my-plugin/my-ability' or 'my-plugin/resource/find').354 * (e.g., 'my-plugin/my-ability'). 355 355 * @return bool `true` if the ability is registered, `false` otherwise. 356 356 */ … … 384 384 * 385 385 * @param string $name The name of the ability, including namespace prefix 386 * (e.g., 'my-plugin/my-ability' or 'my-plugin/resource/find').386 * (e.g., 'my-plugin/my-ability'). 387 387 * @return WP_Ability|null The registered ability instance, or `null` if not registered. 388 388 */ -
trunk/src/wp-includes/abilities-api/class-wp-abilities-registry.php
r61602 r62094 44 44 * @see wp_register_ability() 45 45 * 46 * @param string $name The name of the ability. Must be the fully-namespaced 47 * string identifier, e.g. `my-plugin/my-ability` or `my-plugin/resource/my-ability`. 46 * @param string $name The name of the ability. The name must be a string containing a namespace 47 * prefix, i.e. `my-plugin/my-ability`. It can only contain lowercase 48 * alphanumeric characters, dashes and the forward slash. 48 49 * @param array<string, mixed> $args { 49 50 * An associative array of arguments for the ability. … … 78 79 */ 79 80 public function register( string $name, array $args ): ?WP_Ability { 80 if ( ! preg_match( '/^[a-z0-9-]+ (?:\/[a-z0-9-]+){1,3}$/', $name ) ) {81 if ( ! preg_match( '/^[a-z0-9-]+\/[a-z0-9-]+$/', $name ) ) { 81 82 _doing_it_wrong( 82 83 __METHOD__, 83 84 __( 84 'Ability name must contain 2 to 4 segments separated by forward slashes, e.g. "my-plugin/my-ability" or "my-plugin/resource/my-ability". It can only contain lowercase alphanumeric characters, dashes, and forward slashes.'85 'Ability name must be a string containing a namespace prefix, i.e. "my-plugin/my-ability". It can only contain lowercase alphanumeric characters, dashes and the forward slash.' 85 86 ), 86 87 '6.9.0' -
trunk/src/wp-includes/abilities-api/class-wp-ability.php
r61602 r62094 53 53 /** 54 54 * The name of the ability, with its namespace. 55 * Example s: `my-plugin/my-ability`, `my-plugin/resource/find`.55 * Example: `my-plugin/my-ability`. 56 56 * 57 57 * @since 6.9.0 … … 341 341 /** 342 342 * Retrieves the name of the ability, with its namespace. 343 * Example s: `my-plugin/my-ability`, `my-plugin/resource/find`.343 * Example: `my-plugin/my-ability`. 344 344 * 345 345 * @since 6.9.0 -
trunk/tests/phpunit/tests/abilities-api/wpAbilitiesRegistry.php
r61602 r62094 138 138 139 139 /** 140 * Should accept ability name with 3 segments (2 slashes).141 *142 * @ticket 64098143 *144 * @covers WP_Abilities_Registry::register145 */146 public function test_register_valid_name_with_three_segments() {147 $result = $this->registry->register( 'test/sub/add-numbers', self::$test_ability_args );148 $this->assertInstanceOf( WP_Ability::class, $result );149 $this->assertSame( 'test/sub/add-numbers', $result->get_name() );150 }151 152 /**153 * Should accept ability name with 4 segments (3 slashes).154 *155 * @ticket 64098156 *157 * @covers WP_Abilities_Registry::register158 */159 public function test_register_valid_name_with_four_segments() {160 $result = $this->registry->register( 'test/sub/deep/add-numbers', self::$test_ability_args );161 $this->assertInstanceOf( WP_Ability::class, $result );162 $this->assertSame( 'test/sub/deep/add-numbers', $result->get_name() );163 }164 165 /**166 * Should reject ability name with 5 segments (exceeds maximum of 4).167 *168 * @ticket 64098169 *170 * @covers WP_Abilities_Registry::register171 *172 * @expectedIncorrectUsage WP_Abilities_Registry::register173 */174 public function test_register_invalid_name_with_five_segments() {175 $result = $this->registry->register( 'test/a/b/c/too-deep', self::$test_ability_args );176 $this->assertNull( $result );177 }178 179 /**180 * Should reject ability name with empty segments (double slashes).181 *182 * @ticket 64098183 *184 * @covers WP_Abilities_Registry::register185 *186 * @expectedIncorrectUsage WP_Abilities_Registry::register187 */188 public function test_register_invalid_name_with_empty_segment() {189 $result = $this->registry->register( 'test//add-numbers', self::$test_ability_args );190 $this->assertNull( $result );191 }192 193 /**194 * Should reject ability name with trailing slash.195 *196 * @ticket 64098197 *198 * @covers WP_Abilities_Registry::register199 *200 * @expectedIncorrectUsage WP_Abilities_Registry::register201 */202 public function test_register_invalid_name_with_trailing_slash() {203 $result = $this->registry->register( 'test/add-numbers/', self::$test_ability_args );204 $this->assertNull( $result );205 }206 207 /**208 140 * Should reject ability registration without a label. 209 141 * -
trunk/tests/phpunit/tests/rest-api/wpRestAbilitiesV1RunController.php
r61999 r62094 380 380 ); 381 381 382 // Ability with nested namespace (3 segments).383 $this->register_test_ability(384 'test/math/add',385 array(386 'label' => 'Nested Add',387 'description' => 'Adds numbers with nested namespace',388 'category' => 'math',389 'input_schema' => array(390 'type' => 'object',391 'properties' => array(392 'a' => array(393 'type' => 'number',394 'description' => 'First number',395 ),396 'b' => array(397 'type' => 'number',398 'description' => 'Second number',399 ),400 ),401 'required' => array( 'a', 'b' ),402 'additionalProperties' => false,403 ),404 'output_schema' => array(405 'type' => 'number',406 ),407 'execute_callback' => static function ( array $input ) {408 return $input['a'] + $input['b'];409 },410 'permission_callback' => static function () {411 return current_user_can( 'edit_posts' );412 },413 'meta' => array(414 'show_in_rest' => true,415 ),416 )417 );418 419 382 // Read-only ability for query params testing. 420 383 $this->register_test_ability( … … 468 431 $this->assertEquals( 200, $response->get_status() ); 469 432 $this->assertEquals( 8, $response->get_data() ); 470 }471 472 /**473 * Test executing an ability with a nested namespace (3 segments) via REST.474 *475 * @ticket 64098476 */477 public function test_execute_nested_namespace_ability(): void {478 $request = new WP_REST_Request( 'POST', '/wp-abilities/v1/abilities/test/math/add/run' );479 $request->set_header( 'Content-Type', 'application/json' );480 $request->set_body(481 wp_json_encode(482 array(483 'input' => array(484 'a' => 10,485 'b' => 7,486 ),487 )488 )489 );490 491 $response = $this->server->dispatch( $request );492 493 $this->assertEquals( 200, $response->get_status() );494 $this->assertEquals( 17, $response->get_data() );495 433 } 496 434
Note: See TracChangeset
for help on using the changeset viewer.