WooCommerce 在父类别中排除子类别中的产品

Posted

技术标签:

【中文标题】WooCommerce 在父类别中排除子类别中的产品【英文标题】:WooCommerce exclude products from child category in parent category 【发布时间】:2021-01-13 13:59:17 【问题描述】:

我尝试在 WooCommerce 中实现的目标: 我有许多带有子类别(例如高跟鞋、穆勒鞋、坡跟鞋)的类别(例如鞋子)。所有标准鞋只属于父类,少数特殊鞋(如高跟鞋、穆勒鞋和坡跟鞋)只属于子类。

如果用户打开“鞋子”类别,我只想显示当前类别中的产品(而不是子类别中的产品)。

到目前为止我所做的尝试 我搜索了很多并尝试了许多不同的方法,但没有机会。

方法一: as seen here

function exclude_product_cat_children( $wp_query ) 
    if ( isset( $wp_query->query_vars['product_cat'] ) && $wp_query->is_main_query() ) 
        $wp_query->set( 
            'tax_query', array( array (
                'taxonomy' => 'product_cat',
                'field' => 'slug',
                'terms' => $wp_query->query_vars['product_cat'],
                'include_children' => false
            ) )
        );
    
  
add_filter('pre_get_posts', 'exclude_product_cat_children', 99);

方法 #2: as seen here

add_filter( 'parse_tax_query', 'cyb_do_not_include_children_in_company_category_archive' );
function cyb_do_not_include_children_in_company_category_archive( $query ) 
    if ( 
        ! is_admin() 
        && $query->is_main_query()
        && $query->is_tax( 'shoes' )
    ) 
        $query->tax_query->queries[0]['include_children'] = 0;
    

我真的不知道如何解决这个问题。似乎这两种方法对所有人都有效——只是不适合我。有什么想法吗?

谢谢!

【问题讨论】:

您应该重新访问您的类别设置...编辑类别时,您可能需要更改“显示类型”选项... 显示类型仅为产品。我尝试了所有选项,但仍然无法正常工作:( 【参考方案1】:

我终于自己找到了解决方案。希望我可以用下面的代码帮助别人。

代码是干什么用的? 我在当前(父)类别中隐藏子类别中的所有产品。

function change_parent_category_query($query) 
    if( ! is_admin() && $query->query_vars['post_type'] == 'product') 
        
        global $wpdb;
        $parent_id = get_queried_object()->term_id;
        
        if( isset($parent_id) && is_numeric($parent_id) )
            $all_subcategory_ids = $wpdb->get_results( $wpdb->prepare( "SELECT term_taxonomy_id FROM $wpdb->prefixterm_taxonomy WHERE taxonomy = 'product_cat' AND parent = %d", $parent_id ) );

            $list_ids = array();
            foreach( $all_subcategory_ids as $asi )
                $list_ids[] = esc_attr( $asi->term_taxonomy_id );
            

            $tax_query = $query->get( 'tax_query' );

            $tax_query[] = array(
                'taxonomy' => 'product_cat',
                'field' => 'term_id',
                'parent' => 0,
                'terms' => $list_ids,
                'operator' => 'NOT IN'
            );

            $query->set( 'tax_query', $tax_query );
        
    


add_action( 'pre_get_posts', 'change_parent_category_query' );

【讨论】:

以上是关于WooCommerce 在父类别中排除子类别中的产品的主要内容,如果未能解决你的问题,请参考以下文章

在 WooCommerce 子类别存档页面上显示子子类别术语列表

WooCommerce - 使用永久链接和 html 显示来自特定父级的产品子类别

从产品类别中排除最近查看的产品小部件中的 Woocommerce 产品

从 WooCommerce 中的类别价格后缀更改中排除特定产品 ID

如何从functions.php中的简码挂钩中排除产品类别ID - WooCommerce

从 Woocommerce 相关产品中排除特定产品类别