用WordPress自带的分类做成多条件分类筛选功能

<form method="get" action="<?php echo home_url('/'); ?>">
    <!-- 选择第一个父分类下的分类 -->
    <select name="cat_group_1">
        <option value="">展会分类</option>
        <?php
        $categories = get_categories(array('parent' => 6)); // 获取parent ID为6的所有分类
        foreach ($categories as $cat) {
            echo '<option value="' . esc_attr($cat->term_id) . '">' . esc_html($cat->name) . '</option>';
        }
        ?>
    </select>

    <!-- 选择第二个父分类下的分类 -->
    <select name="cat_group_2">
        <option value="">地区分类</option>
        <?php
        $categories = get_categories(array('parent' => 28)); // 获取parent ID为28的所有分类
        foreach ($categories as $cat) {
            echo '<option value="' . esc_attr($cat->term_id) . '">' . esc_html($cat->name) . '</option>';
        }
        ?>
    </select>

    <input type="submit" value="筛选">
</form>		

然后,在处理筛选请求时,你可以分别检查cat_group_1cat_group_2的值,并使用tax_query中的relation参数来组合这些条件。但是,请注意,tax_queryrelation参数是在同一个tax_query内部的不同条件之间使用的,而不是用于组合来自不同tax_query的参数。如果你想要同时应用两个不同分类法的筛选条件,你需要将它们放在同一个tax_query数组中,但这在分类(categories)的情况下并不适用,因为分类(categories)是一个单一的分类法(taxonomy)。

如果你的目标是基于两个不同的分类法(比如“分类”和“自定义分类法”)进行筛选,那么你需要为每个分类法创建一个单独的tax_query数组,并在外层使用逻辑操作符(如relation => 'AND')来组合它们。但在当前的情况下,你只能基于用户从两个不同父分类下选择的一级分类进行筛选。

显示筛选结果

要在WordPress页面上显示筛选结果,你需要在表单提交后使用WP_Query来执行查询,并显示匹配的文章。这通常是在处理表单提交后,在模板文件的某个部分(比如index.phparchive.php或者一个自定义的模板文件中)完成的。

下面是一个基本的例子,展示了如何在表单提交后使用WP_Query来显示筛选结果:

首先,确保你的表单像上面那样设置了正确的name属性(例如cat_group_1cat_group_2)。

然后,在你的模板文件中,你可以检查$_GET变量来确定是否有筛选条件被提交,并使用这些条件来执行查询。

<?php
// 检查是否有GET参数被提交
if (isset($_GET['cat_group_1']) || isset($_GET['cat_group_2'])) {
    // 设置查询参数
    $args = array(
        'post_type' => 'post', // 你可以根据需要更改为其他文章类型
        'posts_per_page' => -1, // 显示所有文章,或者设置具体的数量
    );

    // 如果cat_group_1有值,添加查询条件
    if (isset($_GET['cat_group_1']) && !empty($_GET['cat_group_1'])) {
        $cat_id_1 = intval($_GET['cat_group_1']);
        $args['tax_query'] = array(
            array(
                'taxonomy' => 'category', // 分类的taxonomy名称
                'field' => 'term_id',
                'terms' => $cat_id_1,
            ),
        );
    }

    // 如果cat_group_2有值,并且我们还没有设置tax_query(或想要添加额外的条件),添加查询条件
    if (isset($_GET['cat_group_2']) && !empty($_GET['cat_group_2']) && (!isset($args['tax_query']) || !is_array($args['tax_query']))) {
        $cat_id_2 = intval($_GET['cat_group_2']);
        $args['tax_query'] = array(
            array(
                'taxonomy' => 'category',
                'field' => 'term_id',
                'terms' => $cat_id_2,
            ),
        // 注意:这里不能简单地将两个条件放到同一个tax_query数组中,
        // 因为这样会查询同时属于这两个分类的文章(如果有的话)。
        // 如果你想要查询属于这两个分类中任意一个的文章,你需要使用更复杂的逻辑,
        // 比如组合两个独立的查询结果,或者使用JavaScript来处理表单提交并构建更复杂的查询。
        );
    } elseif (isset($_GET['cat_group_2']) && !empty($_GET['cat_group_2']) && is_array($args['tax_query'])) {
        // 如果你想要同时应用两个条件(这通常不是分类的用途,因为分类是层级结构的),
        // 你可以尝试使用'relation' => 'OR',但这在分类查询中可能不适用,因为它会查询所有子分类。
        // 在这种情况下,你可能需要构建两个独立的查询,并合并结果。
    }

    // 执行查询
    $query = new WP_Query($args);

    // 检查是否有文章
    if ($query->have_posts()) {
        // 开始循环
        while ($query->have_posts()) {
            $query->the_post();

            // 显示文章内容,例如标题、摘要等
            the_title();
            the_excerpt();

            // 其他你想要的文章内容

        }
        // 恢复原始查询
        wp_reset_postdata();
    } else {
        // 没有文章时显示的内容
        echo '没有找到匹配的文章。';
    }
} else {
    // 显示默认的页面内容或文章列表
} 
?>

请注意,上述代码示例中的tax_query部分仅用于演示如何根据单个分类ID进行筛选。由于分类是层级结构的,并且你通常不会想要同时根据两个不同的父分类进行筛选(除非你想要查找同时属于这两个分类的文章,这在分类结构中通常是不可能的),你可能需要根据你的具体需求调整逻辑。

如果你想要让用户能够选择来自不同父分类的子分类,并显示匹配这些子分类的文章,你可能需要构建更复杂的逻辑来处理这些选择,并可能需要在前端使用JavaScript来辅助表单的构建和提交。