wc_get_products分类查询异常及排除特定分类的写法咨询
WooCommerce产品查询问题解答
一、tax_query返回结果不符的原因
你使用category参数传入数组['wordpress', 'plugin']时,WooCommerce默认会将其解析为OR关系——只要产品属于wordpress或plugin其中一个分类,就会被返回,因此能拿到全部预期产品。
而你用tax_query时,在单个子数组里设置operator => 'AND'是错误用法:对于同一个分类法(product_cat)的多条件AND关系,不能在一个子数组里通过operator => 'AND'实现。这个写法的实际逻辑是“产品必须同时匹配这两个terms的同一个分类条目”,而非“产品同时属于这两个分类”,这种场景极少有产品满足,所以仅返回1个结果。
二、排除分类的查询语句修正
你提供的原查询写法不正确,以下是修正后的正确代码:
1. 同时属于两个分类的正确查询
$args = array( 'post_type' => 'product', 'post_status' => 'publish', 'posts_per_page' => -1, 'tax_query' => array( 'relation' => 'AND', // 必须属于wordpress分类 array( 'taxonomy' => 'product_cat', 'field' => 'slug', 'terms' => array( 'wordpress' ), 'operator' => 'IN', ), // 必须同时属于plugin分类 array( 'taxonomy' => 'product_cat', 'field' => 'slug', 'terms' => array( 'plugin' ), 'operator' => 'IN', ), ), ); $products = wc_get_products( $args );
2. 同时属于两个分类且排除addon分类的正确查询
$args = array( 'post_type' => 'product', 'post_status' => 'publish', 'posts_per_page' => -1, 'tax_query' => array( 'relation' => 'AND', // 必须属于wordpress分类 array( 'taxonomy' => 'product_cat', 'field' => 'slug', 'terms' => array( 'wordpress' ), 'operator' => 'IN', ), // 必须同时属于plugin分类 array( 'taxonomy' => 'product_cat', 'field' => 'slug', 'terms' => array( 'plugin' ), 'operator' => 'IN', ), // 排除属于addon分类的产品 array( 'taxonomy' => 'product_cat', 'field' => 'slug', 'terms' => array( 'addon' ), 'operator' => 'NOT IN', ), ), ); $products = wc_get_products( $args );
说明:要实现同一个分类法下的多条件AND,需将每个分类拆成独立的tax_query子数组,再通过外层的relation => 'AND'关联。单个子数组里的operator,对于单个term用IN即可,多个term时IN代表OR关系,AND在此场景下不适用(一个分类条目不可能同时对应两个slug)。
内容的提问来源于stack exchange,提问作者Toniq
相关产品推荐
相关产品推荐

