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

WordPress自带的分类(Categories)本身并不直接支持多条件筛选,但你可以通过结合WordPress的查询参数(Query Parameters)和WP_Query来模拟多条件分类筛选功能。

以下是一个使用WordPress自带分类实现多条件分类筛选的基本步骤:

1. 创建筛选表单

在你的WordPress模板文件(如archive.phpsearch.php或自定义的页面模板)中,创建一个HTML表单来接收用户的筛选条件。

<form method="get" action="<?php echo home_url('/'); ?>">
    <!-- 分类1 -->
    <select name="cat1">
        <option value="">分类1(全部)</option>
        <?php
        $categories = get_categories();
        foreach ($categories as $cat) :
            echo '<option value="' . esc_attr($cat->term_id) . '">' . esc_html($cat->name) . '</option>';
        endforeach;
        ?>
    </select>

    <!-- 分类2(如果需要第二个分类条件)-->
    <select name="cat2">
        <option value="">分类2(全部)</option>
        <!-- 重复上面的循环来生成第二个分类的选项 -->
    </select>

    <!-- 其他筛选条件,如日期、作者等 -->

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

2. 处理表单提交并构建查询

当用户提交表单时,你需要捕获筛选条件并使用WP_Query来执行查询。由于WordPress的cat参数只支持单个分类ID,你不能直接通过cat参数传递多个分类ID。但是,你可以使用tax_query参数来模拟多条件分类筛选。

if (isset($_GET['cat1']) || isset($_GET['cat2'])) {
    $tax_query = array();

    if (isset($_GET['cat1']) && $_GET['cat1'] != '') {
        $tax_query[] = array(
            'taxonomy' => 'category',
            'field' => 'term_id',
            'terms' => array($_GET['cat1']),
        );
    }

    if (isset($_GET['cat2']) && $_GET['cat2'] != '') {
        $tax_query[] = array(
            'taxonomy' => 'category',
            'field' => 'term_id',
            'terms' => array($_GET['cat2']),
            'operator' => 'AND' // 如果你想要同时满足两个分类条件,可以使用AND
            // 如果想要满足任一分类条件,可以省略operator或使用'IN'
        );
    }

    $args = array(
        'post_type' => 'post', // 假设你的文章是post类型
        'tax_query' => $tax_query,
        // 可以添加其他查询参数,如'posts_per_page', 'order', 'orderby'等
    );

    $query = new WP_Query($args);

    // 遍历并显示查询结果
    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            // 输出文章内容
        }
        wp_reset_postdata();
    } else {
        // 没有找到匹配的文章
    }
}

在上面的代码中,我们使用tax_query参数来构建分类查询。每个分类条件都被添加为一个数组元素到$tax_query数组中。你可以根据需要添加更多的分类条件。

请注意,这个示例假设你想要同时满足两个分类条件(使用AND操作符)。如果你想要满足任一分类条件,你可以省略operator参数或使用'IN'操作符。

另外,如果你的筛选条件还包括其他非分类的筛选条件(如日期、作者等),你可以将它们添加到$args数组中,与tax_query一起使用。

以上的代码如何使用方法

为了将上述代码集成到你的WordPress模板中并使其正常工作,你需要确保将其放置在正确的位置,并根据你的需求进行调整。以下是如何使用这些代码的基本步骤:

  1. 创建筛选表单首先,在你的WordPress模板文件(比如category.phparchive.phpsearch.php或自定义的页面模板)中创建一个筛选表单。表单的action属性通常设置为你的网站主页(home_url('/')),并使用method="get"以便将筛选条件作为查询参数发送到服务器。将以下HTML代码片段放置在你的模板文件的适当位置:
<form method="get" action="<?php echo home_url('/'); ?>">
    <!-- 分类1 -->
    <select name="cat1">
        <option value="">分类1(全部)</option>
        <?php
        $categories = get_categories();
        foreach ($categories as $cat) :
            echo '<option value="' . esc_attr($cat->term_id) . '">' . esc_html($cat->name) . '</option>';
        endforeach;
        ?>
    </select>

    <!-- 分类2(如果需要第二个分类条件)-->
    <select name="cat2">
        <option value="">分类2(全部)</option>
        <?php
        // 重复上面的循环来生成第二个分类的选项
        $categories = get_categories();
        foreach ($categories as $cat) :
            echo '<option value="' . esc_attr($cat->term_id) . '">' . esc_html($cat->name) . '</option>';
        endforeach;
        ?>
    </select>

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

处理表单提交并构建查询

在表单下方或你的模板文件的适当位置,添加PHP代码来处理表单提交并构建查询。将以下PHP代码片段放置在那里:

<?php
if (isset($_GET['cat1']) || isset($_GET['cat2'])) {
    $tax_query = array();

    if (isset($_GET['cat1']) && $_GET['cat1'] != '') {
        $tax_query[] = array(
            'taxonomy' => 'category',
            'field' => 'term_id',
            'terms' => array($_GET['cat1']),
        );
    }

    if (isset($_GET['cat2']) && $_GET['cat2'] != '') {
        $tax_query[] = array(
            'taxonomy' => 'category',
            'field' => 'term_id',
            'terms' => array($_GET['cat2']),
            'operator' => 'AND' // 如果你想要同时满足两个分类条件
        );
    }

    $args = array(
        'post_type' => 'post', // 假设你的文章是post类型
        'tax_query' => $tax_query,
        // 可以添加其他查询参数,如'posts_per_page', 'order', 'orderby'等
    );

    $query = new WP_Query($args);

    // 遍历并显示查询结果
    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            // 输出文章内容,比如标题、内容等
            the_title();
            // ... 其他你想显示的字段
        }
        wp_reset_postdata();
    } else {
        // 没有找到匹配的文章
        echo '没有找到匹配的文章。';
    }
}
?>
  1. 样式化和调整根据你的网站设计,对筛选表单和结果列表进行样式化。你可能需要添加CSS样式来匹配你的主题,或者通过JavaScript来增强用户体验(比如AJAX筛选)。
  2. 测试在你的本地开发环境或测试服务器上测试你的筛选功能,确保它按预期工作。你可能需要根据你的网站结构和需求进行一些调整。
  3. 部署一旦你在测试环境中验证了筛选功能,就可以将其部署到你的生产网站上了。记得在部署之前备份你的网站数据。