at path:
ROOT
/
wp-includes
/
abilities-api.php
run:
R
W
Run
ID3
DIR
2026-09-09 19:08:36
R
W
Run
IXR
DIR
2026-09-10 03:47:11
R
W
Run
PHPMailer
DIR
2026-09-10 00:49:39
R
W
Run
Requests
DIR
2026-09-09 19:07:27
R
W
Run
SimplePie
DIR
2026-09-09 19:08:36
R
W
Run
Text
DIR
2026-09-09 19:08:36
R
W
Run
abilities-api
DIR
2026-09-09 19:24:56
R
W
Run
ai-client
DIR
2026-09-09 19:24:56
R
W
Run
assets
DIR
2026-09-09 19:24:59
R
W
Run
block-bindings
DIR
2026-09-14 23:43:30
R
W
Run
block-patterns
DIR
2026-09-14 23:43:23
R
W
Run
block-supports
DIR
2026-09-14 23:43:27
R
W
Run
blocks
DIR
2026-09-09 19:24:57
R
W
Run
build
DIR
2026-09-14 23:43:09
R
W
Run
certificates
DIR
2026-09-09 19:08:36
R
W
Run
css
DIR
2026-09-09 19:24:56
R
W
Run
customize
DIR
2026-09-15 00:08:51
R
W
Run
fonts
DIR
2026-09-09 19:08:37
R
W
Run
html-api
DIR
2026-09-14 23:37:07
R
W
Run
images
DIR
2026-09-09 19:24:56
R
W
Run
interactivity-api
DIR
2026-09-14 23:37:29
R
W
Run
js
DIR
2026-09-09 19:24:57
R
W
Run
l10n
DIR
2026-09-15 00:38:49
R
W
Run
php-ai-client
DIR
2026-09-09 19:24:56
R
W
Run
php-compat
DIR
2026-09-09 19:08:38
R
W
Run
pomo
DIR
2026-09-09 19:08:38
R
W
Run
rest-api
DIR
2026-09-14 23:57:00
R
W
Run
sitemaps
DIR
2026-09-09 19:08:38
R
W
Run
sodium_compat
DIR
2026-09-09 19:08:38
R
W
Run
style-engine
DIR
2026-09-09 19:08:38
R
W
Run
theme-compat
DIR
2026-09-14 23:56:42
R
W
Run
widgets
DIR
2026-09-10 00:51:30
R
W
Run
abilities-api.php
32.03 KB
2026-09-09 19:24:58
R
W
Run
Delete
Rename
abilities.php
11.52 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
admin-bar.php
39.13 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
ai-client.php
2.49 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
atomlib.php
11.9 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
author-template.php
19.38 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
block-bindings.php
7.45 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
block-editor.php
28.05 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
block-i18n.json
316 By
2026-09-09 19:08:36
R
W
Run
Delete
Rename
block-patterns.php
15.24 KB
2026-09-09 19:24:58
R
W
Run
Delete
Rename
block-template-utils.php
61.69 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
block-template.php
17.83 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
blocks.php
121.29 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
bookmark-template.php
12.47 KB
2026-09-09 19:08:36
R
W
Run
Delete
Rename
bookmark.php
15.07 KB
2026-09-09 19:08:36
R
W
Run
Delete
Rename
cache-compat.php
10.76 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
cache.php
13.17 KB
2026-09-09 19:24:58
R
W
Run
Delete
Rename
canonical.php
33.97 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
capabilities.php
42.56 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
category-template.php
55.65 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
category.php
12.53 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-IXR.php
2.55 KB
2026-09-09 19:24:58
R
W
Run
Delete
Rename
class-avif-info.php
29.3 KB
2026-09-09 19:24:58
R
W
Run
Delete
Rename
class-feed.php
539 By
2026-09-09 19:08:36
R
W
Run
Delete
Rename
class-http.php
367 By
2026-09-09 19:08:36
R
W
Run
Delete
Rename
class-json.php
42.65 KB
2026-09-09 19:24:58
R
W
Run
Delete
Rename
class-oembed.php
401 By
2026-09-09 19:08:36
R
W
Run
Delete
Rename
class-phpass.php
6.61 KB
2026-09-09 19:08:36
R
W
Run
Delete
Rename
class-phpmailer.php
664 By
2026-09-09 19:08:36
R
W
Run
Delete
Rename
class-pop3.php
20.61 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
class-requests.php
2.18 KB
2026-09-09 19:08:36
R
W
Run
Delete
Rename
class-simplepie.php
453 By
2026-09-09 19:08:36
R
W
Run
Delete
Rename
class-smtp.php
457 By
2026-09-09 19:08:36
R
W
Run
Delete
Rename
class-snoopy.php
36.83 KB
2026-09-09 19:08:36
R
W
Run
Delete
Rename
class-walker-category-dropdown.php
2.41 KB
2026-09-09 19:08:36
R
W
Run
Delete
Rename
class-walker-category.php
8.28 KB
2026-09-09 19:08:36
R
W
Run
Delete
Rename
class-walker-comment.php
13.89 KB
2026-09-09 19:08:36
R
W
Run
Delete
Rename
class-walker-nav-menu.php
11.76 KB
2026-09-09 19:08:36
R
W
Run
Delete
Rename
class-walker-page-dropdown.php
2.65 KB
2026-09-09 19:08:36
R
W
Run
Delete
Rename
class-walker-page.php
7.43 KB
2026-09-09 19:08:36
R
W
Run
Delete
Rename
class-wp-admin-bar.php
17.58 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
class-wp-ajax-response.php
5.16 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp-application-passwords.php
16.7 KB
2026-09-09 19:08:36
R
W
Run
Delete
Rename
class-wp-block-bindings-registry.php
8.07 KB
2026-09-09 19:24:58
R
W
Run
Delete
Rename
class-wp-block-bindings-source.php
2.92 KB
2026-09-09 19:08:36
R
W
Run
Delete
Rename
class-wp-block-editor-context.php
1.32 KB
2026-09-09 19:08:36
R
W
Run
Delete
Rename
class-wp-block-list.php
4.6 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp-block-metadata-registry.php
11.57 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp-block-parser-block.php
2.5 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp-block-parser-frame.php
1.95 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp-block-parser.php
11.25 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
class-wp-block-pattern-categories-registry.php
4.28 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp-block-patterns-registry.php
10.02 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
class-wp-block-processor.php
68.28 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp-block-styles-registry.php
6.27 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp-block-supports.php
7.4 KB
2026-09-09 19:24:58
R
W
Run
Delete
Rename
class-wp-block-template.php
2.06 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
class-wp-block-templates-registry.php
6.91 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp-block-type-registry.php
5.18 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp-block-type.php
16.82 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp-block.php
27.57 KB
2026-09-09 19:24:58
R
W
Run
Delete
Rename
class-wp-classic-to-block-menu-converter.php
3.93 KB
2026-09-09 19:24:58
R
W
Run
Delete
Rename
class-wp-comment-query.php
47.89 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp-comment.php
16.84 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
class-wp-connector-registry.php
14.83 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp-customize-control.php
25.5 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp-customize-manager.php
198.15 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
class-wp-customize-nav-menus.php
56.67 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp-customize-panel.php
10.45 KB
2026-09-09 19:24:58
R
W
Run
Delete
Rename
class-wp-customize-section.php
10.95 KB
2026-09-09 19:08:36
R
W
Run
Delete
Rename
class-wp-customize-setting.php
29.25 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
class-wp-customize-widgets.php
70.89 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp-date-query.php
35.13 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
class-wp-dependencies.php
16.69 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp-dependency.php
2.59 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp-duotone.php
39.88 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp-editor.php
70.54 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
class-wp-embed.php
15.54 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
class-wp-error.php
7.34 KB
2026-09-09 19:24:58
R
W
Run
Delete
Rename
class-wp-exception.php
253 By
2026-09-09 19:08:36
R
W
Run
Delete
Rename
class-wp-fatal-error-handler.php
7.96 KB
2026-09-09 19:08:36
R
W
Run
Delete
Rename
class-wp-feed-cache-transient.php
3.23 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
class-wp-feed-cache.php
969 By
2026-09-09 19:08:36
R
W
Run
Delete
Rename
class-wp-filter-sentinel.php
760 By
2026-09-09 19:24:58
R
W
Run
Delete
Rename
class-wp-hook.php
17.06 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp-http-cookie.php
7.1 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp-http-curl.php
12.95 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
class-wp-http-encoding.php
6.53 KB
2026-09-09 19:08:36
R
W
Run
Delete
Rename
class-wp-http-ixr-client.php
3.43 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp-http-proxy.php
5.84 KB
2026-09-09 19:08:36
R
W
Run
Delete
Rename
class-wp-http-requests-hooks.php
1.97 KB
2026-09-09 19:08:36
R
W
Run
Delete
Rename
class-wp-http-requests-response.php
4.14 KB
2026-09-09 19:24:58
R
W
Run
Delete
Rename
class-wp-http-response.php
2.91 KB
2026-09-09 19:08:36
R
W
Run
Delete
Rename
class-wp-http-streams.php
16.37 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp-http.php
40.67 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp-icon-collections-registry.php
5.67 KB
2026-09-09 19:24:58
R
W
Run
Delete
Rename
class-wp-icons-registry.php
9.67 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp-image-editor-gd.php
20.25 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp-image-editor-imagick.php
42.44 KB
2026-09-09 19:24:58
R
W
Run
Delete
Rename
class-wp-image-editor.php
17.05 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
class-wp-list-util.php
7.27 KB
2026-09-09 19:08:36
R
W
Run
Delete
Rename
class-wp-locale-switcher.php
6.62 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
class-wp-locale.php
16.45 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
class-wp-matchesmapregex.php
1.79 KB
2026-09-09 19:08:36
R
W
Run
Delete
Rename
class-wp-meta-query.php
29.79 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
class-wp-metadata-lazyloader.php
6.67 KB
2026-09-09 19:08:36
R
W
Run
Delete
Rename
class-wp-navigation-fallback.php
8.98 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
class-wp-network-query.php
19.52 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
class-wp-network.php
12.12 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
class-wp-object-cache.php
17.11 KB
2026-09-09 19:24:58
R
W
Run
Delete
Rename
class-wp-oembed-controller.php
6.74 KB
2026-09-09 19:08:36
R
W
Run
Delete
Rename
class-wp-oembed.php
33.57 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp-paused-extensions-storage.php
4.95 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
class-wp-phpmailer.php
4.25 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp-plugin-dependencies.php
24.62 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
class-wp-post-type.php
29.95 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
class-wp-post.php
8.6 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
class-wp-query.php
160.3 KB
2026-09-09 19:24:58
R
W
Run
Delete
Rename
class-wp-recovery-mode-cookie-service.php
6.72 KB
2026-09-09 19:08:36
R
W
Run
Delete
Rename
class-wp-recovery-mode-email-service.php
10.9 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
class-wp-recovery-mode-key-service.php
4.8 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp-recovery-mode-link-service.php
3.44 KB
2026-09-09 19:24:58
R
W
Run
Delete
Rename
class-wp-recovery-mode.php
11.19 KB
2026-09-09 19:24:58
R
W
Run
Delete
Rename
class-wp-rewrite.php
62.2 KB
2026-09-09 19:24:58
R
W
Run
Delete
Rename
class-wp-role.php
2.46 KB
2026-09-09 19:08:36
R
W
Run
Delete
Rename
class-wp-roles.php
9.11 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp-script-modules.php
39.79 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
class-wp-scripts.php
35.89 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp-session-tokens.php
7.15 KB
2026-09-09 19:08:36
R
W
Run
Delete
Rename
class-wp-simplepie-file.php
3.47 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
class-wp-simplepie-sanitize-kses.php
1.86 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp-site-query.php
30.74 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp-site.php
7.65 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp-speculation-rules.php
7.7 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
class-wp-styles.php
13 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
class-wp-tax-query.php
19.12 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
class-wp-taxonomy.php
18.12 KB
2026-09-09 19:08:36
R
W
Run
Delete
Rename
class-wp-term-query.php
39.8 KB
2026-09-09 19:24:58
R
W
Run
Delete
Rename
class-wp-term.php
5.14 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp-text-diff-renderer-inline.php
979 By
2026-09-09 19:08:36
R
W
Run
Delete
Rename
class-wp-text-diff-renderer-table.php
18.48 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp-textdomain-registry.php
10.24 KB
2026-09-09 19:08:36
R
W
Run
Delete
Rename
class-wp-theme-json-data.php
1.76 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp-theme-json-resolver.php
34.86 KB
2026-09-09 19:24:58
R
W
Run
Delete
Rename
class-wp-theme-json-schema.php
7.19 KB
2026-09-09 19:08:36
R
W
Run
Delete
Rename
class-wp-theme-json.php
216.31 KB
2026-09-09 19:24:58
R
W
Run
Delete
Rename
class-wp-theme.php
64.27 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp-token-map.php
28.35 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp-url-pattern-prefixer.php
4.69 KB
2026-09-09 19:08:36
R
W
Run
Delete
Rename
class-wp-user-meta-session-tokens.php
2.88 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp-user-query.php
43.07 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp-user-request.php
2.29 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp-user.php
22.65 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp-view-config-data.php
28.74 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp-walker.php
12.98 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
class-wp-widget-factory.php
3.26 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp-widget.php
18.02 KB
2026-09-09 19:24:58
R
W
Run
Delete
Rename
class-wp-xmlrpc-server.php
211.2 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wp.php
25.75 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class-wpdb.php
118.59 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
class.wp-dependencies.php
373 By
2026-09-09 19:08:36
R
W
Run
Delete
Rename
class.wp-scripts.php
343 By
2026-09-09 19:08:36
R
W
Run
Delete
Rename
class.wp-styles.php
338 By
2026-09-09 19:08:36
R
W
Run
Delete
Rename
comment-template.php
100.79 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
comment.php
147.1 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
compat-utf8.php
18.93 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
compat.php
21.95 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
connectors.php
32.15 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
cron.php
45.18 KB
2026-09-09 19:24:58
R
W
Run
Delete
Rename
date.php
400 By
2026-09-09 19:08:37
R
W
Run
Delete
Rename
default-constants.php
11.1 KB
2026-09-09 19:08:37
R
W
Run
Delete
Rename
default-filters.php
38.57 KB
2026-09-09 19:24:58
R
W
Run
Delete
Rename
default-widgets.php
2.23 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
deprecated.php
189.43 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
embed-template.php
338 By
2026-09-09 19:08:37
R
W
Run
Delete
Rename
embed.php
38.3 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
error-protection.php
4 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
error_log
154.13 KB
2026-09-15 11:46:20
R
W
Run
Delete
Rename
feed-atom-comments.php
5.38 KB
2026-09-09 19:08:37
R
W
Run
Delete
Rename
feed-atom.php
3.04 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
feed-rdf.php
2.61 KB
2026-09-09 19:08:37
R
W
Run
Delete
Rename
feed-rss.php
1.16 KB
2026-09-09 19:08:37
R
W
Run
Delete
Rename
feed-rss2-comments.php
4.04 KB
2026-09-09 19:08:37
R
W
Run
Delete
Rename
feed-rss2.php
3.71 KB
2026-09-09 19:08:37
R
W
Run
Delete
Rename
feed.php
24.6 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
fonts.php
9.56 KB
2026-09-09 19:24:58
R
W
Run
Delete
Rename
formatting.php
349.27 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
functions.php
288.56 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
functions.wp-scripts.php
20.01 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
functions.wp-styles.php
8.45 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
general-template.php
179.17 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
global-styles-and-settings.php
20.29 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
http.php
28.28 KB
2026-09-09 19:24:58
R
W
Run
Delete
Rename
https-detection.php
5.72 KB
2026-09-09 19:08:37
R
W
Run
Delete
Rename
https-migration.php
4.63 KB
2026-09-09 19:08:37
R
W
Run
Delete
Rename
icons.php
6.19 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
json-schema.php
7.62 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
kses.php
86.42 KB
2026-09-09 19:24:58
R
W
Run
Delete
Rename
l10n.php
69.74 KB
2026-09-09 19:24:58
R
W
Run
Delete
Rename
link-template.php
156.39 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
load.php
55.15 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
locale.php
162 By
2026-09-09 19:08:38
R
W
Run
Delete
Rename
media-template.php
64.22 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
media.php
231.25 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
meta.php
65.17 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
ms-blogs.php
25.71 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
ms-default-constants.php
4.81 KB
2026-09-09 19:08:38
R
W
Run
Delete
Rename
ms-default-filters.php
6.48 KB
2026-09-09 19:08:38
R
W
Run
Delete
Rename
ms-deprecated.php
21.28 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
ms-files.php
2.79 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
ms-functions.php
90.36 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
ms-load.php
19.58 KB
2026-09-09 19:24:58
R
W
Run
Delete
Rename
ms-network.php
3.69 KB
2026-09-09 19:08:38
R
W
Run
Delete
Rename
ms-settings.php
4.1 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
ms-site.php
40.75 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
nav-menu-template.php
25.37 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
nav-menu.php
43.23 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
option.php
102.78 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
pluggable-deprecated.php
6.18 KB
2026-09-09 19:08:38
R
W
Run
Delete
Rename
pluggable.php
124.92 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
plugin.php
35.81 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
post-formats.php
6.9 KB
2026-09-09 19:24:58
R
W
Run
Delete
Rename
post-template.php
67.51 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
post-thumbnail-template.php
10.62 KB
2026-09-09 19:08:38
R
W
Run
Delete
Rename
post.php
298.06 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
query.php
36.67 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
registration-functions.php
200 By
2026-09-09 19:08:38
R
W
Run
Delete
Rename
registration.php
200 By
2026-09-09 19:08:38
R
W
Run
Delete
Rename
rest-api.php
100.54 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
revision.php
30.51 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
rewrite.php
19.11 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
robots-template.php
5.06 KB
2026-09-09 19:08:38
R
W
Run
Delete
Rename
rss-functions.php
277 By
2026-09-09 19:24:56
R
W
Run
Delete
Rename
rss.php
22.66 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
script-loader.php
159.72 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
script-modules.php
12.02 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
session.php
258 By
2026-09-09 19:08:38
R
W
Run
Delete
Rename
shortcodes.php
23.47 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
sitemaps.php
3.16 KB
2026-09-09 19:08:38
R
W
Run
Delete
Rename
speculative-loading.php
11.6 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
spl-autoload-compat.php
441 By
2026-09-09 19:08:38
R
W
Run
Delete
Rename
style-engine.php
7.86 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
taxonomy.php
174.13 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
template-canvas.php
544 By
2026-09-09 19:08:38
R
W
Run
Delete
Rename
template-loader.php
4.17 KB
2026-09-09 19:24:58
R
W
Run
Delete
Rename
template.php
35.96 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
theme-i18n.json
1.85 KB
2026-09-09 19:24:58
R
W
Run
Delete
Rename
theme-previews.php
2.82 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
theme-templates.php
3.96 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
theme.json
9.26 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
theme.php
131.49 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
update.php
37.37 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
user.php
176.08 KB
2026-09-09 19:24:58
R
W
Run
Delete
Rename
utf8.php
6.81 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
vars.php
6.45 KB
2026-09-09 19:24:57
R
W
Run
Delete
Rename
version.php
1.08 KB
2026-09-09 19:24:59
R
W
Run
Delete
Rename
view-config.php
18.64 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
view-transitions.php
602 By
2026-09-09 19:24:57
R
W
Run
Delete
Rename
widgets.php
69.21 KB
2026-09-09 19:24:56
R
W
Run
Delete
Rename
wp-db.php
445 By
2026-09-09 19:08:38
R
W
Run
Delete
Rename
wp-diff.php
792 By
2026-09-09 19:24:56
R
W
Run
Delete
Rename
error_log
up
📄
abilities-api.php
Save
<?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 to clients such as 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( * 'public' => 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, * ), * 'public' => 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' ); * } * * ### Client Exposure * * Set the high-level `public` flag to make an ability available to clients * such as the REST API, MCP, or AI agents: * * 'meta' => array( * 'public' => true, * ), * * The `public` flag seeds the default for each per-channel flag. For the REST * API it seeds `show_in_rest`, which lets the ability be invoked via HTTP * requests. Set a per-channel flag directly to override that default. For * example, keep a public ability out of the REST API: * * 'meta' => array( * 'public' => true, * 'show_in_rest' => false, * ), * * @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 $public Optional. Whether the ability is meant to be available to * clients such as the REST API, MCP, or AI agents. Seeds * the default for per-channel flags like `$show_in_rest`. * Defaults to false. * @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 is the value of `$public` when set, false otherwise. * } * @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 registered abilities, optionally filtered by the given arguments. * * When called without arguments, returns all registered abilities. When called * with an $args array, returns only abilities that match every specified condition. * * Filtering pipeline (executed in order): * * 1. Declarative filters (`category`, `namespace`, `meta`) — per-item, AND logic between * arg types. * 2. `item_include_callback` — per-item, caller-scoped. Return true to include, false to exclude. * 3. `wp_get_abilities_item_include` filter — per-item, ecosystem-scoped. Plugins can enforce * universal inclusion rules regardless of what the caller passed. * 4. `result_callback` — on the full matched array, caller-scoped. Sort, slice, or reshape. * 5. `wp_get_abilities_result` filter — on the full array, ecosystem-scoped. * * Steps 1–3 run inside a single loop over the registry — no extra iteration. * * Examples: * * // All abilities (unchanged behaviour). * $abilities = wp_get_abilities(); * * // Filter by category. * $abilities = wp_get_abilities( array( 'category' => 'content' ) ); * * // Filter by namespace. * $abilities = wp_get_abilities( array( 'namespace' => 'woocommerce' ) ); * * // Filter by meta. * $abilities = wp_get_abilities( array( 'meta' => array( 'show_in_rest' => true ) ) ); * * // Combine filters (AND logic between arg types). * $abilities = wp_get_abilities( array( * 'category' => 'content', * 'namespace' => 'core', * 'meta' => array( 'show_in_rest' => true ), * ) ); * * // Caller-scoped per-item callback. * $abilities = wp_get_abilities( array( * 'item_include_callback' => function ( WP_Ability $ability ) { * return current_user_can( 'manage_options' ); * }, * ) ); * * // Caller-scoped result callback (sort + paginate). * $abilities = wp_get_abilities( array( * 'result_callback' => function ( array $abilities ) { * usort( $abilities, fn( $a, $b ) => strcasecmp( $a->get_label(), $b->get_label() ) ); * return array_slice( $abilities, 0, 10 ); * }, * ) ); * * The pipeline always runs, even when called with no arguments. This ensures that the * `wp_get_abilities_item_include` and `wp_get_abilities_result` filters always fire, * giving plugins a reliable place to enforce universal inclusion or shaping rules. * For raw, unfiltered registry data that bypasses the filter pipeline entirely, use * {@see WP_Abilities_Registry::get_all_registered()} directly. * * @since 6.9.0 * @since 7.1.0 Added the `$args` parameter for filtering support. * * @see WP_Abilities_Registry::get_all_registered() * * @param array $args { * Optional. Arguments to filter the returned abilities. Default empty array (returns all). * * @type string $category Filter by category slug. Only abilities whose category * exactly matches the given slug are included. * @type string $namespace Filter by ability namespace prefix. Pass the namespace * without a trailing slash, e.g. `'woocommerce'` matches * `'woocommerce/create-order'`. * @type array $meta Filter by meta key/value pairs. All conditions must * match (AND logic). Supports nested arrays for structured * meta, e.g. `array( 'mcp' => array( 'public' => true ) )`. * @type callable $item_include_callback Optional. A callback invoked per ability after declarative * filters. Receives a WP_Ability instance, returns bool. * Return true to include, false to exclude. * @type callable $result_callback Optional. A callback invoked once on the full matched * array. Receives WP_Ability[], must return WP_Ability[]. * Use for sorting, slicing, or reshaping the result. * } * @return WP_Ability[] An array of registered WP_Ability instances matching the given args, * keyed by ability name. Returns an empty array if no abilities are * registered, the registry is unavailable, or no abilities match the * given args. */ function wp_get_abilities( array $args = array() ): array { $registry = WP_Abilities_Registry::get_instance(); if ( null === $registry ) { return array(); } $abilities = $registry->get_all_registered(); $category = isset( $args['category'] ) && is_string( $args['category'] ) ? $args['category'] : ''; $namespace = isset( $args['namespace'] ) && is_string( $args['namespace'] ) ? rtrim( $args['namespace'], '/' ) . '/' : ''; $meta = isset( $args['meta'] ) && is_array( $args['meta'] ) ? $args['meta'] : array(); $item_include_callback = isset( $args['item_include_callback'] ) && is_callable( $args['item_include_callback'] ) ? $args['item_include_callback'] : null; $result_callback = isset( $args['result_callback'] ) && is_callable( $args['result_callback'] ) ? $args['result_callback'] : null; $matched = array(); foreach ( $abilities as $name => $ability ) { // Step 1a: Filter by category. if ( '' !== $category && $ability->get_category() !== $category ) { continue; } // Step 1b: Filter by namespace prefix. if ( '' !== $namespace && ! str_starts_with( $ability->get_name(), $namespace ) ) { continue; } // Step 1c: Filter by meta key/value pairs (AND logic, supports nested arrays). if ( ! empty( $meta ) && ! _wp_get_abilities_match_meta( $ability->get_meta(), $meta ) ) { continue; } // Step 2: Caller-scoped per-item callback. $include = true; if ( null !== $item_include_callback ) { $include = (bool) call_user_func( $item_include_callback, $ability ); } /** * Filters whether an individual ability should be included in the result set. * * Fires after the declarative filters and the caller-scoped item_include_callback. * Plugins can use this to enforce universal inclusion rules regardless of * what the caller passed in $args. * * @since 7.1.0 * * @param bool $include Whether to include the ability. Default true (after declarative filters pass). * @param WP_Ability $ability The ability instance being evaluated. * @param array $args The full $args array passed to wp_get_abilities(). */ $include = (bool) apply_filters( 'wp_get_abilities_item_include', $include, $ability, $args ); if ( $include ) { $matched[ $name ] = $ability; } } // Step 4: Caller-scoped result callback. if ( null !== $result_callback ) { $matched = (array) call_user_func( $result_callback, $matched ); } /** * Filters the full list of matched abilities after all per-item filtering is complete. * * Fires after the caller-scoped result_callback. Plugins can use this to sort, * paginate, or reshape the final result set universally. * * @since 7.1.0 * * @param WP_Ability[] $matched The matched abilities after all filtering. * @param array $args The full $args array passed to wp_get_abilities(). */ return (array) apply_filters( 'wp_get_abilities_result', $matched, $args ); } /** * Checks whether an ability's meta array matches a set of required key/value conditions. * * All conditions must match (AND logic). Supports nested arrays for structured meta, * e.g. `array( 'mcp' => array( 'public' => true ) )`. * * @since 7.1.0 * @access private * * @param array $meta The ability's meta array. * @param array $conditions The required key/value conditions to match against. * @return bool True if all conditions match, false otherwise. */ function _wp_get_abilities_match_meta( array $meta, array $conditions ): bool { foreach ( $conditions as $key => $value ) { if ( ! array_key_exists( $key, $meta ) ) { return false; } if ( is_array( $value ) ) { if ( ! is_array( $meta[ $key ] ) || ! _wp_get_abilities_match_meta( $meta[ $key ], $value ) ) { return false; } } elseif ( $meta[ $key ] !== $value ) { return false; } } return true; } /** * 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(); }