Linux sothorn202 5.15.0-161-generic #171-Ubuntu SMP Sat Oct 11 08:17:01 UTC 2025 x86_64
Apache/2.4.52 (Ubuntu)
: 202.28.82.202 | : 216.73.216.9
pkexec version 0.105
Cant Read [ /etc/named.conf ]
iqtd
RED EYES BYPASS SHELL!
Terminal
Auto Root
Adminer
Backdoor Destroyer
Kernel Exploit
Lock Shell
Lock File
Create User
+ Create Folder
+ Create File
/
home /
bigdata /
wp-includes /
[ HOME SHELL ]
NAME
SIZE
PERMISSION
ACTION
ID3
[ DIR ]
drwxr-xr-x
IXR
[ DIR ]
drwxr-xr-x
PHPMailer
[ DIR ]
drwxr-xr-x
Requests
[ DIR ]
drwxr-xr-x
SimplePie
[ DIR ]
drwxr-xr-x
Text
[ DIR ]
drwxr-xr-x
abilities-api
[ DIR ]
drwxr-xr-x
assets
[ DIR ]
drwxr-xr-x
block-bindings
[ DIR ]
drwxr-xr-x
block-patterns
[ DIR ]
drwxr-xr-x
block-supports
[ DIR ]
drwxr-xr-x
blocks
[ DIR ]
drwxr-xr-x
certificates
[ DIR ]
drwxr-xr-x
css
[ DIR ]
drwxr-xr-x
customize
[ DIR ]
drwxr-xr-x
fonts
[ DIR ]
drwxr-xr-x
html-api
[ DIR ]
drwxr-xr-x
images
[ DIR ]
drwxr-xr-x
interactivity-api
[ DIR ]
drwxr-xr-x
js
[ DIR ]
drwxr-xr-x
l10n
[ DIR ]
drwxr-xr-x
php-compat
[ DIR ]
drwxr-xr-x
pomo
[ DIR ]
drwxr-xr-x
rest-api
[ DIR ]
drwxr-xr-x
sitemaps
[ DIR ]
drwxr-xr-x
sodium_compat
[ DIR ]
drwxr-xr-x
style-engine
[ DIR ]
drwxr-xr-x
theme-compat
[ DIR ]
drwxr-xr-x
widgets
[ DIR ]
drwxr-xr-x
abilities-api.php
23.8
KB
-rwxr-xr-x
abilities.php
7.8
KB
-rwxr-xr-x
admin-bar.php
36.1
KB
-rwxr-xr-x
atomlib.php
11.9
KB
-rwxr-xr-x
author-template.php
18.94
KB
-rwxr-xr-x
block-bindings.php
7.35
KB
-rwxr-xr-x
block-editor.php
28.6
KB
-rwxr-xr-x
block-i18n.json
316
B
-rwxr-xr-x
block-patterns.php
12.9
KB
-rwxr-xr-x
block-template-utils.php
61.02
KB
-rwxr-xr-x
block-template.php
15
KB
-rwxr-xr-x
blocks.php
112.05
KB
-rwxr-xr-x
bookmark-template.php
12.47
KB
-rwxr-xr-x
bookmark.php
15.07
KB
-rwxr-xr-x
cache-compat.php
9.84
KB
-rwxr-xr-x
cache.php
13.17
KB
-rwxr-xr-x
canonical.php
33.83
KB
-rwxr-xr-x
capabilities.php
42.63
KB
-rwxr-xr-x
category-template.php
55.71
KB
-rwxr-xr-x
category.php
12.53
KB
-rwxr-xr-x
class-IXR.php
2.55
KB
-rwxr-xr-x
class-avif-info.php
28.92
KB
-rwxr-xr-x
class-feed.php
539
B
-rwxr-xr-x
class-http.php
367
B
-rwxr-xr-x
class-json.php
42.65
KB
-rwxr-xr-x
class-oembed.php
401
B
-rwxr-xr-x
class-phpass.php
6.61
KB
-rwxr-xr-x
class-phpmailer.php
664
B
-rwxr-xr-x
class-pop3.php
20.63
KB
-rwxr-xr-x
class-requests.php
2.18
KB
-rwxr-xr-x
class-simplepie.php
453
B
-rwxr-xr-x
class-smtp.php
457
B
-rwxr-xr-x
class-snoopy.php
36.83
KB
-rwxr-xr-x
class-walker-category-dropdown.php
2.41
KB
-rwxr-xr-x
class-walker-category.php
8.28
KB
-rwxr-xr-x
class-walker-comment.php
13.89
KB
-rwxr-xr-x
class-walker-nav-menu.php
11.76
KB
-rwxr-xr-x
class-walker-page-dropdown.php
2.65
KB
-rwxr-xr-x
class-walker-page.php
7.43
KB
-rwxr-xr-x
class-wp-admin-bar.php
17.46
KB
-rwxr-xr-x
class-wp-ajax-response.php
5.14
KB
-rwxr-xr-x
class-wp-application-passwords.php
16.7
KB
-rwxr-xr-x
class-wp-block-bindings-registry.php
8.28
KB
-rwxr-xr-x
class-wp-block-bindings-source.php
2.92
KB
-rwxr-xr-x
class-wp-block-editor-context.php
1.32
KB
-rwxr-xr-x
class-wp-block-list.php
4.6
KB
-rwxr-xr-x
class-wp-block-metadata-registry.php
11.62
KB
-rwxr-xr-x
class-wp-block-parser-block.php
2.5
KB
-rwxr-xr-x
class-wp-block-parser-frame.php
1.97
KB
-rwxr-xr-x
class-wp-block-parser.php
11.25
KB
-rwxr-xr-x
class-wp-block-pattern-categories-registry.php
5.32
KB
-rwxr-xr-x
class-wp-block-patterns-registry.php
10.6
KB
-rwxr-xr-x
class-wp-block-processor.php
67.84
KB
-rwxr-xr-x
class-wp-block-styles-registry.php
6.34
KB
-rwxr-xr-x
class-wp-block-supports.php
5.49
KB
-rwxr-xr-x
class-wp-block-template.php
1.99
KB
-rwxr-xr-x
class-wp-block-templates-registry.php
7.02
KB
-rwxr-xr-x
class-wp-block-type-registry.php
4.91
KB
-rwxr-xr-x
class-wp-block-type.php
16.86
KB
-rwxr-xr-x
class-wp-block.php
24.23
KB
-rwxr-xr-x
class-wp-classic-to-block-menu-converter.php
3.97
KB
-rwxr-xr-x
class-wp-comment-query.php
47.66
KB
-rwxr-xr-x
class-wp-comment.php
9.22
KB
-rwxr-xr-x
class-wp-customize-control.php
25.51
KB
-rwxr-xr-x
class-wp-customize-manager.php
198.38
KB
-rwxr-xr-x
class-wp-customize-nav-menus.php
56.65
KB
-rwxr-xr-x
class-wp-customize-panel.php
10.46
KB
-rwxr-xr-x
class-wp-customize-section.php
10.95
KB
-rwxr-xr-x
class-wp-customize-setting.php
29.26
KB
-rwxr-xr-x
class-wp-customize-widgets.php
70.91
KB
-rwxr-xr-x
class-wp-date-query.php
35.3
KB
-rwxr-xr-x
class-wp-dependencies.php
15.02
KB
-rwxr-xr-x
class-wp-dependency.php
2.57
KB
-rwxr-xr-x
class-wp-duotone.php
39.83
KB
-rwxr-xr-x
class-wp-editor.php
70.64
KB
-rwxr-xr-x
class-wp-embed.php
15.56
KB
-rwxr-xr-x
class-wp-error.php
7.33
KB
-rwxr-xr-x
class-wp-exception.php
253
B
-rwxr-xr-x
class-wp-fatal-error-handler.php
7.96
KB
-rwxr-xr-x
class-wp-feed-cache-transient.php
3.23
KB
-rwxr-xr-x
class-wp-feed-cache.php
969
B
-rwxr-xr-x
class-wp-hook.php
16.28
KB
-rwxr-xr-x
class-wp-http-cookie.php
7.22
KB
-rwxr-xr-x
class-wp-http-curl.php
12.95
KB
-rwxr-xr-x
class-wp-http-encoding.php
6.53
KB
-rwxr-xr-x
class-wp-http-ixr-client.php
3.42
KB
-rwxr-xr-x
class-wp-http-proxy.php
5.84
KB
-rwxr-xr-x
class-wp-http-requests-hooks.php
1.97
KB
-rwxr-xr-x
class-wp-http-requests-response.php
4.3
KB
-rwxr-xr-x
class-wp-http-response.php
2.91
KB
-rwxr-xr-x
class-wp-http-streams.php
16.46
KB
-rwxr-xr-x
class-wp-http.php
40.6
KB
-rwxr-xr-x
class-wp-image-editor-gd.php
20.22
KB
-rwxr-xr-x
class-wp-image-editor-imagick.php
36.11
KB
-rwxr-xr-x
class-wp-image-editor.php
17.01
KB
-rwxr-xr-x
class-wp-list-util.php
7.27
KB
-rwxr-xr-x
class-wp-locale-switcher.php
6.62
KB
-rwxr-xr-x
class-wp-locale.php
16.49
KB
-rwxr-xr-x
class-wp-matchesmapregex.php
1.79
KB
-rwxr-xr-x
class-wp-meta-query.php
29.82
KB
-rwxr-xr-x
class-wp-metadata-lazyloader.php
6.67
KB
-rwxr-xr-x
class-wp-navigation-fallback.php
8.98
KB
-rwxr-xr-x
class-wp-network-query.php
19.42
KB
-rwxr-xr-x
class-wp-network.php
12.01
KB
-rwxr-xr-x
class-wp-object-cache.php
17.11
KB
-rwxr-xr-x
class-wp-oembed-controller.php
6.74
KB
-rwxr-xr-x
class-wp-oembed.php
30.93
KB
-rwxr-xr-x
class-wp-paused-extensions-storage.php
4.99
KB
-rwxr-xr-x
class-wp-phpmailer.php
4.25
KB
-rwxr-xr-x
class-wp-plugin-dependencies.php
24.72
KB
-rwxr-xr-x
class-wp-post-type.php
29.96
KB
-rwxr-xr-x
class-wp-post.php
6.34
KB
-rwxr-xr-x
class-wp-query.php
159.91
KB
-rwxr-xr-x
class-wp-recovery-mode-cookie-service.php
6.72
KB
-rwxr-xr-x
class-wp-recovery-mode-email-service.php
10.92
KB
-rwxr-xr-x
class-wp-recovery-mode-key-service.php
4.77
KB
-rwxr-xr-x
class-wp-recovery-mode-link-service.php
3.38
KB
-rwxr-xr-x
class-wp-recovery-mode.php
11.18
KB
-rwxr-xr-x
class-wp-rewrite.php
62.19
KB
-rwxr-xr-x
class-wp-role.php
2.46
KB
-rwxr-xr-x
class-wp-roles.php
9.17
KB
-rwxr-xr-x
class-wp-script-modules.php
31.13
KB
-rwxr-xr-x
class-wp-scripts.php
33.38
KB
-rwxr-xr-x
class-wp-session-tokens.php
7.15
KB
-rwxr-xr-x
class-wp-simplepie-file.php
3.47
KB
-rwxr-xr-x
class-wp-simplepie-sanitize-kses.php
1.87
KB
-rwxr-xr-x
class-wp-site-query.php
30.91
KB
-rwxr-xr-x
class-wp-site.php
7.29
KB
-rwxr-xr-x
class-wp-speculation-rules.php
7.35
KB
-rwxr-xr-x
class-wp-styles.php
11.86
KB
-rwxr-xr-x
class-wp-tax-query.php
19.12
KB
-rwxr-xr-x
class-wp-taxonomy.php
18.12
KB
-rwxr-xr-x
class-wp-term-query.php
39.99
KB
-rwxr-xr-x
class-wp-term.php
5.17
KB
-rwxr-xr-x
class-wp-text-diff-renderer-inline.php
979
B
-rwxr-xr-x
class-wp-text-diff-renderer-table.php
18.44
KB
-rwxr-xr-x
class-wp-textdomain-registry.php
10.24
KB
-rwxr-xr-x
class-wp-theme-json-data.php
1.77
KB
-rwxr-xr-x
class-wp-theme-json-resolver.php
34.9
KB
-rwxr-xr-x
class-wp-theme-json-schema.php
7.19
KB
-rwxr-xr-x
class-wp-theme-json.php
160.5
KB
-rwxr-xr-x
class-wp-theme.php
64.27
KB
-rwxr-xr-x
class-wp-token-map.php
27.95
KB
-rwxr-xr-x
class-wp-url-pattern-prefixer.php
4.69
KB
-rwxr-xr-x
class-wp-user-meta-session-tokens.php
2.94
KB
-rwxr-xr-x
class-wp-user-query.php
43.13
KB
-rwxr-xr-x
class-wp-user-request.php
2.25
KB
-rwxr-xr-x
class-wp-user.php
22.5
KB
-rwxr-xr-x
class-wp-walker.php
13.01
KB
-rwxr-xr-x
class-wp-widget-factory.php
3.27
KB
-rwxr-xr-x
class-wp-widget.php
18
KB
-rwxr-xr-x
class-wp-xmlrpc-server.php
210.4
KB
-rwxr-xr-x
class-wp.php
25.86
KB
-rwxr-xr-x
class-wpdb.php
115.85
KB
-rwxr-xr-x
class.wp-dependencies.php
373
B
-rwxr-xr-x
class.wp-scripts.php
343
B
-rwxr-xr-x
class.wp-styles.php
338
B
-rwxr-xr-x
comment-template.php
100.73
KB
-rwxr-xr-x
comment.php
130.93
KB
-rwxr-xr-x
compat-utf8.php
19.1
KB
-rwxr-xr-x
compat.php
17.41
KB
-rwxr-xr-x
cron.php
41.98
KB
-rwxr-xr-x
date.php
400
B
-rwxr-xr-x
default-constants.php
11.1
KB
-rwxr-xr-x
default-filters.php
37.02
KB
-rwxr-xr-x
default-widgets.php
2.24
KB
-rwxr-xr-x
deprecated.php
188.13
KB
-rwxr-xr-x
embed-template.php
338
B
-rwxr-xr-x
embed.php
38
KB
-rwxr-xr-x
error-protection.php
4.02
KB
-rwxr-xr-x
feed-atom-comments.php
5.38
KB
-rwxr-xr-x
feed-atom.php
3.05
KB
-rwxr-xr-x
feed-rdf.php
2.61
KB
-rwxr-xr-x
feed-rss.php
1.16
KB
-rwxr-xr-x
feed-rss2-comments.php
4.04
KB
-rwxr-xr-x
feed-rss2.php
3.71
KB
-rwxr-xr-x
feed.php
23.03
KB
-rwxr-xr-x
fonts.php
9.56
KB
-rwxr-xr-x
formatting.php
346.43
KB
-rwxr-xr-x
functions.php
281.84
KB
-rwxr-xr-x
functions.wp-scripts.php
14.95
KB
-rwxr-xr-x
functions.wp-styles.php
8.44
KB
-rwxr-xr-x
general-template.php
168.95
KB
-rwxr-xr-x
global-styles-and-settings.php
20.71
KB
-rwxr-xr-x
http.php
25.27
KB
-rwxr-xr-x
https-detection.php
5.72
KB
-rwxr-xr-x
https-migration.php
4.63
KB
-rwxr-xr-x
kses.php
81.72
KB
-rwxr-xr-x
l10n.php
67.18
KB
-rwxr-xr-x
link-template.php
156.36
KB
-rwxr-xr-x
load.php
55.19
KB
-rwxr-xr-x
locale.php
162
B
-rwxr-xr-x
media-template.php
61.72
KB
-rwxr-xr-x
media.php
216
KB
-rwxr-xr-x
meta.php
65
KB
-rwxr-xr-x
ms-blogs.php
25.24
KB
-rwxr-xr-x
ms-default-constants.php
4.81
KB
-rwxr-xr-x
ms-default-filters.php
6.48
KB
-rwxr-xr-x
ms-deprecated.php
21.25
KB
-rwxr-xr-x
ms-files.php
2.79
KB
-rwxr-xr-x
ms-functions.php
89.69
KB
-rwxr-xr-x
ms-load.php
19.42
KB
-rwxr-xr-x
ms-network.php
3.69
KB
-rwxr-xr-x
ms-settings.php
4.11
KB
-rwxr-xr-x
ms-site.php
40.74
KB
-rwxr-xr-x
nav-menu-template.php
25.38
KB
-rwxr-xr-x
nav-menu.php
43.33
KB
-rwxr-xr-x
option.php
102.57
KB
-rwxr-xr-x
pluggable-deprecated.php
6.18
KB
-rwxr-xr-x
pluggable.php
124.45
KB
-rwxr-xr-x
plugin.php
35.65
KB
-rwxr-xr-x
post-formats.php
6.94
KB
-rwxr-xr-x
post-template.php
67.04
KB
-rwxr-xr-x
post-thumbnail-template.php
10.62
KB
-rwxr-xr-x
post.php
289.13
KB
-rwxr-xr-x
query.php
36.23
KB
-rwxr-xr-x
registration-functions.php
200
B
-rwxr-xr-x
registration.php
200
B
-rwxr-xr-x
rest-api.php
98.29
KB
-rwxr-xr-x
revision.php
30.02
KB
-rwxr-xr-x
rewrite.php
19.03
KB
-rwxr-xr-x
robots-template.php
5.06
KB
-rwxr-xr-x
rss-functions.php
255
B
-rwxr-xr-x
rss.php
22.66
KB
-rwxr-xr-x
script-loader.php
150.38
KB
-rwxr-xr-x
script-modules.php
9.68
KB
-rwxr-xr-x
session.php
258
B
-rwxr-xr-x
shortcodes.php
23.49
KB
-rwxr-xr-x
sitemaps.php
3.16
KB
-rwxr-xr-x
speculative-loading.php
8.4
KB
-rwxr-xr-x
spl-autoload-compat.php
441
B
-rwxr-xr-x
style-engine.php
7.39
KB
-rwxr-xr-x
taxonomy.php
172.91
KB
-rwxr-xr-x
template-canvas.php
544
B
-rwxr-xr-x
template-loader.php
3.84
KB
-rwxr-xr-x
template.php
35.97
KB
-rwxr-xr-x
theme-i18n.json
1.49
KB
-rwxr-xr-x
theme-previews.php
2.84
KB
-rwxr-xr-x
theme-templates.php
6.09
KB
-rwxr-xr-x
theme.json
8.71
KB
-rwxr-xr-x
theme.php
131.84
KB
-rwxr-xr-x
update.php
37.45
KB
-rwxr-xr-x
user.php
173.89
KB
-rwxr-xr-x
utf8.php
7.09
KB
-rwxr-xr-x
vars.php
6.41
KB
-rwxr-xr-x
version.php
1.08
KB
-rwxr-xr-x
widgets.php
69.46
KB
-rwxr-xr-x
wp-db.php
445
B
-rwxr-xr-x
wp-diff.php
799
B
-rwxr-xr-x
Delete
Unzip
Zip
${this.title}
Close
Code Editor : abilities-api.php
<?php /** * Abilities API: core functions for registering and managing abilities. * * The Abilities API provides a unified, extensible framework for registering * and executing discrete capabilities within WordPress. An "ability" is a * self-contained unit of functionality with defined inputs, outputs, permissions, * and execution logic. * * ## Overview * * The Abilities API enables developers to: * * - Register custom abilities with standardized interfaces. * - Define permission checks and execution callbacks. * - Organize abilities into logical categories. * - Validate inputs and outputs using JSON Schema. * - Expose abilities through the REST API. * * ## Working with Abilities * * Abilities must be registered on the `wp_abilities_api_init` action hook. * Attempting to register an ability outside of this hook will fail and * trigger a `_doing_it_wrong()` notice. * Example: * * function my_plugin_register_abilities(): void { * wp_register_ability( * 'my-plugin/export-users', * array( * 'label' => __( 'Export Users', 'my-plugin' ), * 'description' => __( 'Exports user data to CSV format.', 'my-plugin' ), * 'category' => 'data-export', * 'execute_callback' => 'my_plugin_export_users', * 'permission_callback' => function(): bool { * return current_user_can( 'export' ); * }, * 'input_schema' => array( * 'type' => 'string', * 'enum' => array( 'subscriber', 'contributor', 'author', 'editor', 'administrator' ), * 'description' => __( 'Limits the export to users with this role.', 'my-plugin' ), * 'required' => false, * ), * 'output_schema' => array( * 'type' => 'string', * 'description' => __( 'User data in CSV format.', 'my-plugin' ), * 'required' => true, * ), * 'meta' => array( * 'show_in_rest' => true, * ), * ) * ); * } * add_action( 'wp_abilities_api_init', 'my_plugin_register_abilities' ); * * Once registered, abilities can be checked, retrieved, and managed: * * // Checks if an ability is registered, and prints its label. * if ( wp_has_ability( 'my-plugin/export-users' ) ) { * $ability = wp_get_ability( 'my-plugin/export-users' ); * * echo $ability->get_label(); * } * * // Gets all registered abilities. * $all_abilities = wp_get_abilities(); * * // Unregisters when no longer needed. * wp_unregister_ability( 'my-plugin/export-users' ); * * ## Best Practices * * - Always register abilities on the `wp_abilities_api_init` hook. * - Use namespaced ability names to prevent conflicts. * - Implement robust permission checks in permission callbacks. * - Provide an `input_schema` to ensure data integrity and document expected inputs. * - Define an `output_schema` to describe return values and validate responses. * - Return `WP_Error` objects for failures rather than throwing exceptions. * - Use internationalization functions for all user-facing strings. * * @package WordPress * @subpackage Abilities_API * @since 6.9.0 */ declare( strict_types = 1 ); /** * Registers a new ability using the Abilities API. It requires three steps: * * 1. Hook into the `wp_abilities_api_init` action. * 2. Call `wp_register_ability()` with a namespaced name and configuration. * 3. Provide execute and permission callbacks. * * Example: * * function my_plugin_register_abilities(): void { * wp_register_ability( * 'my-plugin/analyze-text', * array( * 'label' => __( 'Analyze Text', 'my-plugin' ), * 'description' => __( 'Performs sentiment analysis on provided text.', 'my-plugin' ), * 'category' => 'text-processing', * 'input_schema' => array( * 'type' => 'string', * 'description' => __( 'The text to be analyzed.', 'my-plugin' ), * 'minLength' => 10, * 'required' => true, * ), * 'output_schema' => array( * 'type' => 'string', * 'enum' => array( 'positive', 'negative', 'neutral' ), * 'description' => __( 'The sentiment result: positive, negative, or neutral.', 'my-plugin' ), * 'required' => true, * ), * 'execute_callback' => 'my_plugin_analyze_text', * 'permission_callback' => 'my_plugin_can_analyze_text', * 'meta' => array( * 'annotations' => array( * 'readonly' => true, * ), * 'show_in_rest' => true, * ), * ) * ); * } * add_action( 'wp_abilities_api_init', 'my_plugin_register_abilities' ); * * ### Naming Conventions * * Ability names must follow these rules: * * - Include a namespace prefix (e.g., `my-plugin/my-ability`). * - Use only lowercase alphanumeric characters, dashes, and forward slashes. * - Use descriptive, action-oriented names (e.g., `process-payment`, `generate-report`). * * ### Categories * * Abilities must be organized into categories. Ability categories provide better * discoverability and must be registered before the abilities that reference them: * * function my_plugin_register_categories(): void { * wp_register_ability_category( * 'text-processing', * array( * 'label' => __( 'Text Processing', 'my-plugin' ), * 'description' => __( 'Abilities for analyzing and transforming text.', 'my-plugin' ), * ) * ); * } * add_action( 'wp_abilities_api_categories_init', 'my_plugin_register_categories' ); * * ### Input and Output Schemas * * Schemas define the expected structure, type, and constraints for ability inputs * and outputs using JSON Schema syntax. They serve two critical purposes: automatic * validation of data passed to and returned from abilities, and self-documenting * API contracts for developers. * * WordPress implements a validator based on a subset of the JSON Schema Version 4 * specification (https://json-schema.org/specification-links.html#draft-4). * For details on supported JSON Schema properties and syntax, see the * related WordPress REST API Schema documentation: * https://developer.wordpress.org/rest-api/extending-the-rest-api/schema/#json-schema-basics * * Defining schemas is mandatory when there is a value to pass or return. * They ensure data integrity, improve developer experience, and enable * better documentation: * * 'input_schema' => array( * 'type' => 'string', * 'description' => __( 'The text to be analyzed.', 'my-plugin' ), * 'minLength' => 10, * 'required' => true, * ), * 'output_schema' => array( * 'type' => 'string', * 'enum' => array( 'positive', 'negative', 'neutral' ), * 'description' => __( 'The sentiment result: positive, negative, or neutral.', 'my-plugin' ), * 'required' => true, * ), * * ### Callbacks * * #### Execute Callback * * The execute callback performs the ability's core functionality. It receives * optional input data and returns either a result or `WP_Error` on failure. * * function my_plugin_analyze_text( string $input ): string|WP_Error { * $score = My_Plugin::perform_sentiment_analysis( $input ); * if ( is_wp_error( $score ) ) { * return $score; * } * return My_Plugin::interpret_sentiment_score( $score ); * } * * #### Permission Callback * * The permission callback determines whether the ability can be executed. * It receives the same input as the execute callback and must return a * boolean or `WP_Error`. Common use cases include checking user capabilities, * validating API keys, or verifying system state: * * function my_plugin_can_analyze_text( string $input ): bool|WP_Error { * return current_user_can( 'edit_posts' ); * } * * ### REST API Integration * * Abilities can be exposed through the REST API by setting `show_in_rest` * to `true` in the meta configuration: * * 'meta' => array( * 'show_in_rest' => true, * ), * * This allows abilities to be invoked via HTTP requests to the WordPress REST API. * * @since 6.9.0 * * @see WP_Abilities_Registry::register() * @see wp_register_ability_category() * @see wp_unregister_ability() * * @param string $name The name of the ability. Must be a namespaced string containing * a prefix, e.g., `my-plugin/my-ability`. Can only contain lowercase * alphanumeric characters, dashes, and forward slashes. * @param array<string, mixed> $args { * An associative array of arguments for configuring the ability. * * @type string $label Required. The human-readable label for the ability. * @type string $description Required. A detailed description of what the ability does * and when it should be used. * @type string $category Required. The ability category slug this ability belongs to. * The ability category must be registered via `wp_register_ability_category()` * before registering the ability. * @type callable $execute_callback Required. A callback function to execute when the ability is invoked. * Receives optional mixed input data and must return either a result * value (any type) or a `WP_Error` object on failure. * @type callable $permission_callback Required. A callback function to check permissions before execution. * Receives optional mixed input data (same as `execute_callback`) and * must return `true`/`false` for simple checks, or `WP_Error` for * detailed error responses. * @type array<string, mixed> $input_schema Optional. JSON Schema definition for validating the ability's input. * Must be a valid JSON Schema object defining the structure and * constraints for input data. Used for automatic validation and * API documentation. * @type array<string, mixed> $output_schema Optional. JSON Schema definition for the ability's output. * Describes the structure of successful return values from * `execute_callback`. Used for documentation and validation. * @type array<string, mixed> $meta { * Optional. Additional metadata for the ability. * * @type array<string, bool|null> $annotations { * Optional. Semantic annotations describing the ability's behavioral characteristics. * These annotations are hints for tooling and documentation. * * @type bool|null $readonly Optional. If true, the ability does not modify its environment. * @type bool|null $destructive Optional. If true, the ability may perform destructive updates to its environment. * If false, the ability performs only additive updates. * @type bool|null $idempotent Optional. If true, calling the ability repeatedly with the same arguments * will have no additional effect on its environment. * } * @type bool $show_in_rest Optional. Whether to expose this ability in the REST API. * When true, the ability can be invoked via HTTP requests. * Default false. * } * @type string $ability_class Optional. Fully-qualified custom class name to instantiate * instead of the default `WP_Ability` class. The custom class * must extend `WP_Ability`. Useful for advanced customization * of ability behavior. * } * @return WP_Ability|null The registered ability instance on success, `null` on failure. */ function wp_register_ability( string $name, array $args ): ?WP_Ability { if ( ! doing_action( 'wp_abilities_api_init' ) ) { _doing_it_wrong( __FUNCTION__, sprintf( /* translators: 1: wp_abilities_api_init, 2: string value of the ability name. */ __( 'Abilities must be registered on the %1$s action. The ability %2$s was not registered.' ), '<code>wp_abilities_api_init</code>', '<code>' . esc_html( $name ) . '</code>' ), '6.9.0' ); return null; } $registry = WP_Abilities_Registry::get_instance(); if ( null === $registry ) { return null; } return $registry->register( $name, $args ); } /** * Unregisters an ability from the Abilities API. * * Removes a previously registered ability from the global registry. Use this to * disable abilities provided by other plugins or when an ability is no longer needed. * * Can be called at any time after the ability has been registered. * * Example: * * if ( wp_has_ability( 'other-plugin/some-ability' ) ) { * wp_unregister_ability( 'other-plugin/some-ability' ); * } * * @since 6.9.0 * * @see WP_Abilities_Registry::unregister() * @see wp_register_ability() * * @param string $name The name of the ability to unregister, including namespace prefix * (e.g., 'my-plugin/my-ability'). * @return WP_Ability|null The unregistered ability instance on success, `null` on failure. */ function wp_unregister_ability( string $name ): ?WP_Ability { $registry = WP_Abilities_Registry::get_instance(); if ( null === $registry ) { return null; } return $registry->unregister( $name ); } /** * Checks if an ability is registered. * * Use this for conditional logic and feature detection before attempting to * retrieve or use an ability. * * Example: * * // Displays different UI based on available abilities. * if ( wp_has_ability( 'premium-plugin/advanced-export' ) ) { * echo 'Export with Premium Features'; * } else { * echo 'Basic Export'; * } * * @since 6.9.0 * * @see WP_Abilities_Registry::is_registered() * @see wp_get_ability() * * @param string $name The name of the ability to check, including namespace prefix * (e.g., 'my-plugin/my-ability'). * @return bool `true` if the ability is registered, `false` otherwise. */ function wp_has_ability( string $name ): bool { $registry = WP_Abilities_Registry::get_instance(); if ( null === $registry ) { return false; } return $registry->is_registered( $name ); } /** * Retrieves a registered ability. * * Returns the ability instance for inspection or use. The instance provides access * to the ability's configuration, metadata, and execution methods. * * Example: * * // Prints information about a registered ability. * $ability = wp_get_ability( 'my-plugin/export-data' ); * if ( $ability ) { * echo $ability->get_label() . ': ' . $ability->get_description(); * } * * @since 6.9.0 * * @see WP_Abilities_Registry::get_registered() * @see wp_has_ability() * * @param string $name The name of the ability, including namespace prefix * (e.g., 'my-plugin/my-ability'). * @return WP_Ability|null The registered ability instance, or `null` if not registered. */ function wp_get_ability( string $name ): ?WP_Ability { $registry = WP_Abilities_Registry::get_instance(); if ( null === $registry ) { return null; } return $registry->get_registered( $name ); } /** * Retrieves all registered abilities. * * Returns an array of all ability instances currently registered in the system. * Use this for discovery, debugging, or building administrative interfaces. * * Example: * * // Prints information about all available abilities. * $abilities = wp_get_abilities(); * foreach ( $abilities as $ability ) { * echo $ability->get_label() . ': ' . $ability->get_description() . "\n"; * } * * @since 6.9.0 * * @see WP_Abilities_Registry::get_all_registered() * * @return WP_Ability[] An array of registered WP_Ability instances. Returns an empty * array if no abilities are registered or if the registry is unavailable. */ function wp_get_abilities(): array { $registry = WP_Abilities_Registry::get_instance(); if ( null === $registry ) { return array(); } return $registry->get_all_registered(); } /** * Registers a new ability category. * * Ability categories provide a way to organize and group related abilities for better * discoverability and management. Ability categories must be registered before abilities * that reference them. * * Ability categories must be registered on the `wp_abilities_api_categories_init` action hook. * * Example: * * function my_plugin_register_categories() { * wp_register_ability_category( * 'content-management', * array( * 'label' => __( 'Content Management', 'my-plugin' ), * 'description' => __( 'Abilities for managing and organizing content.', 'my-plugin' ), * ) * ); * } * add_action( 'wp_abilities_api_categories_init', 'my_plugin_register_categories' ); * * @since 6.9.0 * * @see WP_Ability_Categories_Registry::register() * @see wp_register_ability() * @see wp_unregister_ability_category() * * @param string $slug The unique slug for the ability category. Must contain only lowercase * alphanumeric characters and dashes (e.g., 'data-export'). * @param array<string, mixed> $args { * An associative array of arguments for the ability category. * * @type string $label Required. The human-readable label for the ability category. * @type string $description Required. A description of what abilities in this category do. * @type array<string, mixed> $meta Optional. Additional metadata for the ability category. * } * @return WP_Ability_Category|null The registered ability category instance on success, `null` on failure. */ function wp_register_ability_category( string $slug, array $args ): ?WP_Ability_Category { if ( ! doing_action( 'wp_abilities_api_categories_init' ) ) { _doing_it_wrong( __FUNCTION__, sprintf( /* translators: 1: wp_abilities_api_categories_init, 2: ability category slug. */ __( 'Ability categories must be registered on the %1$s action. The ability category %2$s was not registered.' ), '<code>wp_abilities_api_categories_init</code>', '<code>' . esc_html( $slug ) . '</code>' ), '6.9.0' ); return null; } $registry = WP_Ability_Categories_Registry::get_instance(); if ( null === $registry ) { return null; } return $registry->register( $slug, $args ); } /** * Unregisters an ability category. * * Removes a previously registered ability category from the global registry. Use this to * disable ability categories that are no longer needed. * * Can be called at any time after the ability category has been registered. * * Example: * * if ( wp_has_ability_category( 'deprecated-category' ) ) { * wp_unregister_ability_category( 'deprecated-category' ); * } * * @since 6.9.0 * * @see WP_Ability_Categories_Registry::unregister() * @see wp_register_ability_category() * * @param string $slug The slug of the ability category to unregister. * @return WP_Ability_Category|null The unregistered ability category instance on success, `null` on failure. */ function wp_unregister_ability_category( string $slug ): ?WP_Ability_Category { $registry = WP_Ability_Categories_Registry::get_instance(); if ( null === $registry ) { return null; } return $registry->unregister( $slug ); } /** * Checks if an ability category is registered. * * Use this for conditional logic and feature detection before attempting to * retrieve or use an ability category. * * Example: * * // Displays different UI based on available ability categories. * if ( wp_has_ability_category( 'premium-features' ) ) { * echo 'Premium Features Available'; * } else { * echo 'Standard Features'; * } * * @since 6.9.0 * * @see WP_Ability_Categories_Registry::is_registered() * @see wp_get_ability_category() * * @param string $slug The slug of the ability category to check. * @return bool `true` if the ability category is registered, `false` otherwise. */ function wp_has_ability_category( string $slug ): bool { $registry = WP_Ability_Categories_Registry::get_instance(); if ( null === $registry ) { return false; } return $registry->is_registered( $slug ); } /** * Retrieves a registered ability category. * * Returns the ability category instance for inspection or use. The instance provides access * to the ability category's configuration and metadata. * * Example: * * // Prints information about a registered ability category. * $ability_category = wp_get_ability_category( 'content-management' ); * if ( $ability_category ) { * echo $ability_category->get_label() . ': ' . $ability_category->get_description(); * } * * @since 6.9.0 * * @see WP_Ability_Categories_Registry::get_registered() * @see wp_has_ability_category() * @see wp_get_ability_categories() * * @param string $slug The slug of the ability category. * @return WP_Ability_Category|null The ability category instance, or `null` if not registered. */ function wp_get_ability_category( string $slug ): ?WP_Ability_Category { $registry = WP_Ability_Categories_Registry::get_instance(); if ( null === $registry ) { return null; } return $registry->get_registered( $slug ); } /** * Retrieves all registered ability categories. * * Returns an array of all ability category instances currently registered in the system. * Use this for discovery, debugging, or building administrative interfaces. * * Example: * * // Prints information about all available ability categories. * $ability_categories = wp_get_ability_categories(); * foreach ( $ability_categories as $ability_category ) { * echo $ability_category->get_label() . ': ' . $ability_category->get_description() . "\n"; * } * * @since 6.9.0 * * @see WP_Ability_Categories_Registry::get_all_registered() * @see wp_get_ability_category() * * @return WP_Ability_Category[] An array of registered ability category instances. Returns an empty array * if no ability categories are registered or if the registry is unavailable. */ function wp_get_ability_categories(): array { $registry = WP_Ability_Categories_Registry::get_instance(); if ( null === $registry ) { return array(); } return $registry->get_all_registered(); }
Close