尝试从我的WooCommerce商店页面中排除单个类别
我使用的是此代码,但它会破坏我网站的属性过滤器链接:
add_action( 'pre_get_posts', 'custom_pre_get_posts_query' );
function custom_pre_get_posts_query( $q ) {
if ( ! $q->is_main_query() ) return;
if ( ! $q->is_post_type_archive() ) return;
if ( ! is_admin() && is_shop() ) {
$q->set( 'tax_query', array(array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => array( 'samples' ),
'operator' => 'NOT IN'
)));
}
remove_action( 'pre_get_posts', 'custom_pre_get_posts_query' );
}
答案 0 :(得分:3)
此解决方案从“商店页面”中排除了类别。但是问题是,排除类别的“类别存档”页面显示没有可用的产品。
我拥有不想在“商店页面”上注册的电子书类别。我为电子书创建了一个单独的菜单项,在这里我要列出“电子书”类别中的所有书。
如何实现?
更新
我在动作挂钩中添加了if (!$q->is_main_query() || !is_shop()) return;
,它解决了我上面提到的问题。此行仅从“商店”页面中排除类别,但是当直接从菜单(“类别”页面)访问排除的类别时,所有产品的列出都很好。
function custom_pre_get_posts_query( $q ) {
if (!$q->is_main_query() || !is_shop()) return;
$tax_query = (array) $q->get( 'tax_query' );
$tax_query[] = array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => array( 'ebooks' ),
'operator' => 'NOT IN'
);
$q->set( 'tax_query', $tax_query );
}
add_action( 'woocommerce_product_query', 'custom_pre_get_posts_query' );
答案 1 :(得分:1)
你可以使用woocommerce_product_query
钩子,它与pre_get_posts
非常相似,只不过它已经有了适当的条件逻辑。还有一个woocommerce_product_query_tax_query
过滤器,但我不确定它是否存在于WooCommerce 2.6中,或者它是否在2.7 beta版本中存在。
add_action( 'woocommerce_product_query', 'custom_pre_get_posts_query' );
function custom_pre_get_posts_query( $q ) {
$q->set( 'tax_query', array(array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => array( 'samples' ),
'operator' => 'NOT IN'
)));
}
编辑过滤是通过分类法查询完成的,在上面的示例中,我们完全覆盖了税务查询。我无法测试它现在是否正常工作(数组数组很棘手,所以我可能搞砸了),但理论上我们需要将新约束与WooCommerce生成的现有分类查询合并。
add_action( 'woocommerce_product_query', 'custom_pre_get_posts_query' );
function custom_pre_get_posts_query( $q ) {
$tax_query = (array) $q->get( 'tax_query' );
$tax_query[] = array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => array( 'samples' ),
'operator' => 'NOT IN'
);
$q->set( 'tax_query', $tax_query );
}