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
相关产品推荐
相关产品推荐

