From f2f2d839a95703fc263ba960674a782866ff3f4f Mon Sep 17 00:00:00 2001 From: Jorge Costa Date: Thu, 30 Apr 2026 15:08:25 +0100 Subject: [PATCH 1/4] Connectors: Register Akismet as a default non-AI connector. Adds Akismet to the default connector registry as a `spam_filtering` type, with plugin metadata pointing to `akismet/akismet.php` and API key authentication wired to the existing `wordpress_api_key` option / `WPCOM_API_KEY` constant. The `is_active` callback defaults to `__return_false` so the connector reports inactive until the Akismet plugin overrides it from its own registration. --- src/wp-includes/connectors.php | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/wp-includes/connectors.php b/src/wp-includes/connectors.php index b5f2354ddd93a..b2c7e4f400bff 100644 --- a/src/wp-includes/connectors.php +++ b/src/wp-includes/connectors.php @@ -210,6 +210,27 @@ 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', + // If the plugin is active, it will pass its its own is_active callback. + 'is_active' => '__return_false', + ), + '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. * From 4591723cfa9217d4151e6ee32cf88761f7c766f9 Mon Sep 17 00:00:00 2001 From: Jorge Costa Date: Thu, 30 Apr 2026 15:31:00 +0100 Subject: [PATCH 2/4] Connectors: Update `wp_get_connectors()` tests for the Akismet default. The default connector registry now includes Akismet, which is a `spam_filtering` connector that uses the legacy `wordpress_api_key` option. Update the test expectations to allow non-AI connector types and skip the AI-specific `connectors_ai_{id}_api_key` setting-name format check for them. --- .../wpConnectorsGetConnectorSettings.php | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/tests/phpunit/tests/connectors/wpConnectorsGetConnectorSettings.php b/tests/phpunit/tests/connectors/wpConnectorsGetConnectorSettings.php index cedac90111101..0f03487480d2f 100644 --- a/tests/phpunit/tests/connectors/wpConnectorsGetConnectorSettings.php +++ b/tests/phpunit/tests/connectors/wpConnectorsGetConnectorSettings.php @@ -37,8 +37,9 @@ 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( 4, $connectors ); + $this->assertCount( 5, $connectors ); } /** @@ -56,7 +57,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' ), "Connector '{$connector_id}' has unexpected type '{$connector_data['type']}'." ); + $this->assertContains( $connector_data['type'], array( 'ai_provider', 'spam_filtering' ), "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'." ); @@ -79,10 +80,16 @@ 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'." ); + $this->assertNotEmpty( $connector_data['authentication']['setting_name'], "Connector '{$connector_id}' setting_name should not be empty." ); + + if ( 'ai_provider' !== $connector_data['type'] ) { + continue; + } + $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." + $connector_data['authentication']['setting_name'], + "Connector '{$connector_id}' setting_name does not match expected AI provider format." ); } From 6f0cbc4c0a4d34f95bf54201e92640f2a8e7bb36 Mon Sep 17 00:00:00 2001 From: Jorge Costa Date: Thu, 30 Apr 2026 16:44:28 +0100 Subject: [PATCH 3/4] include is active check --- src/wp-includes/connectors.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/connectors.php b/src/wp-includes/connectors.php index b2c7e4f400bff..15675b5dedb46 100644 --- a/src/wp-includes/connectors.php +++ b/src/wp-includes/connectors.php @@ -219,8 +219,9 @@ function _wp_connectors_init(): void { 'type' => 'spam_filtering', 'plugin' => array( 'file' => 'akismet/akismet.php', - // If the plugin is active, it will pass its its own is_active callback. - 'is_active' => '__return_false', + 'is_active' => function () { + return defined( 'AKISMET_VERSION' ); + }, ), 'authentication' => array( 'method' => 'api_key', From d24ebf769e339e17e2267b00615da3b6c1d208bd Mon Sep 17 00:00:00 2001 From: Jorge Costa Date: Sat, 2 May 2026 00:09:03 +0100 Subject: [PATCH 4/4] Update src/wp-includes/connectors.php Co-authored-by: Mukesh Panchal --- src/wp-includes/connectors.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/connectors.php b/src/wp-includes/connectors.php index 15675b5dedb46..5916c44158c18 100644 --- a/src/wp-includes/connectors.php +++ b/src/wp-includes/connectors.php @@ -218,8 +218,8 @@ function _wp_connectors_init(): void { 'description' => __( 'Protect your site from spam.' ), 'type' => 'spam_filtering', 'plugin' => array( - 'file' => 'akismet/akismet.php', - 'is_active' => function () { + 'file' => 'akismet/akismet.php', + 'is_active' => static function () { return defined( 'AKISMET_VERSION' ); }, ),