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 ] );