close

Make WordPress Core

Changeset 61983


Ignore:
Timestamp:
03/12/2026 07:54:50 AM (35 hours ago)
Author:
gziolo
Message:

Connectors: Remove redundant helper and improve PHPDoc

Remove _wp_connectors_get_connector_settings() and inline ksort()
into _wp_connectors_get_connector_script_module_data(). Expand
@return and @phpstan-return array shapes for wp_get_connector()
and wp_get_connectors(). Make logo_url and credentials_url truly
optional. Rename test class to wpGetConnectors.

Developed in https://github.com/WordPress/wordpress-develop/pull/11227.

Follow-up to [61943].

Props gziolo, westonruter.
Fixes #64791.

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/class-wp-connector-registry.php

    r61943 r61983  
    1717 *
    1818 * @phpstan-type Connector array{
    19  *     name: string,
    20  *     description: string,
    21  *     logo_url?: string|null,
    22  *     type: string,
     19 *     name: non-empty-string,
     20 *     description: non-empty-string,
     21 *     logo_url?: non-empty-string,
     22 *     type: 'ai_provider',
    2323 *     authentication: array{
    24  *         method: string,
    25  *         credentials_url?: string|null,
    26  *         setting_name?: string
     24 *         method: 'api_key'|'none',
     25 *         credentials_url?: non-empty-string,
     26 *         setting_name?: non-empty-string
    2727 *     },
    2828 *     plugin?: array{
    29  *         slug: string
     29 *         slug: non-empty-string
    3030 *     }
    3131 * }
     
    6363     *     @type string $name           Required. The connector's display name.
    6464     *     @type string $description    Optional. The connector's description. Default empty string.
    65      *     @type string|null $logo_url  Optional. URL to the connector's logo image. Default null.
     65     *     @type string $logo_url       Optional. URL to the connector's logo image.
    6666     *     @type string $type           Required. The connector type. Currently, only 'ai_provider' is supported.
    6767     *     @type array  $authentication {
    6868     *         Required. Authentication configuration.
    6969     *
    70      *         @type string      $method          Required. The authentication method: 'api_key' or 'none'.
    71      *         @type string|null $credentials_url Optional. URL where users can obtain API credentials.
     70     *         @type string $method          Required. The authentication method: 'api_key' or 'none'.
     71     *         @type string $credentials_url Optional. URL where users can obtain API credentials.
    7272     *     }
    73      *     @type array  $plugin {
     73     *     @type array  $plugin         {
    7474     *         Optional. Plugin data for install/activate UI.
    7575     *
     
    159159
    160160        if ( 'api_key' === $args['authentication']['method'] ) {
    161             $connector['authentication']['credentials_url'] = $args['authentication']['credentials_url'] ?? null;
    162             $connector['authentication']['setting_name']    = "connectors_ai_{$id}_api_key";
     161            if ( ! empty( $args['authentication']['credentials_url'] ) && is_string( $args['authentication']['credentials_url'] ) ) {
     162                $connector['authentication']['credentials_url'] = $args['authentication']['credentials_url'];
     163            }
     164            $connector['authentication']['setting_name'] = "connectors_ai_{$id}_api_key";
    163165        }
    164166
     
    207209     * @see wp_get_connectors()
    208210     *
    209      * @return array<string, array> The array of registered connectors keyed by connector ID.
     211     * @return array Connector settings keyed by connector ID.
     212     *
    210213     * @phpstan-return array<string, Connector>
    211214     */
  • trunk/src/wp-includes/connectors.php

    r61943 r61983  
    3838 *
    3939 * @param string $id The connector identifier.
    40  * @return array|null The registered connector data, or null if not registered.
     40 * @return array|null {
     41 *     Connector data, or null if not registered.
     42 *
     43 *     @type string $name           The connector's display name.
     44 *     @type string $description    The connector's description.
     45 *     @type string $logo_url       Optional. URL to the connector's logo image.
     46 *     @type string $type           The connector type. Currently, only 'ai_provider' is supported.
     47 *     @type array  $authentication {
     48 *         Authentication configuration. When method is 'api_key', includes
     49 *         credentials_url and setting_name. When 'none', only method is present.
     50 *
     51 *         @type string $method          The authentication method: 'api_key' or 'none'.
     52 *         @type string $credentials_url Optional. URL where users can obtain API credentials.
     53 *         @type string $setting_name    Optional. The setting name for the API key.
     54 *     }
     55 *     @type array  $plugin         {
     56 *         Optional. Plugin data for install/activate UI.
     57 *
     58 *         @type string $slug The WordPress.org plugin slug.
     59 *     }
     60 * }
     61 * @phpstan-return ?array{
     62 *     name: non-empty-string,
     63 *     description: non-empty-string,
     64 *     logo_url?: non-empty-string,
     65 *     type: 'ai_provider',
     66 *     authentication: array{
     67 *         method: 'api_key'|'none',
     68 *         credentials_url?: non-empty-string,
     69 *         setting_name?: non-empty-string
     70 *     },
     71 *     plugin?: array{
     72 *         slug: non-empty-string
     73 *     }
     74 * }
    4175 */
    4276function wp_get_connector( string $id ): ?array {
     
    5690 * @see WP_Connector_Registry::get_all_registered()
    5791 *
    58  * @return array[] An array of registered connectors keyed by connector ID.
     92 * @return array {
     93 *     Connector settings keyed by connector ID.
     94 *
     95 *     @type array ...$0 {
     96 *         Data for a single connector.
     97 *
     98 *         @type string      $name           The connector's display name.
     99 *         @type string      $description    The connector's description.
     100 *         @type string      $logo_url       Optional. URL to the connector's logo image.
     101 *         @type string      $type           The connector type. Currently, only 'ai_provider' is supported.
     102 *         @type array       $authentication {
     103 *             Authentication configuration. When method is 'api_key', includes
     104 *             credentials_url and setting_name. When 'none', only method is present.
     105 *
     106 *             @type string $method          The authentication method: 'api_key' or 'none'.
     107 *             @type string $credentials_url Optional. URL where users can obtain API credentials.
     108 *             @type string $setting_name    Optional. The setting name for the API key.
     109 *         }
     110 *         @type array       $plugin         {
     111 *             Optional. Plugin data for install/activate UI.
     112 *
     113 *             @type string $slug The WordPress.org plugin slug.
     114 *         }
     115 *     }
     116 * }
     117 * @phpstan-return array<string, array{
     118 *     name: non-empty-string,
     119 *     description: non-empty-string,
     120 *     logo_url?: non-empty-string,
     121 *     type: 'ai_provider',
     122 *     authentication: array{
     123 *         method: 'api_key'|'none',
     124 *         credentials_url?: non-empty-string,
     125 *         setting_name?: non-empty-string
     126 *     },
     127 *     plugin?: array{
     128 *         slug: non-empty-string
     129 *     }
     130 * }>
    59131 */
    60132function wp_get_connectors(): array {
     
    326398
    327399/**
    328  * Gets the registered connector settings.
    329  *
    330  * @since 7.0.0
    331  * @access private
    332  *
    333  * @return array {
    334  *     Connector settings keyed by connector ID.
    335  *
    336  *     @type array ...$0 {
    337  *         Data for a single connector.
    338  *
    339  *         @type string $name           The connector's display name.
    340  *         @type string $description    The connector's description.
    341  *         @type string $type           The connector type. Currently, only 'ai_provider' is supported.
    342  *         @type array  $plugin         Optional. Plugin data for install/activate UI.
    343  *             @type string $slug       The WordPress.org plugin slug.
    344  *         }
    345  *         @type array  $authentication {
    346  *             Authentication configuration. When method is 'api_key', includes
    347  *             credentials_url and setting_name. When 'none', only method is present.
    348  *
    349  *             @type string      $method          The authentication method: 'api_key' or 'none'.
    350  *             @type string|null $credentials_url Optional. URL where users can obtain API credentials.
    351  *             @type string      $setting_name    Optional. The setting name for the API key.
    352  *         }
    353  *     }
    354  * }
    355  */
    356 function _wp_connectors_get_connector_settings(): array {
    357     $connectors = wp_get_connectors();
    358     ksort( $connectors );
    359     return $connectors;
    360 }
    361 
    362 /**
    363400 * Validates connector API keys in the REST response when explicitly requested.
    364401 *
     
    397434    }
    398435
    399     foreach ( _wp_connectors_get_connector_settings() as $connector_id => $connector_data ) {
     436    foreach ( wp_get_connectors() as $connector_id => $connector_data ) {
    400437        $auth = $connector_data['authentication'];
    401438        if ( 'ai_provider' !== $connector_data['type'] || 'api_key' !== $auth['method'] || empty( $auth['setting_name'] ) ) {
     
    432469    $ai_registry = AiClient::defaultRegistry();
    433470
    434     foreach ( _wp_connectors_get_connector_settings() as $connector_id => $connector_data ) {
     471    foreach ( wp_get_connectors() as $connector_id => $connector_data ) {
    435472        $auth = $connector_data['authentication'];
    436473        if ( 'ai_provider' !== $connector_data['type'] || 'api_key' !== $auth['method'] || empty( $auth['setting_name'] ) ) {
     
    486523    try {
    487524        $ai_registry = AiClient::defaultRegistry();
    488         foreach ( _wp_connectors_get_connector_settings() as $connector_id => $connector_data ) {
     525        foreach ( wp_get_connectors() as $connector_id => $connector_data ) {
    489526            if ( 'ai_provider' !== $connector_data['type'] ) {
    490527                continue;
     
    522559 * @access private
    523560 *
    524  * @param array $data Existing script module data.
    525  * @return array Script module data with connectors added.
     561 * @param array<string, mixed> $data Existing script module data.
     562 * @return array<string, mixed> Script module data with connectors added.
    526563 */
    527564function _wp_connectors_get_connector_script_module_data( array $data ): array {
    528565    $connectors = array();
    529     foreach ( _wp_connectors_get_connector_settings() as $connector_id => $connector_data ) {
     566    foreach ( wp_get_connectors() as $connector_id => $connector_data ) {
    530567        $auth     = $connector_data['authentication'];
    531568        $auth_out = array( 'method' => $auth['method'] );
     
    549586        $connectors[ $connector_id ] = $connector_out;
    550587    }
     588    ksort( $connectors );
    551589    $data['connectors'] = $connectors;
    552590    return $data;
  • trunk/tests/phpunit/tests/connectors/wpConnectorsGetConnectorSettings.php

    r61943 r61983  
    44
    55/**
    6  * Tests for _wp_connectors_get_connector_settings().
     6 * Tests for wp_get_connectors().
    77 *
    88 * @group connectors
    9  * @covers ::_wp_connectors_get_connector_settings
     9 * @covers ::wp_get_connectors
    1010 */
    11 class Tests_Connectors_WpConnectorsGetConnectorSettings extends WP_UnitTestCase {
     11class Tests_Connectors_WpGetConnectors extends WP_UnitTestCase {
    1212
    1313    use WP_AI_Client_Mock_Provider_Trait;
     
    1616     * Registers the mock provider once before any tests in this class run.
    1717     */
    18     public static function set_up_before_class() {
     18    public static function set_up_before_class(): void {
    1919        parent::set_up_before_class();
    2020        self::register_mock_connectors_provider();
     
    2424     * Unregisters the mock provider setting added by `init`.
    2525     */
    26     public static function tear_down_after_class() {
     26    public static function tear_down_after_class(): void {
    2727        self::unregister_mock_connector_setting();
    2828        parent::tear_down_after_class();
     
    3232     * @ticket 64730
    3333     */
    34     public function test_returns_expected_connector_keys() {
    35         $connectors = _wp_connectors_get_connector_settings();
     34    public function test_returns_expected_connector_keys(): void {
     35        $connectors = wp_get_connectors();
    3636
    3737        $this->assertArrayHasKey( 'google', $connectors );
     
    4545     * @ticket 64730
    4646     */
    47     public function test_each_connector_has_required_fields() {
    48         $connectors = _wp_connectors_get_connector_settings();
     47    public function test_each_connector_has_required_fields(): void {
     48        $connectors = wp_get_connectors();
    4949
    5050        $this->assertNotEmpty( $connectors, 'Connector settings should not be empty.' );
     
    6868     * @ticket 64730
    6969     */
    70     public function test_api_key_connectors_have_setting_name_and_credentials_url() {
    71         $connectors    = _wp_connectors_get_connector_settings();
     70    public function test_api_key_connectors_have_setting_name_and_credentials_url(): void {
     71        $connectors    = wp_get_connectors();
    7272        $api_key_count = 0;
    7373
     
    8282            $this->assertSame(
    8383                "connectors_ai_{$connector_id}_api_key",
    84                 $connector_data['authentication']['setting_name'],
     84                $connector_data['authentication']['setting_name'] ?? null,
    8585                "Connector '{$connector_id}' setting_name does not match expected format."
    8686            );
    87             $this->assertArrayHasKey( 'credentials_url', $connector_data['authentication'], "Connector '{$connector_id}' authentication is missing 'credentials_url'." );
    8887        }
    8988
     
    9493     * @ticket 64730
    9594     */
    96     public function test_featured_provider_names_match_expected() {
    97         $connectors = _wp_connectors_get_connector_settings();
     95    public function test_featured_provider_names_match_expected(): void {
     96        $connectors = wp_get_connectors();
    9897
    9998        $this->assertSame( 'Google', $connectors['google']['name'] );
     
    105104     * @ticket 64730
    106105     */
    107     public function test_includes_registered_provider_from_registry() {
    108         $connectors = _wp_connectors_get_connector_settings();
     106    public function test_includes_registered_provider_from_registry(): void {
     107        $connectors = wp_get_connectors();
    109108        $mock       = $connectors['mock_connectors_test'];
    110109
     
    113112        $this->assertSame( 'ai_provider', $mock['type'] );
    114113        $this->assertSame( 'api_key', $mock['authentication']['method'] );
    115         $this->assertNull( $mock['authentication']['credentials_url'] );
    116         $this->assertSame( 'connectors_ai_mock_connectors_test_api_key', $mock['authentication']['setting_name'] );
    117     }
    118 
    119     /**
    120      * @ticket 64730
    121      */
    122     public function test_connectors_are_sorted_alphabetically() {
    123         $connectors = _wp_connectors_get_connector_settings();
    124         $keys       = array_keys( $connectors );
    125         $sorted     = $keys;
    126         sort( $sorted );
    127 
    128         $this->assertSame( $sorted, $keys, 'Connectors should be sorted alphabetically by ID.' );
     114        $this->assertNull( $mock['authentication']['credentials_url'] ?? null );
     115        $this->assertSame( 'connectors_ai_mock_connectors_test_api_key', $mock['authentication']['setting_name'] ?? null );
    129116    }
    130117}
Note: See TracChangeset for help on using the changeset viewer.