Abilities API 提供了WordPress 动作和过滤器钩子,允许开发者监控并响应能力执行事件。
动作
wp_abilities_api_categories_init
在类别注册表首次初始化时触发。这是在注册类别时应使用的正确钩子。
do_action( 'wp_abilities_api_categories_init', $registry );参数
$registry(\WP_Ability_Categories_Registry): 类别注册表实例。
使用示例
add_action( 'wp_abilities_api_categories_init', 'wporg_register_categories' );
/**
* 注册自定义能力类别。
*
* @param \WP_Ability_Categories_Registry $registry 类别注册表实例。
*/
function wporg_register_categories( $registry ) {
wp_register_ability_category( 'ecommerce', array(
'label' => __( '电子商务', 'textdomain' ),
'description' => __( '与电子商务功能相关的能力。', 'textdomain' ),
));
wp_register_ability_category( 'analytics', array(
'label' => __( '分析', 'textdomain' ),
'description' => __( '提供分析数据和洞察力的能力。', 'textdomain' ),
));
}wp_abilities_api_init
在能力注册表初始化完成后触发。这是在注册能力时应使用的正确钩子。
do_action( 'wp_abilities_api_init', $registry );参数
$registry(\WP_Abilities_Registry): 能力注册表实例。
使用示例
add_action('wp_abilities_api_init', 'wporg_register_abilities');
/**
* 注册自定义能力。
*/
function wporg_register_abilities() {
wp_register_ability( 'wporg/ability', array(
'label' => __( '标题', 'textdomain' ),
'description' => __( '描述。', 'textdomain' ),
'category' => 'analytics',
'input_schema' => array(
'type' => 'object',
'properties' => array(),
'additionalProperties' => false,
),
'output_schema' => array(
'type' => 'string',
'description' => '网站标题。',
),
'execute_callback' => 'wporg_get_site_title',
'permission_callback' => '__return_true', // 所有人都可以访问此内容
'meta' => array(
'show_in_rest' => true, // 可选:通过 REST API 暴露
),
) );
}wp_before_execute_ability
在能力执行前立即触发,权限检查已通过但尚未调用执行回调时。
do_action( 'wp_before_execute_ability', $ability_name, $input );参数
$ability_name(string): 正在执行的能力的命名空间名称(例如wporg/get-posts)。$input(mixed): 传递给能力的输入数据。
使用示例
add_action( 'wp_before_execute_ability', 'log_ability_execution', 10, 2 );
/**
* 记录每次能力执行尝试。
* @param string $ability_name 正在执行的能力名称。
* @param mixed $input 传递给能力的输入数据。
*/
function log_ability_execution( string $ability_name, $input ) {
error_log( '即将执行能力:' . $ability_name );
if ( $input !== null ) {
error_log( '输入:' . wp_json_encode( $input ) );
}
}wp_after_execute_ability
在能力成功执行完毕后立即触发,输出验证通过后。
do_action( 'wp_after_execute_ability', string $ability_name, $input, $result );参数
$ability_name(string): 已执行能力的命名空间名称。$input(mixed): 传递给能力的输入数据。$result(mixed): 能力执行回调返回的经过验证的结果。
使用示例
add_action( 'wp_after_execute_ability', 'log_ability_result', 10, 3 );
/**
* 记录每次能力执行的结果。
*
* @param string $ability_name 已执行能力的名称。
* @param mixed $input 传递给能力的输入数据。
* @param mixed $result 能力返回的结果。
*/
function log_ability_result( string $ability_name, $input, $result ) {
error_log( '完成能力:' . $ability_name );
error_log( '结果:' . wp_json_encode( $result ) );
}过滤器
wp_register_ability_args
允许在验证并使用参数实例化能力之前修改能力的参数。
$args = apply_filters( 'wp_register_ability_args', array $args, string $ability_name );参数
$args(array<string,mixed>): 用于实例化能力的参数。完整参数列表请参阅wp_register_ability()。$ability_name(string): 正在注册的能力的命名空间名称(例如wporg/get-posts)。
使用示例
add_filter( 'wp_register_ability_args', 'my_modify_ability_args', 10, 2 );
/**
* 在验证前修改能力参数。
*
* @param array<string,mixed> $args 用于实例化能力的参数。
* @param string $ability_name 能力名称及其命名空间。
*
* @return array<string,mixed> 修改后的能力参数。
*/
function my_modify_ability_args( array $args, string $ability_name ): array {
// 检查能力名称是否匹配您正在查找的内容。
if ( 'my-namespace/my-ability' !== $ability_name ) {
return $args;
}
// 根据需要修改参数。
$args['label'] = __('我的自定义能力标签');
// 您可以使用旧参数构建新参数。
$args['description'] = sprintf(
/* translators: 1: 能力名称 2: 之前的描述 */
__('这是能力 %s 的自定义描述。之前的描述是 %s', 'text-domain'),
$ability_name,
$args['description'] ?? 'N/A'
);
// 即使是回调函数也可以处理。
$args['permission_callback' ] = static function ( $input = null ) use ( $args, $ability_name ) {
$previous_check = is_callable( $args['permission_callback'] ) ? $args['permission_callback']( $input ) : true;
// 如果已经失败,则无需更严格的检查。
if ( ! $previous_check || is_wp_error( $previous_check ) ) {
return $previous_check;
}
return current_user_can( 'my_custom_ability_cap', $ability_name );
};
return $args;
}wp_register_ability_category_args
允许在验证之前修改类别的参数。
$args = apply_filters( 'wp_register_ability_category_args', array $args, string $slug );参数
$args(array<string,mixed>): 用于实例化类别的参数(标签、描述)。$slug(string): 正在注册的类别的 slug。
使用示例
add_filter( 'wp_register_ability_category_args', 'my_modify_category_args', 10, 2 );
/**
* 在验证前修改类别参数。
*
* @param array<string,mixed> $args 用于实例化类别的参数。
* @param string $slug 正在注册的类别的 slug。
*
* @return array<string,mixed> 修改后的类别参数。
*/
function my_modify_category_args( array $args, string $slug ): array {
if ( 'my-category' === $slug ) {
$args['label'] = __( '我的自定义标签', 'textdomain' );
$args['description'] = __( '这是我为此类别编写的自定义描述。', 'textdomain' );
}
return $args;
}