首页 > 解决方案 > 在 WooCommerce 中过滤产品类别存档页面

问题描述

我目前正在开发一个 WordPress/WooCommerce 书店网站,该网站使用自定义taxonomy.phpWooCommerce 模板按一个名为“亮点”的产品类别显示产品集。因此,例如,/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 的人,我想知道是否有更好的方法可以让我达到预期的结果,并且只影响主要的存档产品查询,而不影响模板中可能存在的任何其他查询?

感谢您在此处提供的任何帮助,如果我的问题或相关细节有任何不清楚之处,请告诉我。

标签: phpwordpresswoocommerceproductcustom-taxonomy

解决方案


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

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

pre_get_posts或者,在 Woocommerce 中,可以使用已经包含Wordpress WP_Query 方法的专用 过滤器挂钩,而不是使用 WordPress过滤器挂钩。woocommerce_product_query_tax_queryis_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 文件中。它应该有效。


推荐阅读