From df409785beedf392af0a7b1b9825e86370ac1cd5 Mon Sep 17 00:00:00 2001 From: Peter Wilson Date: Thu, 2 Apr 2026 08:14:21 +1100 Subject: [PATCH 1/3] Revert "Fix: Register Akismet Anti-Spam as a connector." This reverts commit c5627a124998b20ee492e922edbf4d75d5fd927c. --- src/wp-includes/connectors.php | 19 ------------------ .../wpConnectorsGetConnectorSettings.php | 20 +++++++------------ .../rest-api/rest-settings-controller.php | 1 - tests/qunit/fixtures/wp-api-generated.js | 7 ------- 4 files changed, 7 insertions(+), 40 deletions(-) diff --git a/src/wp-includes/connectors.php b/src/wp-includes/connectors.php index a11faeb637623..68c8b4c1570d0 100644 --- a/src/wp-includes/connectors.php +++ b/src/wp-includes/connectors.php @@ -210,25 +210,6 @@ function _wp_connectors_init(): void { _wp_connectors_register_default_ai_providers( $registry ); } - // Non-AI default connectors. - $registry->register( - 'akismet', - array( - 'name' => __( 'Akismet Anti-spam' ), - 'description' => __( 'Protect your site from spam.' ), - 'type' => 'spam_filtering', - 'plugin' => array( - 'file' => 'akismet/akismet.php', - ), - 'authentication' => array( - 'method' => 'api_key', - 'credentials_url' => 'https://akismet.com/get/', - 'setting_name' => 'wordpress_api_key', - 'constant_name' => 'WPCOM_API_KEY', - ), - ) - ); - /** * Fires when the connector registry is ready for plugins to register connectors. * diff --git a/tests/phpunit/tests/connectors/wpConnectorsGetConnectorSettings.php b/tests/phpunit/tests/connectors/wpConnectorsGetConnectorSettings.php index 9d6c4b8486d9c..cedac90111101 100644 --- a/tests/phpunit/tests/connectors/wpConnectorsGetConnectorSettings.php +++ b/tests/phpunit/tests/connectors/wpConnectorsGetConnectorSettings.php @@ -37,9 +37,8 @@ public function test_returns_expected_connector_keys(): void { $this->assertArrayHasKey( 'google', $connectors ); $this->assertArrayHasKey( 'openai', $connectors ); $this->assertArrayHasKey( 'anthropic', $connectors ); - $this->assertArrayHasKey( 'akismet', $connectors ); $this->assertArrayHasKey( 'mock-connectors-test', $connectors ); - $this->assertCount( 5, $connectors ); + $this->assertCount( 4, $connectors ); } /** @@ -57,7 +56,7 @@ public function test_each_connector_has_required_fields(): void { $this->assertArrayHasKey( 'description', $connector_data, "Connector '{$connector_id}' is missing 'description'." ); $this->assertIsString( $connector_data['description'], "Connector '{$connector_id}' description should be a string." ); $this->assertArrayHasKey( 'type', $connector_data, "Connector '{$connector_id}' is missing 'type'." ); - $this->assertContains( $connector_data['type'], array( 'ai_provider', 'spam_filtering' ), "Connector '{$connector_id}' has unexpected type '{$connector_data['type']}'." ); + $this->assertContains( $connector_data['type'], array( 'ai_provider' ), "Connector '{$connector_id}' has unexpected type '{$connector_data['type']}'." ); $this->assertArrayHasKey( 'authentication', $connector_data, "Connector '{$connector_id}' is missing 'authentication'." ); $this->assertIsArray( $connector_data['authentication'], "Connector '{$connector_id}' authentication should be an array." ); $this->assertArrayHasKey( 'method', $connector_data['authentication'], "Connector '{$connector_id}' authentication is missing 'method'." ); @@ -80,16 +79,11 @@ public function test_api_key_connectors_have_setting_name_and_credentials_url(): ++$api_key_count; $this->assertArrayHasKey( 'setting_name', $connector_data['authentication'], "Connector '{$connector_id}' authentication is missing 'setting_name'." ); - - // AI providers use the connectors_ai_{id}_api_key convention. - // Non-AI connectors may use custom setting names. - if ( 'ai_provider' === $connector_data['type'] ) { - $this->assertSame( - 'connectors_ai_' . str_replace( '-', '_', $connector_id ) . '_api_key', - $connector_data['authentication']['setting_name'] ?? null, - "Connector '{$connector_id}' setting_name does not match expected format." - ); - } + $this->assertSame( + 'connectors_ai_' . str_replace( '-', '_', $connector_id ) . '_api_key', + $connector_data['authentication']['setting_name'] ?? null, + "Connector '{$connector_id}' setting_name does not match expected format." + ); } $this->assertGreaterThan( 0, $api_key_count, 'At least one connector should use api_key authentication.' ); diff --git a/tests/phpunit/tests/rest-api/rest-settings-controller.php b/tests/phpunit/tests/rest-api/rest-settings-controller.php index 7f2ea9eba71f7..b83cef41d2cf3 100644 --- a/tests/phpunit/tests/rest-api/rest-settings-controller.php +++ b/tests/phpunit/tests/rest-api/rest-settings-controller.php @@ -119,7 +119,6 @@ public function test_get_items() { 'default_ping_status', 'default_comment_status', 'site_icon', // Registered in wp-includes/blocks/site-logo.php - 'wordpress_api_key', // Registered by Akismet connector. 'wp_collaboration_enabled', ); diff --git a/tests/qunit/fixtures/wp-api-generated.js b/tests/qunit/fixtures/wp-api-generated.js index c3ca057691308..003dc397ae305 100644 --- a/tests/qunit/fixtures/wp-api-generated.js +++ b/tests/qunit/fixtures/wp-api-generated.js @@ -11011,12 +11011,6 @@ mockedApiResponse.Schema = { "PATCH" ], "args": { - "wordpress_api_key": { - "title": "Akismet Anti-spam API Key", - "description": "API key for the Akismet Anti-spam connector.", - "type": "string", - "required": false - }, "title": { "title": "Title", "description": "Site title.", @@ -14550,7 +14544,6 @@ mockedApiResponse.CommentModel = { }; mockedApiResponse.settings = { - "wordpress_api_key": "", "title": "Test Blog", "description": "", "url": "http://example.org", From 294ecc23f5f762c9daf0ded2881ec5362a777031 Mon Sep 17 00:00:00 2001 From: Peter Wilson Date: Thu, 2 Apr 2026 09:12:16 +1100 Subject: [PATCH 2/3] =?UTF-8?q?Replace=20akismet=20examples=20with=20gener?= =?UTF-8?q?ic=20=E2=80=9Cmy-plugin=E2=80=9D=20examples.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/wp-includes/class-wp-connector-registry.php | 6 +++--- src/wp-includes/connectors.php | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/wp-includes/class-wp-connector-registry.php b/src/wp-includes/class-wp-connector-registry.php index d7643360efeeb..7b35b4c360ae8 100644 --- a/src/wp-includes/class-wp-connector-registry.php +++ b/src/wp-includes/class-wp-connector-registry.php @@ -71,8 +71,8 @@ final class WP_Connector_Registry { * For connectors with `api_key` authentication, a `setting_name` can be provided * explicitly. If omitted, one is automatically generated using the pattern * `connectors_{$type}_{$id}_api_key`, with hyphens in the type and ID normalized - * to underscores (e.g., connector type `spam_filtering` with ID `akismet` produces - * `connectors_spam_filtering_akismet_api_key`). This setting name is used for the + * to underscores (e.g., connector type `ai_provider` with ID `my_plugin` produces + * `connectors_ai_provider_my_plugin_api_key`). This setting name is used for the * Settings API registration and REST API exposure. * * Registering a connector with an ID that is already registered will trigger a @@ -110,7 +110,7 @@ final class WP_Connector_Registry { * Optional. Plugin data for install/activate UI. * * @type string $file The plugin's main file path relative to the plugins - * directory (e.g. 'akismet/akismet.php' or 'hello.php'). + * directory (e.g. 'my-plugin/my-plugin.php' or 'hello.php'). * } * } * @return array|null The registered connector data on success, null on failure. diff --git a/src/wp-includes/connectors.php b/src/wp-includes/connectors.php index 68c8b4c1570d0..3434dfaab9840 100644 --- a/src/wp-includes/connectors.php +++ b/src/wp-includes/connectors.php @@ -59,7 +59,7 @@ function wp_is_connector_registered( string $id ): bool { * Optional. Plugin data for install/activate UI. * * @type string $file The plugin's main file path relative to the plugins - * directory (e.g. 'akismet/akismet.php' or 'hello.php'). + * directory (e.g. 'my-plugin/my-plugin.php' or 'hello.php'). * } * } * @phpstan-return ?array{ @@ -120,7 +120,7 @@ function wp_get_connector( string $id ): ?array { * Optional. Plugin data for install/activate UI. * * @type string $file The plugin's main file path relative to the plugins - * directory (e.g. 'akismet/akismet.php' or 'hello.php'). + * directory (e.g. 'my-plugin/my-plugin.php' or 'hello.php'). * } * } * } @@ -398,9 +398,9 @@ function _wp_connectors_mask_api_key( string $key ): string { * @since 7.0.0 * @access private * - * @param string $setting_name The option name for the API key (e.g., 'connectors_spam_filtering_akismet_api_key'). - * @param string $env_var_name Optional. Environment variable name to check (e.g., 'AKISMET_API_KEY'). - * @param string $constant_name Optional. PHP constant name to check (e.g., 'AKISMET_API_KEY'). + * @param string $setting_name The option name for the API key (e.g., 'connectors_ai_provider_my_plugin_api_key'). + * @param string $env_var_name Optional. Environment variable name to check (e.g., 'MY_PLUGIN_API_KEY'). + * @param string $constant_name Optional. PHP constant name to check (e.g., 'MY_PLUGIN_API_KEY'). * @return string The key source: 'env', 'constant', 'database', or 'none'. */ function _wp_connectors_get_api_key_source( string $setting_name, string $env_var_name = '', string $constant_name = '' ): string { From 4b2aab837345c8c8867481863eb5eb9e0a270021 Mon Sep 17 00:00:00 2001 From: Peter Wilson Date: Thu, 2 Apr 2026 09:27:19 +1100 Subject: [PATCH 3/3] Back to spam filtering example. --- src/wp-includes/class-wp-connector-registry.php | 4 ++-- src/wp-includes/connectors.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/wp-includes/class-wp-connector-registry.php b/src/wp-includes/class-wp-connector-registry.php index 7b35b4c360ae8..9fe51be96aa8e 100644 --- a/src/wp-includes/class-wp-connector-registry.php +++ b/src/wp-includes/class-wp-connector-registry.php @@ -71,8 +71,8 @@ final class WP_Connector_Registry { * For connectors with `api_key` authentication, a `setting_name` can be provided * explicitly. If omitted, one is automatically generated using the pattern * `connectors_{$type}_{$id}_api_key`, with hyphens in the type and ID normalized - * to underscores (e.g., connector type `ai_provider` with ID `my_plugin` produces - * `connectors_ai_provider_my_plugin_api_key`). This setting name is used for the + * to underscores (e.g., connector type `spam_filtering` with ID `my_plugin` produces + * `connectors_spam_filtering_my_plugin_api_key`). This setting name is used for the * Settings API registration and REST API exposure. * * Registering a connector with an ID that is already registered will trigger a diff --git a/src/wp-includes/connectors.php b/src/wp-includes/connectors.php index 3434dfaab9840..63e018074fd58 100644 --- a/src/wp-includes/connectors.php +++ b/src/wp-includes/connectors.php @@ -398,7 +398,7 @@ function _wp_connectors_mask_api_key( string $key ): string { * @since 7.0.0 * @access private * - * @param string $setting_name The option name for the API key (e.g., 'connectors_ai_provider_my_plugin_api_key'). + * @param string $setting_name The option name for the API key (e.g., 'connectors_spam_filtering_my_plugin_api_key'). * @param string $env_var_name Optional. Environment variable name to check (e.g., 'MY_PLUGIN_API_KEY'). * @param string $constant_name Optional. PHP constant name to check (e.g., 'MY_PLUGIN_API_KEY'). * @return string The key source: 'env', 'constant', 'database', or 'none'.