php - 在 WooCommerce 中过滤产品类别存档页面
问题描述
我目前正在开发一个 WordPress/WooCommerce 书店网站,该网站使用自定义taxonomy.php
WooCommerce 模板按一个名为“亮点”的产品类别显示产品集。因此,例如,/books/product-category/highlights/best-sellers
显示与“Highlights”的“Best Sellers”子类别相关的产品。我想做的是向这些存档页面添加过滤器功能,以允许通过称为“主题”的不同类别对这些产品类别进行更细粒度的视图。因此,例如,选中“畅销书”页面上的“艺术”框将显示该类别中的畅销书。
最终,我想$_GET
在 URL 中使用一个参数,例如/books/product-category/highlights/best-sellers/?topic=art
. 我一直在尝试,pre_get_posts
但我的结果充其量只是有点不稳定。这是我迄今为止尝试过的functions.php
:
add_action('pre_get_posts', 'filter_product_topic');
function filter_product_topic($query) {
if( is_admin() ) return;
$tax_query = $query->get('tax_query');
if( isset($_GET['topic']) ) {
$tax_query[] = array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => $_GET['topic'],
'operator' => 'IN'
);
}
$query->set('tax_query', $tax_query);
}
作为一个非常基本的测试,这似乎适用于主要存档查询,但它似乎对模板的其余部分产生不利影响,并且看起来会破坏页面上显示轮播的英雄元素的不同查询不同的产品。对于那些更熟悉 WooCommerce 的人,我想知道是否有更好的方法可以让我达到预期的结果,并且只影响主要的存档产品查询,而不影响模板中可能存在的任何其他查询?
感谢您在此处提供的任何帮助,如果我的问题或相关细节有任何不清楚之处,请告诉我。
解决方案
在您的代码中,主要缺少的应该是以这种方式使用is_main_query()
WP_Query
方法:
if( ! $query->is_main_query() ) return;
pre_get_posts
或者,在 Woocommerce 中,您可以使用已经包含Wordpress WP_Query 方法的专用 过滤器挂钩,而不是使用 WordPress过滤器挂钩。woocommerce_product_query_tax_query
is_main_query()
这个钩子是 woocommerce 专用WC_Query
类的一部分。所以试试这个:
add_filter( 'woocommerce_product_query_tax_query', 'filter_product_topic', 10, 2 );
function filter_product_topic( $tax_query, $query ) {
// Only on Product Category archives pages
if( is_admin() || ! is_product_category() ) return $tax_query;
// The taxonomy for Product Categories
$taxonomy = 'product_cat';
if( isset( $_GET['topic'] ) && ! empty( $_GET['topic'] )) {
$tax_query[] = array(
'taxonomy' => $taxonomy,
'field' => 'slug',
'terms' => array( $_GET['topic'] ),
'operator' => 'IN'
);
}
return $tax_query;
}
代码位于您的活动子主题(或活动主题)的 function.php 文件中。它应该有效。
推荐阅读
- amazon-web-services - 我们可以通过cloudformation模板创建用户吗?
- javascript - Spring CSRF fetch (POST) 失败(客户端:react-native / Javascript)
- c# - UWP 无需打印预览即可打印
- javascript - 数组减少不适用于长度 1 在给定情况下我该如何处理?
- python - 替换 for 循环以从具有多个列表的数据框中过滤值
- google-api - 使用静态响应测试 android 应用内购买时获取“无效值”
- php - 从php调用API时未传递JSON参数
- java - 将对象数组放入表中 - Java
- angular - 获取 json 集合数据到角度
- reactive-programming - 重试(或)重试时似乎不适用于热通量