- Timestamp:
- 04/30/2026 12:16:22 PM (8 weeks ago)
- Location:
- trunk
- Files:
-
- 3 edited
-
src/wp-includes/class-wp-connector-registry.php (modified) (3 diffs)
-
src/wp-includes/connectors.php (modified) (3 diffs)
-
tests/phpunit/tests/connectors/wpConnectorRegistry.php (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/wp-includes/class-wp-connector-registry.php
r62210 r62288 41 41 * }, 42 42 * plugin?: array{ 43 * file: non-empty-string 43 * file: non-empty-string, 44 * is_active?: callable(): bool 44 45 * } 45 46 * } … … 110 111 * Optional. Plugin data for install/activate UI. 111 112 * 112 * @type string $file The plugin's main file path relative to the plugins 113 * directory (e.g. 'my-plugin/my-plugin.php' or 'hello.php'). 113 * @type string $file Optional. The plugin's main file path relative to the 114 * plugins directory (e.g. 'my-plugin/my-plugin.php' or 115 * 'hello.php'). 116 * @type callable $is_active Optional callback to determine whether the plugin 117 * is active. Receives no arguments and must return bool. 118 * Defaults to `__return_true`. 114 119 * } 115 120 * } … … 244 249 } 245 250 246 if ( ! empty( $args['plugin'] ) && is_array( $args['plugin'] ) && ! empty( $args['plugin']['file'] ) ) { 247 $connector['plugin'] = array( 'file' => $args['plugin']['file'] ); 251 $connector['plugin'] = array(); 252 253 if ( ! empty( $args['plugin'] ) && is_array( $args['plugin'] ) ) { 254 if ( ! empty( $args['plugin']['file'] ) ) { 255 $connector['plugin']['file'] = $args['plugin']['file']; 256 } 257 258 if ( isset( $args['plugin']['is_active'] ) ) { 259 if ( ! is_callable( $args['plugin']['is_active'] ) ) { 260 _doing_it_wrong( 261 __METHOD__, 262 /* translators: %s: Connector ID. */ 263 sprintf( __( 'Connector "%s" plugin is_active must be callable.' ), esc_html( $id ) ), 264 '7.0.0' 265 ); 266 return null; 267 } 268 269 $connector['plugin']['is_active'] = $args['plugin']['is_active']; 270 } 271 } 272 273 if ( ! isset( $connector['plugin']['is_active'] ) ) { 274 $connector['plugin']['is_active'] = '__return_true'; 248 275 } 249 276 -
trunk/src/wp-includes/connectors.php
r62210 r62288 368 368 } 369 369 } 370 371 if ( ! isset( $args['plugin']['is_active'] ) ) { 372 $args['plugin']['is_active'] = static function () use ( $ai_registry, $id ): bool { 373 try { 374 return $ai_registry->hasProvider( $id ); 375 } catch ( Exception $e ) { 376 return false; 377 } 378 }; 379 } 380 370 381 $registry->register( $id, $args ); 371 382 } … … 639 650 $registry = AiClient::defaultRegistry(); 640 651 641 if ( ! function_exists( 'is_plugin_active' ) ) {642 require_once ABSPATH . 'wp-admin/includes/plugin.php';643 }644 645 652 $connectors = array(); 646 653 foreach ( wp_get_connectors() as $connector_id => $connector_data ) { … … 675 682 if ( ! empty( $connector_data['plugin']['file'] ) ) { 676 683 $file = $connector_data['plugin']['file']; 677 $is_ installed = file_exists( wp_normalize_path( WP_PLUGIN_DIR . '/' . $file ));678 $is_ activated = $is_installed && is_plugin_active( $file);684 $is_activated = (bool) call_user_func( $connector_data['plugin']['is_active'] ); 685 $is_installed = $is_activated || file_exists( wp_normalize_path( WP_PLUGIN_DIR . '/' . $file ) ); 679 686 680 687 $connector_out['plugin'] = array( -
trunk/tests/phpunit/tests/connectors/wpConnectorRegistry.php
r62192 r62288 300 300 301 301 $this->assertArrayHasKey( 'plugin', $result ); 302 $this->assertSame( array( 'file' => 'my-plugin/my-plugin.php' ), $result['plugin'] ); 303 } 304 305 /** 306 * @ticket 64791 307 */ 308 public function test_register_omits_plugin_when_not_provided() { 302 $this->assertSame( 'my-plugin/my-plugin.php', $result['plugin']['file'] ); 303 } 304 305 /** 306 * @ticket 65020 307 */ 308 public function test_register_stores_plugin_is_active_callback() { 309 $args = self::$default_args; 310 $args['plugin'] = array( 311 'file' => 'my-plugin/my-plugin.php', 312 'is_active' => '__return_true', 313 ); 314 315 $result = $this->registry->register( 'with-callback', $args ); 316 317 $this->assertIsArray( $result ); 318 $this->assertArrayHasKey( 'is_active', $result['plugin'] ); 319 $this->assertIsCallable( $result['plugin']['is_active'] ); 320 } 321 322 /** 323 * @ticket 65020 324 */ 325 public function test_register_rejects_non_callable_plugin_is_active() { 326 $this->setExpectedIncorrectUsage( 'WP_Connector_Registry::register' ); 327 328 $args = self::$default_args; 329 $args['plugin'] = array( 330 'file' => 'my-plugin/my-plugin.php', 331 'is_active' => 'not_a_real_function_name', 332 ); 333 334 $result = $this->registry->register( 'bad-callback', $args ); 335 336 $this->assertNull( $result ); 337 } 338 339 /** 340 * @ticket 65020 341 */ 342 public function test_register_defaults_plugin_is_active_to_return_true() { 343 $args = self::$default_args; 344 $args['plugin'] = array( 'file' => 'my-plugin/my-plugin.php' ); 345 346 $result = $this->registry->register( 'default-callback', $args ); 347 348 $this->assertIsArray( $result ); 349 $this->assertArrayHasKey( 'is_active', $result['plugin'] ); 350 $this->assertSame( '__return_true', $result['plugin']['is_active'] ); 351 } 352 353 /** 354 * @ticket 64791 355 */ 356 public function test_register_defaults_plugin_when_not_provided() { 309 357 $result = $this->registry->register( 'no-plugin', self::$default_args ); 310 358 311 $this->assertArrayNotHasKey( 'plugin', $result ); 359 $this->assertArrayHasKey( 'plugin', $result ); 360 $this->assertArrayNotHasKey( 'file', $result['plugin'] ); 361 $this->assertSame( '__return_true', $result['plugin']['is_active'] ); 312 362 } 313 363
Note: See TracChangeset
for help on using the changeset viewer.