如何在Woocommerce wc_get_loop_prop商品循环中仅展示指定分类商品
你可以直接将模板中原有的商品循环代码整体替换为以下实现,全程使用wc_get_products完成查询,完全兼容原有模板的样式、钩子和交互逻辑:
// 读取当前分页参数 $paged = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1; // 构造查询参数 $product_query_args = [ 'status' => 'publish', 'category_id' => [12, 345, 7899], // 此处修改为你需要的分类ID数组 'limit' => get_option( 'posts_per_page' ), // 与后台设置的商品每页展示数量同步,也可自定义数值 'paged' => $paged, 'orderby' => isset( $_GET['orderby'] ) ? wc_clean( $_GET['orderby'] ) : 'date', 'order' => isset( $_GET['order'] ) ? wc_clean( $_GET['order'] ) : 'DESC', ]; // 官方推荐方式查询商品 $target_products = wc_get_products( $product_query_args ); // 配置WooCommerce循环全局属性,兼容原有排序、结果计数等功能 $total_products = count( wc_get_products( array_merge( $product_query_args, ['limit' => -1, 'return' => 'ids'] ) ) ); wc_set_loop_prop( 'total', $total_products ); wc_set_loop_prop( 'total_pages', ceil( $total_products / get_option( 'posts_per_page' ) ) ); if ( ! empty( $target_products ) ) { /** * Hook: woocommerce_before_shop_loop. * * @hooked woocommerce_output_all_notices - 10 * @hooked woocommerce_result_count - 20 * @hooked woocommerce_catalog_ordering - 30 */ do_action( 'woocommerce_before_shop_loop' ); woocommerce_product_loop_start(); global $post; foreach ( $target_products as $product ) { // 注入产品数据到全局上下文,兼容默认商品卡片模板 $post = get_post( $product->get_id() ); setup_postdata( $post ); /** * Hook: woocommerce_shop_loop. */ do_action( 'woocommerce_shop_loop' ); wc_get_template_part( 'content', 'product' ); } // 重置全局文章数据,避免冲突 wp_reset_postdata(); woocommerce_product_loop_end(); // 输出默认分页、相关底部钩子 do_action( 'woocommerce_after_shop_loop' ); } else { // 无匹配商品时输出默认提示 do_action( 'woocommerce_no_products_found' ); }
核心说明
category_id是wc_get_products原生支持的参数,直接传入分类ID数组即可实现筛选,无需手动编写 tax_query,完全符合官方开发规范- 保留了原有模板的所有WooCommerce原生钩子,不需要额外调整主题样式、排序规则、商品卡片布局
- 自动适配分页、前台排序功能,和默认WooCommerce商店页使用体验完全一致
- 全程未使用
WP_Query,兼容后续WooCommerce自定义表结构升级,不会出现版本兼容问题
内容的提问来源于stack exchange,提问作者user5853892
相关产品推荐
相关产品推荐

