Commit f2edf3671fd for woocommerce
commit f2edf3671fd6d4af9a8536c042a3c2eae352a6da
Author: Alba Rincón <albarin@users.noreply.github.com>
Date: Mon Apr 13 11:22:57 2026 +0200
Prime caches in `woocommerce_cross_sell_display` to reduce cart page queries (#64085)
* Prime post caches in woocommerce_cross_sell_display() to reduce cart page queries
* Add changefile(s) from automation for the following project(s): woocommerce
---------
Co-authored-by: woocommercebot <woocommercebot@users.noreply.github.com>
diff --git a/plugins/woocommerce/changelog/64085-fix-prime-cart-cross-sells b/plugins/woocommerce/changelog/64085-fix-prime-cart-cross-sells
new file mode 100644
index 00000000000..98a53500468
--- /dev/null
+++ b/plugins/woocommerce/changelog/64085-fix-prime-cart-cross-sells
@@ -0,0 +1,4 @@
+Significance: patch
+Type: performance
+
+Reduce the number of database queries on the classic cart page by priming post and image caches in `woocommerce_cross_sell_display()`.
\ No newline at end of file
diff --git a/plugins/woocommerce/includes/wc-template-functions.php b/plugins/woocommerce/includes/wc-template-functions.php
index 905b4a4cc27..dcbdeeb72d8 100644
--- a/plugins/woocommerce/includes/wc-template-functions.php
+++ b/plugins/woocommerce/includes/wc-template-functions.php
@@ -2515,9 +2515,14 @@ if ( ! function_exists( 'woocommerce_cross_sell_display' ) ) {
}
// Get visible cross sells then sort them at random.
- $cross_sells = isset( WC()->cart )
- ? array_filter( array_map( 'wc_get_product', WC()->cart->get_cross_sells() ), 'wc_products_array_filter_visible' )
- : array();
+ $cross_sells = array();
+ $cross_sell_ids = isset( WC()->cart ) ? WC()->cart->get_cross_sells() : array();
+ if ( ! empty( $cross_sell_ids ) ) {
+ // Prime caches to reduce future queries.
+ _prime_post_caches( $cross_sell_ids );
+
+ $cross_sells = array_filter( array_map( 'wc_get_product', $cross_sell_ids ), 'wc_products_array_filter_visible' );
+ }
wc_set_loop_prop( 'name', 'cross-sells' );
wc_set_loop_prop( 'columns', apply_filters( 'woocommerce_cross_sells_columns', $columns ) );
@@ -2535,6 +2540,11 @@ if ( ! function_exists( 'woocommerce_cross_sell_display' ) ) {
$limit = intval( apply_filters( 'woocommerce_cross_sells_total', $limit ) );
$cross_sells = $limit > 0 ? array_slice( $cross_sells, 0, $limit ) : $cross_sells;
+ if ( ! empty( $cross_sells ) ) {
+ // Prime caches to reduce future queries.
+ _prime_post_caches( array_filter( array_map( fn( $product ) => (int) $product->get_image_id(), $cross_sells ) ) );
+ }
+
wc_get_template(
'cart/cross-sells.php',
array(