WordPress纯代码实现多分类筛选(下拉方式)

WordPress纯代码实现多分类筛选(下拉方式)

方法一:使用分类ID控制选择显示的分类

要修改代码以便使用分类ID控制选择显示的分类,‌你需要在生成下拉菜单选项时添加一个条件检查,‌确保只显示那些ID在允许列表中的分类。‌以下是修改后的代码示例:‌

把以下代码放到想要显示的位置。

<form method="post" action="">
    <!-- 使用分类ID控制显示的分类 -->
    <label for="category_id_1">选择第一个分类:‌</label>
    <select id="category_id_1" name="category_ids[]">
        <option value="">请选择分类</option>
        <?php
        // 获取所有分类
        $categories = get_categories();
        // 定义允许显示的分类ID数组
        $allowed_categories = [1, 2, 3]; // 假设只允许显示ID为1, 2, 3的分类
        foreach ($categories as $category) {
            // 检查当前分类的ID是否在允许列表中
            if (in_array($category->term_id, $allowed_categories)) {
                echo '<option value="' . $category->term_id . '">' . $category->name . '</option>';
            }
        }
        ?>
    </select>

    <!-- 复制上面的代码块以添加更多选择框,‌只需更改id和label即可 -->

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

<?php
// 处理表单提交并查询文章
if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['category_ids'])) {
    // 从表单中获取分类ID数组
    $category_ids = $_POST['category_ids'];
    // 移除数组中的空值
    $category_ids = array_filter($category_ids);
    // 如果没有选择任何分类,‌则不显示任何内容
    if (empty($category_ids)) {
        echo '<p>未选择任何分类。‌</p>';
    } else {
        // 创建一个新的WP_Query对象来执行自定义查询
        $query = new WP_Query(array(
            'category__and' => $category_ids,
        ));

        // 检查是否有查询到的文章
        if ($query->have_posts()) {
            while ($query->have_posts()) {
                $query->the_post();
                // 显示文章标题和内容
                echo '<h2>' . get_the_title() . '</h2>';
                echo '<p>' . get_the_content() . '</p>';
            }
        } else {
            echo '<p>没有找到符合条件的文章。‌</p>';
        }

        // 重置文章数据
        wp_reset_postdata();
    }
}
?>

在这个示例中,‌$allowed_categories 数组定义了允许显示的分类ID。‌在生成下拉菜单时,‌代码会检查每个分类的ID是否在 $allowed_categories 数组中,‌如果是,‌则显示该分类的选项。‌用户提交表单后,‌后端代码会处理表单数据,‌并使用 WP_Query 类根据选择的分类ID来查询文章。‌

方法二:使用分类ID控制选择显示的分类(显示子分类)

要修改代码以显示特定分类的子分类,‌你需要使用WordPress的get_categories()函数,‌并通过child_of参数指定父分类的ID。‌以下是一个修改后的示例,‌其中将显示指定父分类下的所有子分类:‌

<form method="post" action="">
    <!-- 显示特定分类的子分类 -->
    <label for="category_id_1">选择第一个分类:‌</label>
    <select id="category_id_1" name="category_ids[]">
        <option value="">请选择分类</option>
        <?php
        // 获取指定父分类下的所有子分类
        $parent_category_id = 5; // 父分类ID,‌根据实际情况修改
        $categories = get_categories(array(
            'child_of' => $parent_category_id,
            'hide_empty' => 0, // 是否隐藏没有文章的分类
        ));
        foreach ($categories as $category) {
            echo '<option value="' . $category->term_id . '">' . $category->name . '</option>';
        }
        ?>
    </select>

    <!-- 复制上面的代码块以添加更多选择框,‌只需更改id、‌label和name即可 -->

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

<?php
// 处理表单提交并查询文章
if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['category_ids'])) {
    // 从表单中获取分类ID数组
    $category_ids = $_POST['category_ids'];
    // 移除数组中的空值
    $category_ids = array_filter($category_ids);
    // 如果没有选择任何分类,‌则不显示任何内容
    if (empty($category_ids)) {
        echo '<p>未选择任何分类。‌</p>';
    } else {
        // 创建一个新的WP_Query对象来执行自定义查询
        $query = new WP_Query(array(
            'category__and' => $category_ids,
        ));

        // 循环遍历查询到的文章并显示
        if ($query->have_posts()) {
            while ($query->have_posts()) {
                $query->the_post();
                echo '<h2>' . get_the_title() . '</h2>';
                echo '<p>' . get_the_content() . '</p>';
            }
        } else {
            echo '<p>没有找到符合条件的文章。‌</p>';
        }

        // 重置文章数据
        wp_reset_postdata();
    }
}
?>

在这个示例中,‌$parent_category_id变量被设置为父分类的ID,‌get_categories()函数使用child_of参数来获取这个父分类下的所有子分类。‌然后,‌代码遍历这些子分类,‌并为每个子分类创建一个<option>元素。‌你可以根据需要修改$parent_category_id的值来显示不同父分类下的子分类。‌

发表回复