Commit e07bcfd8313 for woocommerce
commit e07bcfd831318872833ae6db481d93c72f4841d9
Author: Luis Felipe Zaguini <26530524+zaguiini@users.noreply.github.com>
Date: Fri Nov 6 08:48:08 2026 -0300
Move the Ability base class to the Internal namespace (#70706)
* Move the Ability base class to the Internal namespace
The class only backports WordPress 7.2 input handling for the WooCommerce
abilities. In the Internal namespace, WooCommerce can delete it once it
requires a WordPress version that no longer needs the backport.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Keep the check_permissions() override of Ability
WordPress keeps check_permissions() independent of input preparation, so
the override stays for callers that call it with raw input.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
diff --git a/plugins/woocommerce/changelog/move-ability-to-internal b/plugins/woocommerce/changelog/move-ability-to-internal
new file mode 100644
index 00000000000..e8f486711b3
--- /dev/null
+++ b/plugins/woocommerce/changelog/move-ability-to-internal
@@ -0,0 +1,4 @@
+Significance: patch
+Type: dev
+Comment: Move the unreleased Ability base class of the abilities to the Internal namespace; no merchant change.
+
diff --git a/plugins/woocommerce/src/Abilities/ActionableAbility.php b/plugins/woocommerce/src/Abilities/ActionableAbility.php
index 947249b4092..3f461b77963 100644
--- a/plugins/woocommerce/src/Abilities/ActionableAbility.php
+++ b/plugins/woocommerce/src/Abilities/ActionableAbility.php
@@ -7,6 +7,7 @@ declare( strict_types=1 );
namespace Automattic\WooCommerce\Abilities;
+use Automattic\WooCommerce\Internal\Abilities\Ability;
use Automattic\WooCommerce\Internal\Caches\ProductCache;
use Automattic\WooCommerce\Internal\Utilities\DatabaseTransaction;
diff --git a/plugins/woocommerce/src/Internal/Abilities/AGENTS.md b/plugins/woocommerce/src/Internal/Abilities/AGENTS.md
index 47a0633b92b..0ab2db0a4c2 100644
--- a/plugins/woocommerce/src/Internal/Abilities/AGENTS.md
+++ b/plugins/woocommerce/src/Internal/Abilities/AGENTS.md
@@ -1,6 +1,6 @@
# WooCommerce abilities
-The Core abilities live in `Domain/`. `AbilitiesLoader` registers them with `Automattic\WooCommerce\Abilities\Ability` or a subclass of `ActionableAbility`. Two PHPStan rules keep it that way.
+The Core abilities live in `Domain/`. `AbilitiesLoader` registers them with `Ability` or a subclass of `ActionableAbility`. Two PHPStan rules keep it that way.
## Trust the input schema
diff --git a/plugins/woocommerce/src/Internal/Abilities/AbilitiesLoader.php b/plugins/woocommerce/src/Internal/Abilities/AbilitiesLoader.php
index c2aa8b54b5d..b055f228a0a 100644
--- a/plugins/woocommerce/src/Internal/Abilities/AbilitiesLoader.php
+++ b/plugins/woocommerce/src/Internal/Abilities/AbilitiesLoader.php
@@ -7,7 +7,6 @@ declare( strict_types=1 );
namespace Automattic\WooCommerce\Internal\Abilities;
-use Automattic\WooCommerce\Abilities\Ability;
use Automattic\WooCommerce\Abilities\AbilityDefinition;
use Automattic\WooCommerce\Abilities\ExtensibleAbilities;
use Automattic\WooCommerce\Abilities\ActionableAbility;
diff --git a/plugins/woocommerce/src/Abilities/Ability.php b/plugins/woocommerce/src/Internal/Abilities/Ability.php
similarity index 90%
rename from plugins/woocommerce/src/Abilities/Ability.php
rename to plugins/woocommerce/src/Internal/Abilities/Ability.php
index 30439e87b3d..e8df8648ef5 100644
--- a/plugins/woocommerce/src/Abilities/Ability.php
+++ b/plugins/woocommerce/src/Internal/Abilities/Ability.php
@@ -5,7 +5,7 @@
declare( strict_types=1 );
-namespace Automattic\WooCommerce\Abilities;
+namespace Automattic\WooCommerce\Internal\Abilities;
defined( 'ABSPATH' ) || exit;
@@ -15,6 +15,7 @@ defined( 'ABSPATH' ) || exit;
* WordPress 7.2 converts valid ability input to the schema types with
* WP_Ability::coerce_input() before the callbacks run. This class backports
* that method, so the callbacks get converted input on WordPress 7.0 and 7.1 too.
+ * It also prepares the input for callers that call check_permissions() directly.
*
* @since 11.4.0
*/
@@ -46,11 +47,9 @@ class Ability extends \WP_Ability {
/**
* Apply the schema default, validate and convert the input, then check the permissions.
*
- * Callers such as the MCP adapter call this method directly with raw input. The
- * permission callback then gets the same input as through execute().
- *
- * Remove this override when WooCommerce requires a WordPress version that fixes
- * https://core.trac.wordpress.org/ticket/66482.
+ * Some callers, such as older MCP adapter versions, call this method directly with
+ * raw input. The permission callback then gets the same input as through execute().
+ * Input that is already prepared passes through unchanged.
*
* @since 11.4.0
*
diff --git a/plugins/woocommerce/tests/Tools/phpstan/AbilityClassRule.php b/plugins/woocommerce/tests/Tools/phpstan/AbilityClassRule.php
index 98921eaaf6d..bea94f86600 100644
--- a/plugins/woocommerce/tests/Tools/phpstan/AbilityClassRule.php
+++ b/plugins/woocommerce/tests/Tools/phpstan/AbilityClassRule.php
@@ -17,7 +17,7 @@ use PHPStan\Rules\RuleErrorBuilder;
/**
* Reports a class that extends WP_Ability directly. A WooCommerce ability extends
- * Automattic\WooCommerce\Abilities\Ability or ActionableAbility, so it gets its input
+ * Automattic\WooCommerce\Internal\Abilities\Ability or ActionableAbility, so it gets its input
* converted to the schema types.
*
* @implements Rule<InClassNode>
@@ -25,7 +25,7 @@ use PHPStan\Rules\RuleErrorBuilder;
final class AbilityClassRule implements Rule {
private const ALLOWED_CLASSES = array(
- 'Automattic\\WooCommerce\\Abilities\\Ability',
+ 'Automattic\\WooCommerce\\Internal\\Abilities\\Ability',
'Automattic\\WooCommerce\\Internal\\Abilities\\REST\\RestAbility',
);
@@ -54,7 +54,7 @@ final class AbilityClassRule implements Rule {
}
return array(
- RuleErrorBuilder::message( sprintf( 'Class %s extends WP_Ability. Extend Automattic\WooCommerce\Abilities\Ability, or ActionableAbility for an ability that saves, so the input is converted to the schema types.', $class->getName() ) )
+ RuleErrorBuilder::message( sprintf( 'Class %s extends WP_Ability. Extend Automattic\WooCommerce\Internal\Abilities\Ability, or ActionableAbility for an ability that saves, so the input is converted to the schema types.', $class->getName() ) )
->identifier( 'woocommerce.abilityClass' )
->build(),
);
diff --git a/plugins/woocommerce/tests/Tools/phpstan/AbilityRegistrationRule.php b/plugins/woocommerce/tests/Tools/phpstan/AbilityRegistrationRule.php
index 2ba687b5cfe..6f5bb5cc5c9 100644
--- a/plugins/woocommerce/tests/Tools/phpstan/AbilityRegistrationRule.php
+++ b/plugins/woocommerce/tests/Tools/phpstan/AbilityRegistrationRule.php
@@ -18,7 +18,7 @@ use PHPStan\Rules\RuleErrorBuilder;
/**
* Reports a wp_register_ability() call outside AbilitiesLoader. The loader registers
- * every WooCommerce ability with Automattic\WooCommerce\Abilities\Ability or
+ * every WooCommerce ability with Automattic\WooCommerce\Internal\Abilities\Ability or
* ActionableAbility, so it gets its input converted to the schema types.
*
* @implements Rule<FuncCall>
diff --git a/plugins/woocommerce/tests/php/src/Internal/Abilities/AbilitiesLoaderTest.php b/plugins/woocommerce/tests/php/src/Internal/Abilities/AbilitiesLoaderTest.php
index a76dd2d999d..1d31c6b2e7e 100644
--- a/plugins/woocommerce/tests/php/src/Internal/Abilities/AbilitiesLoaderTest.php
+++ b/plugins/woocommerce/tests/php/src/Internal/Abilities/AbilitiesLoaderTest.php
@@ -7,7 +7,7 @@ declare( strict_types=1 );
namespace Automattic\WooCommerce\Tests\Internal\Abilities;
-use Automattic\WooCommerce\Abilities\Ability;
+use Automattic\WooCommerce\Internal\Abilities\Ability;
use Automattic\WooCommerce\Internal\Abilities\AbilitiesCategories;
use Automattic\WooCommerce\Internal\Abilities\AbilitiesLoader;
use Automattic\WooCommerce\Internal\Abilities\Domain\OrderAddNote;
diff --git a/plugins/woocommerce/tests/php/src/Abilities/AbilityTest.php b/plugins/woocommerce/tests/php/src/Internal/Abilities/AbilityTest.php
similarity index 98%
rename from plugins/woocommerce/tests/php/src/Abilities/AbilityTest.php
rename to plugins/woocommerce/tests/php/src/Internal/Abilities/AbilityTest.php
index 866671ed9f3..e22d290789d 100644
--- a/plugins/woocommerce/tests/php/src/Abilities/AbilityTest.php
+++ b/plugins/woocommerce/tests/php/src/Internal/Abilities/AbilityTest.php
@@ -5,9 +5,9 @@
declare( strict_types=1 );
-namespace Automattic\WooCommerce\Tests\Abilities;
+namespace Automattic\WooCommerce\Tests\Internal\Abilities;
-use Automattic\WooCommerce\Abilities\Ability;
+use Automattic\WooCommerce\Internal\Abilities\Ability;
/**
* Tests for the Ability class.
diff --git a/plugins/woocommerce/tests/php/src/Internal/Abilities/Domain/ProductTermsQueryTest.php b/plugins/woocommerce/tests/php/src/Internal/Abilities/Domain/ProductTermsQueryTest.php
index 49074b1240c..cd1a8d65e7c 100644
--- a/plugins/woocommerce/tests/php/src/Internal/Abilities/Domain/ProductTermsQueryTest.php
+++ b/plugins/woocommerce/tests/php/src/Internal/Abilities/Domain/ProductTermsQueryTest.php
@@ -10,7 +10,7 @@ namespace Automattic\WooCommerce\Tests\Internal\Abilities\Domain;
use Automattic\WooCommerce\Internal\Abilities\AbilitiesLoader;
use Automattic\WooCommerce\Internal\Abilities\Domain\ProductTermsQuery;
use Automattic\WooCommerce\Internal\Abilities\Domain\ProductsQuery;
-use Automattic\WooCommerce\Abilities\Ability;
+use Automattic\WooCommerce\Internal\Abilities\Ability;
use Automattic\WooCommerce\Abilities\ExtensibleAbilities;
/**