From b2aae21daf453bf14d4e059d269a622a0ddf039f Mon Sep 17 00:00:00 2001 From: Jorge Costa Date: Thu, 23 Oct 2025 16:47:27 +0100 Subject: [PATCH 1/9] Update: Simplify core abilities registration. --- .../abilities/class-wp-core-abilities.php | 317 ------------------ includes/abilities/wp-core-abilities.php | 275 +++++++++++++++ includes/bootstrap.php | 8 +- tests/unit/abilities-api/wpCoreAbilities.php | 4 +- 4 files changed, 281 insertions(+), 323 deletions(-) delete mode 100644 includes/abilities/class-wp-core-abilities.php create mode 100644 includes/abilities/wp-core-abilities.php diff --git a/includes/abilities/class-wp-core-abilities.php b/includes/abilities/class-wp-core-abilities.php deleted file mode 100644 index 66635ac..0000000 --- a/includes/abilities/class-wp-core-abilities.php +++ /dev/null @@ -1,317 +0,0 @@ - __( 'Site' ), - 'description' => __( 'Abilities that retrieve or modify site information and settings.' ), - ) - ); - - // User-related capabilities - wp_register_ability_category( - self::CATEGORY_USER, - array( - 'label' => __( 'User' ), - 'description' => __( 'Abilities that retrieve or modify user information and settings.' ), - ) - ); - } - - /** - * Registers the default core abilities. - * - * @since 0.3.0 - * - * @return void - */ - public static function register(): void { - self::register_get_site_info(); - self::register_get_user_info(); - self::register_get_environment_info(); - } - - /** - * Registers the `core/get-site-info` ability. - * - * @since 0.3.0 - * - * @return void - */ - protected static function register_get_site_info(): void { - $fields = array( - 'name', - 'description', - 'url', - 'wpurl', - 'admin_email', - 'charset', - 'language', - 'version', - ); - - wp_register_ability( - 'core/get-site-info', - array( - 'label' => __( 'Get Site Information' ), - 'description' => __( 'Returns site information configured in WordPress. By default returns all fields, or optionally a filtered subset.' ), - 'category' => self::CATEGORY_SITE, - 'input_schema' => array( - 'type' => 'object', - 'properties' => array( - 'fields' => array( - 'type' => 'array', - 'items' => array( - 'type' => 'string', - 'enum' => $fields, - ), - 'description' => __( 'Optional: Limit response to specific fields. If omitted, all fields are returned.' ), - ), - ), - 'additionalProperties' => false, - 'default' => array(), - ), - 'output_schema' => array( - 'type' => 'object', - 'properties' => array( - 'name' => array( - 'type' => 'string', - 'description' => __( 'The site title.' ), - ), - 'description' => array( - 'type' => 'string', - 'description' => __( 'The site tagline.' ), - ), - 'url' => array( - 'type' => 'string', - 'description' => __( 'The site home URL.' ), - ), - 'wpurl' => array( - 'type' => 'string', - 'description' => __( 'The WordPress installation URL.' ), - ), - 'admin_email' => array( - 'type' => 'string', - 'description' => __( 'The site administrator email address.' ), - ), - 'charset' => array( - 'type' => 'string', - 'description' => __( 'The site character encoding.' ), - ), - 'language' => array( - 'type' => 'string', - 'description' => __( 'The site language locale code.' ), - ), - 'version' => array( - 'type' => 'string', - 'description' => __( 'The WordPress version.' ), - ), - ), - 'additionalProperties' => false, - ), - 'execute_callback' => static function ( $input = array() ): array { - $input = is_array( $input ) ? $input : array(); - $all_fields = array( 'name', 'description', 'url', 'wpurl', 'admin_email', 'charset', 'language', 'version' ); - $requested_fields = ! empty( $input['fields'] ) ? $input['fields'] : $all_fields; - - $result = array(); - foreach ( $requested_fields as $field ) { - $result[ $field ] = get_bloginfo( $field ); - } - - return $result; - }, - 'permission_callback' => static function (): bool { - return current_user_can( 'manage_options' ); - }, - 'meta' => array( - 'annotations' => array( - 'readonly' => true, - 'destructive' => false, - 'idempotent' => true, - ), - 'show_in_rest' => true, - ), - ) - ); - } - - /** - * Registers the `core/get-user-info` ability. - * - * @since 0.3.0 - * - * @return void - */ - protected static function register_get_user_info(): void { - wp_register_ability( - 'core/get-user-info', - array( - 'label' => __( 'Get User Information' ), - 'description' => __( 'Returns basic profile details for the current authenticated user to support personalization, auditing, and access-aware behavior.' ), - 'category' => self::CATEGORY_USER, - 'output_schema' => array( - 'type' => 'object', - 'required' => array( 'id', 'display_name', 'user_nicename', 'user_login', 'roles', 'locale' ), - 'properties' => array( - 'id' => array( - 'type' => 'integer', - 'description' => __( 'The user ID.' ), - ), - 'display_name' => array( - 'type' => 'string', - 'description' => __( 'The display name of the user.' ), - ), - 'user_nicename' => array( - 'type' => 'string', - 'description' => __( 'The URL-friendly name for the user.' ), - ), - 'user_login' => array( - 'type' => 'string', - 'description' => __( 'The login username for the user.' ), - ), - 'roles' => array( - 'type' => 'array', - 'description' => __( 'The roles assigned to the user.' ), - 'items' => array( - 'type' => 'string', - ), - ), - 'locale' => array( - 'type' => 'string', - 'description' => __( 'The locale string for the user, such as en_US.' ), - ), - ), - 'additionalProperties' => false, - ), - 'execute_callback' => static function (): array { - $current_user = wp_get_current_user(); - - return array( - 'id' => $current_user->ID, - 'display_name' => $current_user->display_name, - 'user_nicename' => $current_user->user_nicename, - 'user_login' => $current_user->user_login, - 'roles' => $current_user->roles, - 'locale' => get_user_locale( $current_user ), - ); - }, - 'permission_callback' => static function (): bool { - return is_user_logged_in(); - }, - 'meta' => array( - 'annotations' => array( - 'readonly' => true, - 'destructive' => false, - 'idempotent' => true, - ), - 'show_in_rest' => false, - ), - ) - ); - } - - /** - * Registers the `core/get-environment-info` ability. - * - * @since 0.3.0 - * - * @return void - */ - protected static function register_get_environment_info(): void { - wp_register_ability( - 'core/get-environment-info', - array( - 'label' => __( 'Get Environment Info' ), - 'description' => __( 'Returns core details about the site\'s runtime context for diagnostics and compatibility (environment, PHP runtime, database server info, WordPress version).' ), - 'category' => self::CATEGORY_SITE, - 'output_schema' => array( - 'type' => 'object', - 'required' => array( 'environment', 'php_version', 'db_server_info', 'wp_version' ), - 'properties' => array( - 'environment' => array( - 'type' => 'string', - 'description' => __( 'The site\'s runtime environment classification (e.g., production, staging, development).' ), - 'examples' => array( 'production', 'staging', 'development', 'local' ), - ), - 'php_version' => array( - 'type' => 'string', - 'description' => __( 'The PHP runtime version executing WordPress.' ), - ), - 'db_server_info' => array( - 'type' => 'string', - 'description' => __( 'The database server vendor and version string reported by the driver.' ), - 'examples' => array( '8.0.34', '10.11.6-MariaDB' ), - ), - 'wp_version' => array( - 'type' => 'string', - 'description' => __( 'The WordPress core version running on this site.' ), - ), - ), - 'additionalProperties' => false, - ), - 'execute_callback' => static function (): array { - global $wpdb; - - $env = wp_get_environment_type(); - $php_version = phpversion(); - $db_server_info = ''; - if ( isset( $wpdb ) && is_object( $wpdb ) && method_exists( $wpdb, 'db_server_info' ) ) { - $db_server_info = $wpdb->db_server_info() ?? ''; - } - $wp_version = get_bloginfo( 'version' ); - - return array( - 'environment' => $env, - 'php_version' => $php_version, - 'db_server_info' => $db_server_info, - 'wp_version' => $wp_version, - ); - }, - 'permission_callback' => static function (): bool { - return current_user_can( 'manage_options' ); - }, - 'meta' => array( - 'annotations' => array( - 'readonly' => true, - 'destructive' => false, - 'idempotent' => true, - ), - 'show_in_rest' => true, - ), - ) - ); - } -} diff --git a/includes/abilities/wp-core-abilities.php b/includes/abilities/wp-core-abilities.php new file mode 100644 index 0000000..7f7ec28 --- /dev/null +++ b/includes/abilities/wp-core-abilities.php @@ -0,0 +1,275 @@ + __( 'Site' ), + 'description' => __( 'Abilities that retrieve or modify site information and settings.' ), + ) + ); + + + wp_register_ability_category( + 'user', + array( + 'label' => __( 'User' ), + 'description' => __( 'Abilities that retrieve or modify user information and settings.' ), + ) + ); +} + +/** + * Registers the default core abilities. + * + * @since 0.3.0 + * + * @return void + */ +function register_core_abilities(): void { + $category_site = 'site'; + $category_user = 'user'; + + + $site_info_fields = array( + 'name', + 'description', + 'url', + 'wpurl', + 'admin_email', + 'charset', + 'language', + 'version', + ); + + wp_register_ability( + 'core/get-site-info', + array( + 'label' => __( 'Get Site Information' ), + 'description' => __( 'Returns site information configured in WordPress. By default returns all fields, or optionally a filtered subset.' ), + 'category' => $category_site, + 'input_schema' => array( + 'type' => 'object', + 'properties' => array( + 'fields' => array( + 'type' => 'array', + 'items' => array( + 'type' => 'string', + 'enum' => $site_info_fields, + ), + 'description' => __( 'Optional: Limit response to specific fields. If omitted, all fields are returned.' ), + ), + ), + 'additionalProperties' => false, + 'default' => array(), + ), + 'output_schema' => array( + 'type' => 'object', + 'properties' => array( + 'name' => array( + 'type' => 'string', + 'description' => __( 'The site title.' ), + ), + 'description' => array( + 'type' => 'string', + 'description' => __( 'The site tagline.' ), + ), + 'url' => array( + 'type' => 'string', + 'description' => __( 'The site home URL.' ), + ), + 'wpurl' => array( + 'type' => 'string', + 'description' => __( 'The WordPress installation URL.' ), + ), + 'admin_email' => array( + 'type' => 'string', + 'description' => __( 'The site administrator email address.' ), + ), + 'charset' => array( + 'type' => 'string', + 'description' => __( 'The site character encoding.' ), + ), + 'language' => array( + 'type' => 'string', + 'description' => __( 'The site language locale code.' ), + ), + 'version' => array( + 'type' => 'string', + 'description' => __( 'The WordPress version.' ), + ), + ), + 'additionalProperties' => false, + ), + 'execute_callback' => static function ( $input = array() ): array { + $input = is_array( $input ) ? $input : array(); + $all_fields = array( 'name', 'description', 'url', 'wpurl', 'admin_email', 'charset', 'language', 'version' ); + $requested_fields = ! empty( $input['fields'] ) ? $input['fields'] : $all_fields; + + $result = array(); + foreach ( $requested_fields as $field ) { + $result[ $field ] = get_bloginfo( $field ); + } + + return $result; + }, + 'permission_callback' => static function (): bool { + return current_user_can( 'manage_options' ); + }, + 'meta' => array( + 'annotations' => array( + 'readonly' => true, + 'destructive' => false, + 'idempotent' => true, + ), + 'show_in_rest' => true, + ), + ) + ); + + + wp_register_ability( + 'core/get-user-info', + array( + 'label' => __( 'Get User Information' ), + 'description' => __( 'Returns basic profile details for the current authenticated user to support personalization, auditing, and access-aware behavior.' ), + 'category' => $category_user, + 'output_schema' => array( + 'type' => 'object', + 'required' => array( 'id', 'display_name', 'user_nicename', 'user_login', 'roles', 'locale' ), + 'properties' => array( + 'id' => array( + 'type' => 'integer', + 'description' => __( 'The user ID.' ), + ), + 'display_name' => array( + 'type' => 'string', + 'description' => __( 'The display name of the user.' ), + ), + 'user_nicename' => array( + 'type' => 'string', + 'description' => __( 'The URL-friendly name for the user.' ), + ), + 'user_login' => array( + 'type' => 'string', + 'description' => __( 'The login username for the user.' ), + ), + 'roles' => array( + 'type' => 'array', + 'description' => __( 'The roles assigned to the user.' ), + 'items' => array( + 'type' => 'string', + ), + ), + 'locale' => array( + 'type' => 'string', + 'description' => __( 'The locale string for the user, such as en_US.' ), + ), + ), + 'additionalProperties' => false, + ), + 'execute_callback' => static function (): array { + $current_user = wp_get_current_user(); + + return array( + 'id' => $current_user->ID, + 'display_name' => $current_user->display_name, + 'user_nicename' => $current_user->user_nicename, + 'user_login' => $current_user->user_login, + 'roles' => $current_user->roles, + 'locale' => get_user_locale( $current_user ), + ); + }, + 'permission_callback' => static function (): bool { + return is_user_logged_in(); + }, + 'meta' => array( + 'annotations' => array( + 'readonly' => true, + 'destructive' => false, + 'idempotent' => true, + ), + 'show_in_rest' => false, + ), + ) + ); + + wp_register_ability( + 'core/get-environment-info', + array( + 'label' => __( 'Get Environment Info' ), + 'description' => __( 'Returns core details about the site\'s runtime context for diagnostics and compatibility (environment, PHP runtime, database server info, WordPress version).' ), + 'category' => $category_site, + 'output_schema' => array( + 'type' => 'object', + 'required' => array( 'environment', 'php_version', 'db_server_info', 'wp_version' ), + 'properties' => array( + 'environment' => array( + 'type' => 'string', + 'description' => __( 'The site\'s runtime environment classification (can be one of these: production, staging, development, local).' ), + 'enum' => array( 'production', 'staging', 'development', 'local' ), + ), + 'php_version' => array( + 'type' => 'string', + 'description' => __( 'The PHP runtime version executing WordPress.' ), + ), + 'db_server_info' => array( + 'type' => 'string', + 'description' => __( 'The database server vendor and version string reported by the driver.' ), + 'examples' => array( '8.0.34', '10.11.6-MariaDB' ), + ), + 'wp_version' => array( + 'type' => 'string', + 'description' => __( 'The WordPress core version running on this site.' ), + ), + ), + 'additionalProperties' => false, + ), + 'execute_callback' => static function (): array { + global $wpdb; + + $env = wp_get_environment_type(); + $php_version = phpversion(); + $db_server_info = ''; + if ( isset( $wpdb ) && is_object( $wpdb ) && method_exists( $wpdb, 'db_server_info' ) ) { + $db_server_info = $wpdb->db_server_info() ?? ''; + } + $wp_version = get_bloginfo( 'version' ); + + return array( + 'environment' => $env, + 'php_version' => $php_version, + 'db_server_info' => $db_server_info, + 'wp_version' => $wp_version, + ); + }, + 'permission_callback' => static function (): bool { + return current_user_can( 'manage_options' ); + }, + 'meta' => array( + 'annotations' => array( + 'readonly' => true, + 'destructive' => false, + 'idempotent' => true, + ), + 'show_in_rest' => true, + ), + ) + ); +} diff --git a/includes/bootstrap.php b/includes/bootstrap.php index ab4f97f..f874d66 100644 --- a/includes/bootstrap.php +++ b/includes/bootstrap.php @@ -42,16 +42,16 @@ } // Load core abilities class. -if ( ! class_exists( 'WP_Core_Abilities' ) ) { - require_once __DIR__ . '/abilities/class-wp-core-abilities.php'; +if ( ! function_exists( 'register_core_abilities' ) ) { + require_once __DIR__ . '/abilities/wp-core-abilities.php'; } // Register core abilities category and abilities when requested via filter or when not in test environment. // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound -- Plugin-specific hook for feature plugin context. if ( ! ( defined( 'WP_RUN_CORE_TESTS' ) || defined( 'WP_TESTS_CONFIG_FILE_PATH' ) || ( function_exists( 'getenv' ) && false !== getenv( 'WP_PHPUNIT__DIR' ) ) ) || apply_filters( 'abilities_api_register_core_abilities', false ) ) { if ( function_exists( 'add_action' ) ) { - add_action( 'wp_abilities_api_categories_init', array( 'WP_Core_Abilities', 'register_category' ) ); - add_action( 'wp_abilities_api_init', array( 'WP_Core_Abilities', 'register' ) ); + add_action( 'wp_abilities_api_categories_init', 'register_core_ability_categories' ); + add_action( 'wp_abilities_api_init', 'register_core_abilities' ); } } diff --git a/tests/unit/abilities-api/wpCoreAbilities.php b/tests/unit/abilities-api/wpCoreAbilities.php index e4da23e..e43bb4e 100644 --- a/tests/unit/abilities-api/wpCoreAbilities.php +++ b/tests/unit/abilities-api/wpCoreAbilities.php @@ -36,7 +36,7 @@ public function set_up(): void { // Register core abilities category during the proper hook. $callback = static function (): void { - WP_Core_Abilities::register_category(); + register_core_ability_categories(); }; add_action( 'wp_abilities_api_categories_init', $callback ); do_action( 'wp_abilities_api_categories_init', WP_Ability_Categories_Registry::get_instance() ); @@ -48,7 +48,7 @@ public function set_up(): void { } // Register core abilities for testing. - WP_Core_Abilities::register(); + register_core_abilities(); } /** From 8bc5d6fda78d2283b791d873c56e0834865c5b3a Mon Sep 17 00:00:00 2001 From: Jorge Costa Date: Thu, 23 Oct 2025 16:57:56 +0100 Subject: [PATCH 2/9] lint fixes --- includes/abilities/wp-core-abilities.php | 6 +++--- includes/bootstrap.php | 8 ++++---- tests/unit/abilities-api/wpCoreAbilities.php | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/includes/abilities/wp-core-abilities.php b/includes/abilities/wp-core-abilities.php index 7f7ec28..7f1ee83 100644 --- a/includes/abilities/wp-core-abilities.php +++ b/includes/abilities/wp-core-abilities.php @@ -16,7 +16,7 @@ * * @return void */ -function register_core_ability_categories(): void { +function wp_register_core_ability_categories(): void { wp_register_ability_category( 'site', array( @@ -42,7 +42,7 @@ function register_core_ability_categories(): void { * * @return void */ -function register_core_abilities(): void { +function wp_register_core_abilities(): void { $category_site = 'site'; $category_user = 'user'; @@ -223,7 +223,7 @@ function register_core_abilities(): void { 'environment' => array( 'type' => 'string', 'description' => __( 'The site\'s runtime environment classification (can be one of these: production, staging, development, local).' ), - 'enum' => array( 'production', 'staging', 'development', 'local' ), + 'enum' => array( 'production', 'staging', 'development', 'local' ), ), 'php_version' => array( 'type' => 'string', diff --git a/includes/bootstrap.php b/includes/bootstrap.php index f874d66..e971ecd 100644 --- a/includes/bootstrap.php +++ b/includes/bootstrap.php @@ -41,8 +41,8 @@ require_once __DIR__ . '/abilities-api.php'; } -// Load core abilities class. -if ( ! function_exists( 'register_core_abilities' ) ) { +// Load core abilities registration functions. +if ( ! function_exists( 'wp_register_core_abilities' ) ) { require_once __DIR__ . '/abilities/wp-core-abilities.php'; } @@ -50,8 +50,8 @@ // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound -- Plugin-specific hook for feature plugin context. if ( ! ( defined( 'WP_RUN_CORE_TESTS' ) || defined( 'WP_TESTS_CONFIG_FILE_PATH' ) || ( function_exists( 'getenv' ) && false !== getenv( 'WP_PHPUNIT__DIR' ) ) ) || apply_filters( 'abilities_api_register_core_abilities', false ) ) { if ( function_exists( 'add_action' ) ) { - add_action( 'wp_abilities_api_categories_init', 'register_core_ability_categories' ); - add_action( 'wp_abilities_api_init', 'register_core_abilities' ); + add_action( 'wp_abilities_api_categories_init', 'wp_register_core_ability_categories' ); + add_action( 'wp_abilities_api_init', 'wp_register_core_abilities' ); } } diff --git a/tests/unit/abilities-api/wpCoreAbilities.php b/tests/unit/abilities-api/wpCoreAbilities.php index e43bb4e..d69dc24 100644 --- a/tests/unit/abilities-api/wpCoreAbilities.php +++ b/tests/unit/abilities-api/wpCoreAbilities.php @@ -36,7 +36,7 @@ public function set_up(): void { // Register core abilities category during the proper hook. $callback = static function (): void { - register_core_ability_categories(); + wp_register_core_ability_categories(); }; add_action( 'wp_abilities_api_categories_init', $callback ); do_action( 'wp_abilities_api_categories_init', WP_Ability_Categories_Registry::get_instance() ); @@ -48,7 +48,7 @@ public function set_up(): void { } // Register core abilities for testing. - register_core_abilities(); + wp_register_core_abilities(); } /** From d98d1e7d28773ff9e7eeb69013c264eb5633b3f1 Mon Sep 17 00:00:00 2001 From: Jorge Costa Date: Thu, 23 Oct 2025 17:10:30 +0100 Subject: [PATCH 3/9] lint fixes take 2 --- includes/abilities/wp-core-abilities.php | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/includes/abilities/wp-core-abilities.php b/includes/abilities/wp-core-abilities.php index 7f1ee83..25a9aff 100644 --- a/includes/abilities/wp-core-abilities.php +++ b/includes/abilities/wp-core-abilities.php @@ -16,7 +16,8 @@ * * @return void */ -function wp_register_core_ability_categories(): void { +// phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedFunctionFound +function register_core_ability_categories(): void { wp_register_ability_category( 'site', array( @@ -25,7 +26,6 @@ function wp_register_core_ability_categories(): void { ) ); - wp_register_ability_category( 'user', array( @@ -42,11 +42,11 @@ function wp_register_core_ability_categories(): void { * * @return void */ -function wp_register_core_abilities(): void { +// phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedFunctionFound +function register_core_abilities(): void { $category_site = 'site'; $category_user = 'user'; - $site_info_fields = array( 'name', 'description', @@ -143,7 +143,6 @@ function wp_register_core_abilities(): void { ) ); - wp_register_ability( 'core/get-user-info', array( From e591081d74e532223c71525571fb3b67586d774c Mon Sep 17 00:00:00 2001 From: Jorge Costa Date: Thu, 23 Oct 2025 17:15:45 +0100 Subject: [PATCH 4/9] function names fix --- includes/bootstrap.php | 2 +- tests/unit/abilities-api/wpCoreAbilities.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/includes/bootstrap.php b/includes/bootstrap.php index e971ecd..92fa426 100644 --- a/includes/bootstrap.php +++ b/includes/bootstrap.php @@ -42,7 +42,7 @@ } // Load core abilities registration functions. -if ( ! function_exists( 'wp_register_core_abilities' ) ) { +if ( ! function_exists( 'register_core_abilities' ) ) { require_once __DIR__ . '/abilities/wp-core-abilities.php'; } diff --git a/tests/unit/abilities-api/wpCoreAbilities.php b/tests/unit/abilities-api/wpCoreAbilities.php index d69dc24..e43bb4e 100644 --- a/tests/unit/abilities-api/wpCoreAbilities.php +++ b/tests/unit/abilities-api/wpCoreAbilities.php @@ -36,7 +36,7 @@ public function set_up(): void { // Register core abilities category during the proper hook. $callback = static function (): void { - wp_register_core_ability_categories(); + register_core_ability_categories(); }; add_action( 'wp_abilities_api_categories_init', $callback ); do_action( 'wp_abilities_api_categories_init', WP_Ability_Categories_Registry::get_instance() ); @@ -48,7 +48,7 @@ public function set_up(): void { } // Register core abilities for testing. - wp_register_core_abilities(); + register_core_abilities(); } /** From be8a8b22fd9adf216a0b65897d2d5e6f9ecb9ffa Mon Sep 17 00:00:00 2001 From: Jorge Costa Date: Sun, 26 Oct 2025 16:56:49 +0000 Subject: [PATCH 5/9] keep wp prefix --- includes/abilities/wp-core-abilities.php | 2 +- includes/bootstrap.php | 2 +- tests/unit/abilities-api/wpCoreAbilities.php | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/includes/abilities/wp-core-abilities.php b/includes/abilities/wp-core-abilities.php index 25a9aff..f9a5981 100644 --- a/includes/abilities/wp-core-abilities.php +++ b/includes/abilities/wp-core-abilities.php @@ -43,7 +43,7 @@ function register_core_ability_categories(): void { * @return void */ // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedFunctionFound -function register_core_abilities(): void { +function wp_register_core_abilities(): void { $category_site = 'site'; $category_user = 'user'; diff --git a/includes/bootstrap.php b/includes/bootstrap.php index 92fa426..e971ecd 100644 --- a/includes/bootstrap.php +++ b/includes/bootstrap.php @@ -42,7 +42,7 @@ } // Load core abilities registration functions. -if ( ! function_exists( 'register_core_abilities' ) ) { +if ( ! function_exists( 'wp_register_core_abilities' ) ) { require_once __DIR__ . '/abilities/wp-core-abilities.php'; } diff --git a/tests/unit/abilities-api/wpCoreAbilities.php b/tests/unit/abilities-api/wpCoreAbilities.php index e43bb4e..d69dc24 100644 --- a/tests/unit/abilities-api/wpCoreAbilities.php +++ b/tests/unit/abilities-api/wpCoreAbilities.php @@ -36,7 +36,7 @@ public function set_up(): void { // Register core abilities category during the proper hook. $callback = static function (): void { - register_core_ability_categories(); + wp_register_core_ability_categories(); }; add_action( 'wp_abilities_api_categories_init', $callback ); do_action( 'wp_abilities_api_categories_init', WP_Ability_Categories_Registry::get_instance() ); @@ -48,7 +48,7 @@ public function set_up(): void { } // Register core abilities for testing. - register_core_abilities(); + wp_register_core_abilities(); } /** From ff2624acf7400743a2102f92e680119fba5ce3bf Mon Sep 17 00:00:00 2001 From: Jorge Costa Date: Sun, 26 Oct 2025 17:11:10 +0000 Subject: [PATCH 6/9] missing rename --- includes/abilities/wp-core-abilities.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/abilities/wp-core-abilities.php b/includes/abilities/wp-core-abilities.php index f9a5981..0d28ba9 100644 --- a/includes/abilities/wp-core-abilities.php +++ b/includes/abilities/wp-core-abilities.php @@ -17,7 +17,7 @@ * @return void */ // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedFunctionFound -function register_core_ability_categories(): void { +function wp_register_core_ability_categories(): void { wp_register_ability_category( 'site', array( From 6d070e4058e21e69e3971acc64251495ed2cfef8 Mon Sep 17 00:00:00 2001 From: Jorge Costa Date: Mon, 27 Oct 2025 13:02:14 +0000 Subject: [PATCH 7/9] sync core abiltiies file from core --- includes/abilities/wp-core-abilities.php | 95 +++++++++++------------- 1 file changed, 42 insertions(+), 53 deletions(-) diff --git a/includes/abilities/wp-core-abilities.php b/includes/abilities/wp-core-abilities.php index 0d28ba9..de8acdf 100644 --- a/includes/abilities/wp-core-abilities.php +++ b/includes/abilities/wp-core-abilities.php @@ -4,19 +4,18 @@ * * @package WordPress * @subpackage Abilities_API - * @since 0.3.0 + * @since 6.9.0 */ declare( strict_types = 1 ); /** - * Registers the core abilities categories. + * Registers the core ability categories. * - * @since 0.3.0 + * @since 6.9.0 * * @return void */ -// phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedFunctionFound function wp_register_core_ability_categories(): void { wp_register_ability_category( 'site', @@ -38,25 +37,49 @@ function wp_register_core_ability_categories(): void { /** * Registers the default core abilities. * - * @since 0.3.0 + * @since 6.9.0 * * @return void */ -// phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedFunctionFound function wp_register_core_abilities(): void { $category_site = 'site'; $category_user = 'user'; - $site_info_fields = array( - 'name', - 'description', - 'url', - 'wpurl', - 'admin_email', - 'charset', - 'language', - 'version', + $site_info_properties = array( + 'name' => array( + 'type' => 'string', + 'description' => __( 'The site title.' ), + ), + 'description' => array( + 'type' => 'string', + 'description' => __( 'The site tagline.' ), + ), + 'url' => array( + 'type' => 'string', + 'description' => __( 'The site home URL.' ), + ), + 'wpurl' => array( + 'type' => 'string', + 'description' => __( 'The WordPress installation URL.' ), + ), + 'admin_email' => array( + 'type' => 'string', + 'description' => __( 'The site administrator email address.' ), + ), + 'charset' => array( + 'type' => 'string', + 'description' => __( 'The site character encoding.' ), + ), + 'language' => array( + 'type' => 'string', + 'description' => __( 'The site language locale code.' ), + ), + 'version' => array( + 'type' => 'string', + 'description' => __( 'The WordPress version.' ), + ), ); + $site_info_fields = array_keys( $site_info_properties ); wp_register_ability( 'core/get-site-info', @@ -81,46 +104,12 @@ function wp_register_core_abilities(): void { ), 'output_schema' => array( 'type' => 'object', - 'properties' => array( - 'name' => array( - 'type' => 'string', - 'description' => __( 'The site title.' ), - ), - 'description' => array( - 'type' => 'string', - 'description' => __( 'The site tagline.' ), - ), - 'url' => array( - 'type' => 'string', - 'description' => __( 'The site home URL.' ), - ), - 'wpurl' => array( - 'type' => 'string', - 'description' => __( 'The WordPress installation URL.' ), - ), - 'admin_email' => array( - 'type' => 'string', - 'description' => __( 'The site administrator email address.' ), - ), - 'charset' => array( - 'type' => 'string', - 'description' => __( 'The site character encoding.' ), - ), - 'language' => array( - 'type' => 'string', - 'description' => __( 'The site language locale code.' ), - ), - 'version' => array( - 'type' => 'string', - 'description' => __( 'The WordPress version.' ), - ), - ), + 'properties' => $site_info_properties, 'additionalProperties' => false, ), - 'execute_callback' => static function ( $input = array() ): array { + 'execute_callback' => static function ( $input = array() ) use ( $site_info_fields ): array { $input = is_array( $input ) ? $input : array(); - $all_fields = array( 'name', 'description', 'url', 'wpurl', 'admin_email', 'charset', 'language', 'version' ); - $requested_fields = ! empty( $input['fields'] ) ? $input['fields'] : $all_fields; + $requested_fields = ! empty( $input['fields'] ) ? $input['fields'] : $site_info_fields; $result = array(); foreach ( $requested_fields as $field ) { @@ -246,7 +235,7 @@ function wp_register_core_abilities(): void { $env = wp_get_environment_type(); $php_version = phpversion(); $db_server_info = ''; - if ( isset( $wpdb ) && is_object( $wpdb ) && method_exists( $wpdb, 'db_server_info' ) ) { + if ( method_exists( $wpdb, 'db_server_info' ) ) { $db_server_info = $wpdb->db_server_info() ?? ''; } $wp_version = get_bloginfo( 'version' ); From 33fc76b8715f66032db0330c4072047552ddb980 Mon Sep 17 00:00:00 2001 From: Jorge Costa Date: Mon, 27 Oct 2025 13:07:29 +0000 Subject: [PATCH 8/9] lint issues ignore --- includes/abilities/wp-core-abilities.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/includes/abilities/wp-core-abilities.php b/includes/abilities/wp-core-abilities.php index de8acdf..96268e8 100644 --- a/includes/abilities/wp-core-abilities.php +++ b/includes/abilities/wp-core-abilities.php @@ -16,6 +16,7 @@ * * @return void */ +// phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedFunctionFound function wp_register_core_ability_categories(): void { wp_register_ability_category( 'site', @@ -41,6 +42,7 @@ function wp_register_core_ability_categories(): void { * * @return void */ +// phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedFunctionFound function wp_register_core_abilities(): void { $category_site = 'site'; $category_user = 'user'; @@ -236,6 +238,7 @@ function wp_register_core_abilities(): void { $php_version = phpversion(); $db_server_info = ''; if ( method_exists( $wpdb, 'db_server_info' ) ) { + /** @phpstan-ignore-next-line */ $db_server_info = $wpdb->db_server_info() ?? ''; } $wp_version = get_bloginfo( 'version' ); From c2607939f5d67c4f2ded4675c2c352e6fd184b50 Mon Sep 17 00:00:00 2001 From: Jorge Costa Date: Mon, 27 Oct 2025 13:19:53 +0000 Subject: [PATCH 9/9] lint fix --- includes/abilities/wp-core-abilities.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/abilities/wp-core-abilities.php b/includes/abilities/wp-core-abilities.php index 96268e8..a3cc6d8 100644 --- a/includes/abilities/wp-core-abilities.php +++ b/includes/abilities/wp-core-abilities.php @@ -81,7 +81,7 @@ function wp_register_core_abilities(): void { 'description' => __( 'The WordPress version.' ), ), ); - $site_info_fields = array_keys( $site_info_properties ); + $site_info_fields = array_keys( $site_info_properties ); wp_register_ability( 'core/get-site-info',