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.' );
+	}
+}