在WooCommerce中过滤产品类别存档页面

时间:2018-06-16 04:19:36

标签: php wordpress woocommerce product custom-taxonomy

我目前正在使用WordPress / WooCommerce书店网站,该网站使用自定义taxonomy.php WooCommerce模板按一个名为“精彩集锦”的产品类别显示产品组。因此,例如,/books/product-category/highlights/best-sellers显示与“最佳卖家”子类别“亮点”相关联的产品。我想要做的是为这些存档页面添加过滤功能,以允许通过名为“主题”的不同类别对这些产品类别进行更细粒度的视图。因此,例如,选中“最佳卖家”页面上的“艺术”框将在该类别中显示畅销书

最后,我想在网址中使用$_GET参数,例如/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的人,我想知道是否有更好的方法让我实现所需的结果只影响主存档产品查询,而不是模板中可能存在的任何其他查询?

感谢您在此提供任何帮助,如果我的问题或相关细节不清楚,请与我们联系。

1 个答案:

答案 0 :(得分:1)

在您的代码中,主要的缺失应该是以这种方式使用is_main_query() WP_Query method

if( ! $query->is_main_query() ) return;

替代使用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文件中。它应该有用。