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

WooCommerce product_categories短码按品牌过滤子分类需求

嘿,我正好处理过类似的需求,给你拆解一下怎么实现——核心就是给现有的子分类查询加上品牌存在性过滤,只保留那些确实有指定品牌产品的子分类。下面以WordPress为例(毕竟短码是WP里的常用功能,如果你用的是其他系统,逻辑也可以直接套用):

具体实现步骤与代码

首先,假设你现在的短码已经能正常输出父分类的子分类,那我们只需要在这个基础上,给每个子分类加个“有没有指定品牌产品”的检查,把不符合的过滤掉就行。

1. 修改短码函数,添加品牌参数

这里我直接给你写一个完整的优化版函数,你可以替换掉原来的:

function display_child_categories_by_brand($atts) {
    // 定义短码参数:parent是父分类的别名/ID,brand是目标品牌的别名/ID
    $atts = shortcode_atts(array(
        'parent' => '',
        'brand' => '',
    ), $atts);

    // 先做参数校验,避免无效调用
    if(empty($atts['parent']) || empty($atts['brand'])) {
        return '请填写父分类和品牌参数哦~';
    }

    // 获取父分类的ID(支持别名或ID)
    $parent_term = is_numeric($atts['parent']) ? get_term($atts['parent'], 'product_cat') : get_term_by('slug', $atts['parent'], 'product_cat');
    if(!$parent_term || is_wp_error($parent_term)) {
        return '找不到指定的父分类哦';
    }
    $parent_id = $parent_term->term_id;

    // 获取目标品牌的ID(同样支持别名或ID)
    $brand_term = is_numeric($atts['brand']) ? get_term($atts['brand'], 'product_brand') : get_term_by('slug', $atts['brand'], 'product_brand');
    if(!$brand_term || is_wp_error($brand_term)) {
        return '找不到指定的品牌哦';
    }
    $brand_id = $brand_term->term_id;

    // 获取父分类下的所有子分类
    $child_cats = get_terms(array(
        'taxonomy' => 'product_cat',
        'parent' => $parent_id,
        'hide_empty' => false, // 这里设为false是为了检查那些可能暂时没产品但以后会有的分类
    ));

    // 过滤出包含指定品牌产品的子分类
    $valid_child_cats = array();
    foreach($child_cats as $cat) {
        // 这里不用查全量产品,只要确认有至少一个符合条件的就行,省性能
        $has_target_brand = new WP_Query(array(
            'post_type' => 'product',
            'posts_per_page' => 1,
            'tax_query' => array(
                'relation' => 'AND',
                array(
                    'taxonomy' => 'product_cat',
                    'field' => 'term_id',
                    'terms' => $cat->term_id,
                ),
                array(
                    'taxonomy' => 'product_brand',
                    'field' => 'term_id',
                    'terms' => $brand_id,
                ),
            ),
            'fields' => 'ids', // 只取产品ID,加快查询速度
            'no_found_rows' => true, // 关闭分页计数,进一步优化性能
        ));

        if($has_target_brand->have_posts()) {
            $valid_child_cats[] = $cat;
        }
        wp_reset_postdata();
    }

    // 输出结果
    if(empty($valid_child_cats)) {
        return '这个父分类下暂时没有包含该品牌的子分类哦';
    }

    $output = '<ul class="child-cats-list">';
    foreach($valid_child_cats as $cat) {
        $output .= sprintf('<li><a href="%s" title="查看%s分类">%s</a></li>', get_term_link($cat), $cat->name, $cat->name);
    }
    $output .= '</ul>';

    return $output;
}
add_shortcode('child_cats_by_brand', 'display_child_categories_by_brand');

2. 怎么用这个短码?

比如你要显示“服饰”分类下包含“耐克”品牌的子分类,直接在页面/文章里加:
[child_cats_by_brand parent="服饰" brand="耐克"]
这里的parent和brand填的是分类的别名(slug),如果不习惯用别名,也可以直接填分类ID,比如parent="123" brand="456"。

3. 如果品牌是存在自定义字段里的怎么办?

要是你的品牌不是用分类法存的,而是用自定义字段(比如product_brand这个字段),那把上面的tax_query换成meta_query就行:

'meta_query' => array(
    array(
        'key' => 'product_brand', // 你的自定义字段键名
        'value' => $atts['brand'], // 这里直接用参数值,不用转成ID了
        'compare' => '=',
    ),
)

小提示

  • 要是你的站点产品很多,频繁查数据库可能有点慢,可以加个缓存,比如用set_transient把过滤后的分类列表存起来,一段时间内直接用缓存结果就行。
  • 样式可以自己改,比如给child_cats-list加CSS,让显示更美观。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:07:14