You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WooCommerce品牌与二级分类下拉筛选故障排查

问题解决:WooCommerce双条件筛选(品牌+二级分类)失效修复

问题根源

  1. 品牌下拉菜单的name属性错误:你用了brand,但Perfect Brands for WooCommerce的分类法是pwb-brand,WordPress无法识别这个自定义参数来筛选产品。
  2. 未干预主查询:默认情况下只有内置分类product_cat会被自动处理,自定义分类pwb-brand需要手动添加查询条件才能生效。

修复步骤

1. 修正品牌下拉的参数名

把品牌下拉的name="brand"改成name="pwb-brand",让提交的参数能被后续查询逻辑识别。

2. 添加主查询钩子处理双条件筛选

通过pre_get_posts钩子,在产品列表页面同时处理分类和品牌的筛选条件,实现双条件叠加筛选。

完整修复代码

// Dropdown Function
function woocommerce_category_dropdown() {
    // 获取所有产品分类(排除"ALL",仅保留二级分类)
    $args = array(
        'taxonomy' => 'product_cat',
        'orderby' => 'name',
        'order'   => 'ASC',
        'hide_empty' => false,
    );
    $categories = get_terms($args);

    // 获取Perfect Brands WooCommerce插件的品牌数据
    $brands = get_terms(array(
        'taxonomy' => 'pwb-brand',
        'orderby' => 'name',
        'order'   => 'ASC',
        'hide_empty' => false,
    ));

    ob_start();
    ?>

    <form role="search" method="get" id="categorysearchform" action="<?php echo esc_url(home_url('/')); ?>">
        <!-- 品牌下拉 - 修改name为pwb-brand -->
        <select name="pwb-brand" id="brand">
            <option value=""><?php _e('选择品牌', 'woocommerce'); ?></option>
            <?php foreach ($brands as $brand) : ?>
                <option value="<?php echo esc_attr($brand->slug); ?>" <?php echo isset($_GET['pwb-brand']) && $_GET['pwb-brand'] == $brand->slug ? 'selected' : ''; ?>><?php echo esc_html($brand->name); ?></option>
            <?php endforeach; ?>
        </select>

        <!-- 二级分类下拉(排除"ALL") -->
        <select name="product_cat" id="product_cat">
            <option value=""><?php _e('选择分类', 'woocommerce'); ?></option>
            <?php foreach ($categories as $category) : ?>
                <?php
                // 跳过"ALL"分类
                if ($category->name === 'ALL') {
                    continue;
                }

                // 仅保留二级分类
                if ($category->parent != 0) {
                    $parent = get_term($category->parent, 'product_cat');
                    if ($parent->parent == 0) {
                        ?>
                        <option value="<?php echo esc_attr($category->slug); ?>" <?php echo isset($_GET['product_cat']) && $_GET['product_cat'] == $category->slug ? 'selected' : ''; ?>><?php echo esc_html($category->name); ?></option>
                        <?php
                    }
                }
                ?>
            <?php endforeach; ?>
        </select>

        <input type="hidden" value="product" name="post_type" />
        <button type="submit" id="searchsubmit"><?php _e('搜索', 'woocommerce'); ?></button>
    </form>

    <?php
    return ob_get_clean();
}

add_shortcode('woocommerce_category_dropdown', 'woocommerce_category_dropdown');

// 处理双条件筛选的主查询钩子
function custom_product_filter_query($query) {
    // 仅在前端产品列表页面生效,避免影响后台查询
    if (!is_admin() && $query->is_main_query() && is_post_type_archive('product')) {
        $tax_query = array('relation' => 'AND');

        // 处理品牌筛选
        if (isset($_GET['pwb-brand']) && !empty($_GET['pwb-brand'])) {
            $tax_query[] = array(
                'taxonomy' => 'pwb-brand',
                'field'    => 'slug',
                'terms'    => sanitize_text_field($_GET['pwb-brand']),
            );
        }

        // 处理分类筛选
        if (isset($_GET['product_cat']) && !empty($_GET['product_cat'])) {
            $tax_query[] = array(
                'taxonomy' => 'product_cat',
                'field'    => 'slug',
                'terms'    => sanitize_text_field($_GET['product_cat']),
            );
        }

        // 若存在筛选条件,更新查询的tax_query
        if (count($tax_query) > 1) {
            $query->set('tax_query', $tax_query);
        }
    }
}
add_action('pre_get_posts', 'custom_product_filter_query');

额外优化说明

  • 添加了选中状态回显,提交表单后会保留用户选择的选项
  • 对GET参数做了sanitize_text_field安全处理,避免注入风险
  • 设置tax_query的relation为AND,确保同时满足品牌和分类的筛选条件

内容的提问来源于stack exchange,提问作者SamberJac

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 05:48:19