You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于自定义分类法分组的WooCommerce产品分类页实现问询

在WooCommerce产品分类页按自定义分类法分组展示产品:可行且可实现!

Absolutely feasible! Let’s walk through how to turn your idea into working code, refining your initial approach to get the grouped display you want.

第一步:确认自定义分类法与产品关联

首先要确保你用Custom Post Type UI创建的自定义分类法已经关联到WooCommerce的product post类型。在CPT UI的分类法编辑页面,找到Post Types选项,勾选product——这是基础,不然产品不会被分配到这个分类法的术语下。

第二步:替换默认循环,实现分组展示

你的初始思路用了woocommerce_shop_loop钩子,但更有效的方式是先移除默认的产品循环,然后添加我们自己的分组逻辑。这样能完全控制输出结构,同时保留WooCommerce原生的产品样式。

这里是完整的实现代码:

/***********************************************************/
/********** CATEGORY GROUPED BY CPT TAXONOMY ************/
/***********************************************************/

// Remove default WooCommerce shop loop hooks to replace with our own
add_action('woocommerce_before_shop_loop', 'remove_default_shop_loop', 1);
function remove_default_shop_loop() {
    remove_action('woocommerce_shop_loop', 'woocommerce_product_loop_start', 10);
    remove_action('woocommerce_shop_loop', 'woocommerce_product_loop_end', 20);
    remove_action('woocommerce_shop_loop', 'woocommerce_template_loop_product', 10);
}

// Add custom grouped product loop
add_action('woocommerce_shop_loop', 'custom_grouped_product_loop_by_taxonomy', 10);
function custom_grouped_product_loop_by_taxonomy() {
    // Replace this with YOUR custom taxonomy slug (find it in CPT UI's edit taxonomy page)
    $custom_taxonomy = 'your_custom_taxonomy_slug';
    
    // Get all non-empty terms from our custom taxonomy
    $tax_terms = get_terms([
        'taxonomy' => $custom_taxonomy,
        'hide_empty' => true,
        'orderby' => 'name',
        'order' => 'ASC'
    ]);

    if (!empty($tax_terms) && !is_wp_error($tax_terms)) {
        foreach ($tax_terms as $term) {
            // Output the group heading
            echo '<h2 class="taxonomy-group-heading">' . esc_html($term->name) . '</h2>';

            // Start the product grid container (matches WooCommerce's default structure)
            echo '<ul class="products columns-' . esc_attr(wc_get_loop_prop('columns')) . '">';

            // Query products that belong to this term AND the current product category (if on a category page)
            $product_query_args = [
                'post_type' => 'product',
                'posts_per_page' => -1, // Show all products in the group; adjust for pagination if needed
                'post_status' => 'publish',
                'tax_query' => [
                    'relation' => 'AND',
                    [
                        'taxonomy' => $custom_taxonomy,
                        'field' => 'term_id',
                        'terms' => $term->term_id
                    ]
                ]
            ];

            // Add current product category filter if we're on a category archive page
            if (is_product_category()) {
                $product_query_args['tax_query'][] = [
                    'taxonomy' => 'product_cat',
                    'field' => 'slug',
                    'terms' => get_queried_object()->slug
                ];
            }

            $products = new WP_Query($product_query_args);

            if ($products->have_posts()) {
                while ($products->have_posts()) {
                    $products->the_post();
                    // Use WooCommerce's native product template to keep styling consistent
                    wc_get_template_part('content', 'product');
                }
            }

            // Close the product grid container
            echo '</ul>';
        }
        wp_reset_postdata();
    } else {
        // Fallback: show default product loop if no terms are found
        wc_get_template('loop/loop-start.php');
        if (have_posts()) {
            while (have_posts()) {
                the_post();
                wc_get_template_part('content', 'product');
            }
        }
        wc_get_template('loop/loop-end.php');
    }
}

代码关键点解释

  • 移除默认循环:我们先移除WooCommerce原生的循环钩子,这样可以完全控制输出结构,不会和默认的产品列表冲突。
  • 获取分类法术语:用get_terms获取所有有产品关联的自定义分类法术语,确保只显示有内容的分组。
  • 产品查询逻辑:针对每个术语,查询同时属于该术语和当前产品分类(如果在分类页)的产品,保证分组的准确性。
  • 保留原生样式:用wc_get_template_part('content', 'product')渲染每个产品,这样产品的样式和交互会和你的主题保持一致,不用额外写CSS。
  • 降级处理:如果没有找到任何术语,会自动回退到默认的产品列表,避免页面空白。

后续调整建议

  • 替换代码中的your_custom_taxonomy_slug为你实际的自定义分类法slug(在CPT UI的分类法编辑页面可以找到)。
  • 如果需要分页,把posts_per_page改成你想要的数量,然后添加'paged' => get_query_var('paged')参数到查询里——不过分组分页逻辑会更复杂,可能需要额外处理术语的分页。
  • 可以通过.taxonomy-group-heading这个CSS类自定义分组标题的样式,让它和你的主题风格匹配。

内容的提问来源于stack exchange,提问作者JPashs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 12:37:39