如何挂钩WC_Widget_Product_Categories实现仅显示当前父类一级同级分类?
WooCommerce 产品分类小部件自定义实现方案
要实现仅在产品分类归档页面显示当前父分类的一级同级分类(无同级时显示当前层级分类)的需求,无需依赖Classic Widget,可通过WooCommerce提供的过滤器钩子修改WC_Widget_Product_Categories的查询逻辑,具体实现代码如下:
add_filter( 'woocommerce_product_categories_widget_args', 'custom_product_categories_widget_args' ); function custom_product_categories_widget_args( $args ) { // 仅在产品分类归档页面生效 if ( ! is_product_category() ) { return $args; } $current_term = get_queried_object(); $parent_id = $current_term->parent; // 处理有父分类的场景 if ( $parent_id > 0 ) { // 查询父分类下的所有一级子分类(当前分类的同级) $sibling_terms = get_terms( array( 'taxonomy' => 'product_cat', 'parent' => $parent_id, 'hide_empty' => $args['hide_empty'], 'fields' => 'ids', ) ); if ( ! empty( $sibling_terms ) ) { // 仅显示同级分类 $args['include'] = $sibling_terms; $args['hierarchical'] = false; } else { // 无同级时,显示当前分类所在层级(即当前分类本身) $args['include'] = array( $current_term->term_id ); } } else { // 当前为顶级分类,显示所有顶级分类(同级) $args['parent'] = 0; $args['hierarchical'] = false; } return $args; }
代码说明
- 钩子
woocommerce_product_categories_widget_args用于修改产品分类小部件的查询参数,确保只在产品分类归档页面触发逻辑。 - 通过
get_queried_object()获取当前页面的分类对象,进而得到父分类ID。 - 针对有父分类的场景,查询父分类下的所有一级子分类作为同级分类;若没有同级分类,则仅显示当前分类。
- 针对顶级分类,直接查询并显示所有顶级分类。
- 继承小部件原有设置的
hide_empty参数,保持是否隐藏空分类的一致性。
将上述代码添加到主题的functions.php文件或自定义插件中即可生效,可根据实际需求调整细节(如是否保留层级显示等)。
内容的提问来源于stack exchange,提问作者jijihbt
相关产品推荐
相关产品推荐

