From e1179cb0e54c031d9608bbc9584449e31f397c29 Mon Sep 17 00:00:00 2001 From: Jorge Costa Date: Thu, 23 Oct 2025 16:47:27 +0100 Subject: [PATCH] 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 66635acd..00000000 --- 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 00000000..7f7ec283 --- /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 ecafd7a2..e9b100d3 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( 'abilities_api_categories_init', array( 'WP_Core_Abilities', 'register_category' ) ); - add_action( 'abilities_api_init', array( 'WP_Core_Abilities', 'register' ) ); + add_action( 'abilities_api_categories_init', 'register_core_ability_categories' ); + add_action( 'abilities_api_init', 'register_core_abilities' ); } } diff --git a/tests/unit/abilities-api/wpCoreAbilities.php b/tests/unit/abilities-api/wpCoreAbilities.php index 16203a77..e4950509 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( 'abilities_api_categories_init', $callback ); do_action( 'abilities_api_categories_init', WP_Abilities_Category_Registry::get_instance() ); @@ -48,7 +48,7 @@ public function set_up(): void { } // Register core abilities for testing. - WP_Core_Abilities::register(); + register_core_abilities(); } /**