php – 在WooCommerce中过滤产品类别存档页面
作者:互联网
我目前正在开发一个WordPress / WooCommerce书店网站,它使用自定义的taxonomy.php WooCommerce模板来显示一组名为“Highlights”的产品类别的产品.因此,例如,/ books / product-category / highlight / best-sellers显示与“Highlights”的“Best Sellers”子类别相关联的产品.我想要做的是为这些存档页面添加过滤功能,以允许通过名为“主题”的不同类别对这些产品类别进行更细粒度的视图.因此,例如,选中“最佳卖家”页面上的“艺术”框将显示该类别中的畅销书.
最后,我想在URL中使用$_GET参数,例如/ books / product-category / highlight / 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
method:
if( ! $query->is_main_query() ) return;
或者使用WordPress pre_get_posts过滤器钩子而不是使用WordPress pre_get_posts过滤器钩子,在Woocommerce中可以使用专用的woocommerce_product_query_tax_query过滤器钩子,它已经包含了is_main_query()Wordpress WP_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文件中.它应该有效.
标签:php,wordpress,woocommerce,product,custom-taxonomy 来源: https://codeday.me/bug/20190910/1800484.html