PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.1-beta.3
Jetpack – WP Security, Backup, Speed, & Growth v16.1-beta.3
16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / jetpack_vendor / automattic / jetpack-wp-abilities / src / class-registrar.php
jetpack / jetpack_vendor / automattic / jetpack-wp-abilities / src Last commit date
class-registrar.php 1 month ago
class-registrar.php
184 lines
1 <?php
2 /**
3 * Abstract base class for registering a category and its abilities with the
4 * WordPress Abilities API.
5 *
6 * @package automattic/jetpack-wp-abilities
7 */
8
9 // @phan-file-suppress PhanAbstractStaticMethodCallInStatic -- static:: dispatches to the concrete subclass for the three abstract getters; callers must not instantiate Registrar itself.
10
11 namespace Automattic\Jetpack\WP_Abilities;
12
13 /**
14 * Abstract base class that owns the boilerplate every Jetpack abilities
15 * registrar needs: hooking into the Abilities API lifecycle actions (or
16 * calling the registration methods directly when those actions have already
17 * fired), and guarding the Abilities API function calls so the class is safe
18 * to load on WP < 6.9.
19 *
20 * Consumers extend this class and override `get_category_slug()`,
21 * `get_category_definition()`, and `get_abilities()`.
22 */
23 abstract class Registrar {
24
25 const PACKAGE_VERSION = '0.1.5';
26
27 /**
28 * Action fired by the Abilities API when ability categories should register.
29 */
30 const CATEGORIES_INIT_ACTION = 'wp_abilities_api_categories_init';
31
32 /**
33 * Action fired by the Abilities API when abilities should register.
34 */
35 const ABILITIES_INIT_ACTION = 'wp_abilities_api_init';
36
37 /**
38 * Return the category slug this registrar owns (e.g. "jetpack-forms").
39 *
40 * @return string
41 */
42 abstract public static function get_category_slug(): string;
43
44 /**
45 * Return the category definition passed to `wp_register_ability_category()`.
46 *
47 * Expected shape: [ 'label' => string, 'description' => string ].
48 *
49 * @return array
50 */
51 abstract public static function get_category_definition(): array;
52
53 /**
54 * Return the abilities this registrar owns as a `[ slug => spec ]` map.
55 *
56 * Each spec is passed as-is to `wp_register_ability()`. If a spec omits
57 * `category`, the registrar auto-injects `get_category_slug()`. If the spec
58 * sets `category` explicitly, it is preserved unchanged.
59 *
60 * @return array<string, array>
61 */
62 abstract public static function get_abilities(): array;
63
64 /**
65 * Wire up the Abilities API registrations.
66 *
67 * Gated behind the `jetpack_wp_abilities_enabled` filter, which defaults
68 * to `false`. Consumers opt in explicitly — per site, per user, or via
69 * feature flag — so abilities roll out gradually rather than flipping on
70 * for every site the moment the package loads.
71 *
72 * When the filter returns `true`, each of the two Abilities API lifecycle
73 * actions either gets a registration callback hooked, or — if the action
74 * has already fired — dispatches immediately so late-loading plugins
75 * still register on time.
76 *
77 * @return void
78 */
79 public static function init() {
80 /**
81 * Filters whether Jetpack Abilities API registration should run.
82 *
83 * Default `false`. Return `true` to enable registration for this
84 * request, typically gated on a site option, user capability, or
85 * feature flag to support staged rollout.
86 *
87 * @since 0.1.0
88 *
89 * @param bool $enabled Whether to register abilities. Default false.
90 */
91 if ( ! apply_filters( 'jetpack_wp_abilities_enabled', false ) ) {
92 return;
93 }
94
95 if ( did_action( self::CATEGORIES_INIT_ACTION ) ) {
96 static::register_category();
97 } else {
98 add_action( self::CATEGORIES_INIT_ACTION, array( static::class, 'register_category' ) );
99 }
100
101 if ( did_action( self::ABILITIES_INIT_ACTION ) ) {
102 static::register_abilities();
103 } else {
104 add_action( self::ABILITIES_INIT_ACTION, array( static::class, 'register_abilities' ) );
105 }
106 }
107
108 /**
109 * Register the category with the WordPress Abilities API.
110 *
111 * Safe to call directly or as a hook callback. Passes the category slug
112 * through the `jetpack_wp_abilities_should_register` filter so consumers
113 * can gate registration per-site, per-user, or per-feature-flag.
114 *
115 * @return void
116 */
117 public static function register_category() {
118 if ( ! function_exists( 'wp_register_ability_category' ) ) {
119 return;
120 }
121
122 $slug = static::get_category_slug();
123 if ( ! self::should_register( 'category', $slug ) ) {
124 return;
125 }
126
127 wp_register_ability_category( $slug, static::get_category_definition() );
128 }
129
130 /**
131 * Register every ability returned by `get_abilities()`.
132 *
133 * Safe to call directly or as a hook callback. Each ability slug is
134 * passed through the `jetpack_wp_abilities_should_register` filter
135 * individually, so consumers can enable a subset of abilities on a
136 * subset of sites or users.
137 *
138 * @return void
139 */
140 public static function register_abilities() {
141 if ( ! function_exists( 'wp_register_ability' ) ) {
142 return;
143 }
144
145 $category_slug = static::get_category_slug();
146
147 foreach ( static::get_abilities() as $slug => $spec ) {
148 if ( ! self::should_register( 'ability', $slug ) ) {
149 continue;
150 }
151 if ( ! array_key_exists( 'category', $spec ) ) {
152 $spec['category'] = $category_slug;
153 }
154 wp_register_ability( $slug, $spec );
155 }
156 }
157
158 /**
159 * Apply the shared registration filter.
160 *
161 * @param string $type One of 'category' or 'ability'.
162 * @param string $slug The slug being registered.
163 * @return bool True when registration should proceed, false to skip.
164 */
165 private static function should_register( string $type, string $slug ): bool {
166 /**
167 * Filters whether an Abilities API category or ability should be registered.
168 *
169 * Returning false from any filter callback skips the registration,
170 * which is how consumers gate rollout per-site, per-user, or per
171 * feature flag. The filter fires once per category and once per
172 * individual ability, so callbacks can allow-list or deny-list by
173 * `$slug`.
174 *
175 * @since 0.1.0
176 *
177 * @param bool $enabled Whether to register. Default true.
178 * @param string $type Either 'category' or 'ability'.
179 * @param string $slug The category or ability slug being registered.
180 */
181 return (bool) apply_filters( 'jetpack_wp_abilities_should_register', true, $type, $slug );
182 }
183 }
184