Commit 18a8e7ffde0 for woocommerce

commit 18a8e7ffde05571d2ad43d5d07907ed4de0572b9
Author: Vladimir Reznichenko <kalessil@gmail.com>
Date:   Wed Jun 24 13:41:55 2026 +0200

    [Performance] Centralize wp_count_posts invocations towards products (p2) (#65973)

    Refactor the new utility method declaration (remove the static modifier) to align with the rest of the class methods.

diff --git a/plugins/woocommerce/includes/class-wc-install.php b/plugins/woocommerce/includes/class-wc-install.php
index 8ae2a7eb9ca..2a66c13f9a8 100644
--- a/plugins/woocommerce/includes/class-wc-install.php
+++ b/plugins/woocommerce/includes/class-wc-install.php
@@ -852,7 +852,7 @@ class WC_Install {
 		return is_null( get_option( 'woocommerce_version', null ) )
 			|| (
 				-1 === wc_get_page_id( 'shop' )
-				&& 0 === array_sum( ProductUtil::get_counts_for_type( 'product' ) )
+				&& 0 === array_sum( wc_get_container()->get( ProductUtil::class )->get_counts_for_type( 'product' ) )
 			);
 	}

diff --git a/plugins/woocommerce/includes/class-wc-tracker.php b/plugins/woocommerce/includes/class-wc-tracker.php
index 9930b2eaf19..97013e96567 100644
--- a/plugins/woocommerce/includes/class-wc-tracker.php
+++ b/plugins/woocommerce/includes/class-wc-tracker.php
@@ -490,7 +490,7 @@ class WC_Tracker {
 	 * @return array
 	 */
 	public static function get_product_counts() {
-		$product_count_data = ProductUtil::get_counts_for_type( 'product' );
+		$product_count_data = wc_get_container()->get( ProductUtil::class )->get_counts_for_type( 'product' );
 		$product_count      = array( 'total' => $product_count_data[ ProductStatus::PUBLISH ] ?? 0 );

 		$product_statuses = get_terms( 'product_type', array( 'hide_empty' => 0 ) );
diff --git a/plugins/woocommerce/src/Admin/API/OnboardingTasks.php b/plugins/woocommerce/src/Admin/API/OnboardingTasks.php
index 3b5c75e31fb..46170b968bf 100644
--- a/plugins/woocommerce/src/Admin/API/OnboardingTasks.php
+++ b/plugins/woocommerce/src/Admin/API/OnboardingTasks.php
@@ -513,7 +513,7 @@ class OnboardingTasks extends \WC_REST_Data_Controller {
 	 * @return string Template contents.
 	 */
 	private static function get_homepage_template( $post_id ) {
-		$products = ProductUtil::get_counts_for_type( 'product' );
+		$products = wc_get_container()->get( ProductUtil::class )->get_counts_for_type( 'product' );
 		if ( ( $products[ ProductStatus::PUBLISH ] ?? 0 ) >= 4 ) {
 			$images   = self::sideload_homepage_images( $post_id, 1 );
 			$image_1  = ! empty( $images[0] ) ? $images[0] : '';
diff --git a/plugins/woocommerce/src/Admin/Features/OnboardingTasks/Tasks/Products.php b/plugins/woocommerce/src/Admin/Features/OnboardingTasks/Tasks/Products.php
index ff7d22945da..a027773a7ae 100644
--- a/plugins/woocommerce/src/Admin/Features/OnboardingTasks/Tasks/Products.php
+++ b/plugins/woocommerce/src/Admin/Features/OnboardingTasks/Tasks/Products.php
@@ -340,7 +340,7 @@ class Products extends Task {
 	public function maybe_redirect_to_add_product_tasklist() {
 		$screen = get_current_screen();
 		if ( $screen && 'edit' === $screen->base && 'product' === $screen->post_type ) {
-			$counts = ProductUtil::get_counts_for_type( 'product' );
+			$counts = wc_get_container()->get( ProductUtil::class )->get_counts_for_type( 'product' );
 			$count  = array_sum( $counts ) - ( $counts[ ProductStatus::AUTO_DRAFT ] ?? 0 );
 			if ( $count > 0 ) {
 				return;
diff --git a/plugins/woocommerce/src/Blocks/BlockTypes/AbstractBlock.php b/plugins/woocommerce/src/Blocks/BlockTypes/AbstractBlock.php
index 404da7ffe83..066bbd08478 100644
--- a/plugins/woocommerce/src/Blocks/BlockTypes/AbstractBlock.php
+++ b/plugins/woocommerce/src/Blocks/BlockTypes/AbstractBlock.php
@@ -444,7 +444,7 @@ abstract class AbstractBlock {
 				'wordCountType' => _x( 'words', 'Word count type. Do not translate!', 'woocommerce' ),
 			];
 			if ( is_admin() && ! WC()->is_rest_api_request() ) {
-				$product_counts     = ProductUtil::get_counts_for_type( 'product' );
+				$product_counts     = wc_get_container()->get( ProductUtil::class )->get_counts_for_type( 'product' );
 				$published_products = $product_counts[ ProductStatus::PUBLISH ] ?? 0;
 				$wc_blocks_config   = array_merge(
 					$wc_blocks_config,
diff --git a/plugins/woocommerce/src/Internal/Admin/SiteHealth.php b/plugins/woocommerce/src/Internal/Admin/SiteHealth.php
index ff8ee30b9e6..393b7e4a32a 100644
--- a/plugins/woocommerce/src/Internal/Admin/SiteHealth.php
+++ b/plugins/woocommerce/src/Internal/Admin/SiteHealth.php
@@ -682,7 +682,7 @@ class SiteHealth {
 			return false;
 		}

-		$product_count = ProductUtil::get_counts_for_type( 'product' );
+		$product_count = wc_get_container()->get( ProductUtil::class )->get_counts_for_type( 'product' );

 		return ( $product_count[ ProductStatus::PUBLISH ] ?? 0 ) > 0 && 0 === wc_get_shipping_method_count();
 	}
diff --git a/plugins/woocommerce/src/Internal/ProductAttributesLookup/CLIRunner.php b/plugins/woocommerce/src/Internal/ProductAttributesLookup/CLIRunner.php
index 8463ffca414..045a2bfafc2 100644
--- a/plugins/woocommerce/src/Internal/ProductAttributesLookup/CLIRunner.php
+++ b/plugins/woocommerce/src/Internal/ProductAttributesLookup/CLIRunner.php
@@ -384,7 +384,7 @@ class CLIRunner {

 		$was_enabled = 'yes' === get_option( 'woocommerce_attribute_lookup_enabled' );

-		$products_count = ProductUtil::get_counts_for_type( 'product' );
+		$products_count = wc_get_container()->get( ProductUtil::class )->get_counts_for_type( 'product' );
 		$products_count = ( $products_count[ ProductStatus::PUBLISH ] ?? 0 ) + ( $products_count[ ProductStatus::PENDING ] ?? 0 ) + ( $products_count[ ProductStatus::DRAFT ] ?? 0 );

 		if ( ! $this->lookup_data_store->regeneration_is_in_progress() || array_key_exists( 'from-scratch', $assoc_args ) ) {
diff --git a/plugins/woocommerce/src/Internal/Utilities/ProductUtil.php b/plugins/woocommerce/src/Internal/Utilities/ProductUtil.php
index 503504b151e..3edf0a7bc7e 100644
--- a/plugins/woocommerce/src/Internal/Utilities/ProductUtil.php
+++ b/plugins/woocommerce/src/Internal/Utilities/ProductUtil.php
@@ -136,7 +136,7 @@ class ProductUtil {
 	 * @param string $post_type Post type (e.g. 'product', 'product_variation').
 	 * @return array<string,int>
 	 */
-	public static function get_counts_for_type( string $post_type ): array {
+	public function get_counts_for_type( string $post_type ): array {
 		// Performance note: integration point for upcoming persistent counters solution.
 		return array_map( 'intval', (array) wp_count_posts( $post_type ) );
 	}
diff --git a/plugins/woocommerce/tests/php/src/Internal/Utilities/ProductUtilTest.php b/plugins/woocommerce/tests/php/src/Internal/Utilities/ProductUtilTest.php
index 7be7ceb010a..9fa416a2dbc 100644
--- a/plugins/woocommerce/tests/php/src/Internal/Utilities/ProductUtilTest.php
+++ b/plugins/woocommerce/tests/php/src/Internal/Utilities/ProductUtilTest.php
@@ -16,13 +16,13 @@ class ProductUtilTest extends \WC_Unit_Test_Case {
 	 * @testdox `get_counts_for_type` returns per-status counts for the given post type.
 	 */
 	public function test_get_counts_for_type_returns_per_status_counts(): void {
-		$before = ProductUtil::get_counts_for_type( 'product' );
+		$before = wc_get_container()->get( ProductUtil::class )->get_counts_for_type( 'product' );

 		$published = \WC_Helper_Product::create_simple_product();
 		$draft     = \WC_Helper_Product::create_simple_product( true, array( 'status' => ProductStatus::DRAFT ) );
 		$pending   = \WC_Helper_Product::create_simple_product( true, array( 'status' => ProductStatus::PENDING ) );

-		$after = ProductUtil::get_counts_for_type( 'product' );
+		$after = wc_get_container()->get( ProductUtil::class )->get_counts_for_type( 'product' );

 		$this->assertSame( ( $before[ ProductStatus::PUBLISH ] ?? 0 ) + 1, $after[ ProductStatus::PUBLISH ] );
 		$this->assertSame( ( $before[ ProductStatus::DRAFT ] ?? 0 ) + 1, $after[ ProductStatus::DRAFT ] );