Commit e4e52041afc for woocommerce
commit e4e52041afc42e9151d638d2bea90f458e783606
Author: Francesco <frosso@users.noreply.github.com>
Date: Mon Sep 7 17:06:00 2026 +0200
fix: register WooCommerce user REST fields before building currentUserData (#68319)
diff --git a/plugins/woocommerce/changelog/fix-current-user-data-rest-fields b/plugins/woocommerce/changelog/fix-current-user-data-rest-fields
new file mode 100644
index 00000000000..78c9a56485a
--- /dev/null
+++ b/plugins/woocommerce/changelog/fix-current-user-data-rest-fields
@@ -0,0 +1,4 @@
+Significance: patch
+Type: fix
+
+Include WooCommerce user fields in currentUserData when the REST API has not been initialized.
diff --git a/plugins/woocommerce/src/Internal/Admin/WCAdminUser.php b/plugins/woocommerce/src/Internal/Admin/WCAdminUser.php
index 6df98e4166c..8c99920e543 100644
--- a/plugins/woocommerce/src/Internal/Admin/WCAdminUser.php
+++ b/plugins/woocommerce/src/Internal/Admin/WCAdminUser.php
@@ -24,7 +24,7 @@ class WCAdminUser {
/**
* Get class instance.
*
- * @return object Instance.
+ * @return WCAdminUser Instance.
*/
public static function get_instance() {
if ( null === self::$instance ) {
@@ -202,6 +202,12 @@ class WCAdminUser {
* @return array User data.
*/
public static function get_user_data() {
+ // The controller below reads $wp_rest_additional_fields, which is only filled once
+ // rest_api_init has fired. On a wp-admin request it has not, so register our fields
+ // explicitly instead of relying on something else having booted the REST server first.
+ // register_rest_field() only writes to that global, so this does not build the server.
+ self::get_instance()->register_user_data();
+
$user_controller = new \WP_REST_Users_Controller();
$request = new \WP_REST_Request();
$request->set_query_params( array( 'context' => 'edit' ) );
diff --git a/plugins/woocommerce/tests/php/src/Internal/Admin/WCAdminUserTest.php b/plugins/woocommerce/tests/php/src/Internal/Admin/WCAdminUserTest.php
new file mode 100644
index 00000000000..f901b2febd1
--- /dev/null
+++ b/plugins/woocommerce/tests/php/src/Internal/Admin/WCAdminUserTest.php
@@ -0,0 +1,58 @@
+<?php
+declare( strict_types = 1 );
+
+namespace Automattic\WooCommerce\Tests\Internal\Admin;
+
+use Automattic\WooCommerce\Internal\Admin\WCAdminUser;
+use WC_Unit_Test_Case;
+
+/**
+ * Tests for the WCAdminUser class.
+ */
+class WCAdminUserTest extends WC_Unit_Test_Case {
+
+ /**
+ * Value of $wp_rest_additional_fields before the test ran.
+ *
+ * @var array
+ */
+ private $additional_fields_backup = array();
+
+ /**
+ * Set up test fixtures.
+ */
+ public function setUp(): void {
+ parent::setUp();
+
+ // No base class snapshots this global, so keep our own copy.
+ $this->additional_fields_backup = $GLOBALS['wp_rest_additional_fields'] ?? array();
+ }
+
+ /**
+ * Tear down test fixtures.
+ */
+ public function tearDown(): void {
+ try {
+ $GLOBALS['wp_rest_additional_fields'] = $this->additional_fields_backup;
+ } finally {
+ parent::tearDown();
+ }
+ }
+
+ /**
+ * @testdox Should include the WooCommerce user fields even when rest_api_init has not fired.
+ */
+ public function test_get_user_data_includes_woocommerce_fields_without_rest_api_init(): void {
+ wp_set_current_user( self::factory()->user->create( array( 'role' => 'administrator' ) ) );
+
+ // A wp-admin request never fires rest_api_init, so the global the users controller
+ // reads its extra fields from is empty.
+ $GLOBALS['wp_rest_additional_fields'] = array();
+
+ $user_data = WCAdminUser::get_user_data();
+
+ $this->assertArrayHasKey( 'woocommerce_meta', $user_data, 'currentUserData should carry woocommerce_meta.' );
+ $this->assertArrayHasKey( 'is_super_admin', $user_data, 'currentUserData should carry is_super_admin.' );
+ $this->assertArrayHasKey( 'variable_product_tour_shown', $user_data['woocommerce_meta'], 'woocommerce_meta should carry the registered user data fields.' );
+ }
+}