WordPress纯代码实现多分类筛选 (同时满足多分类)

WordPress纯代码实现多分类筛选 (同时满足多分类)

方法一:让用户输入分类ID方式筛选

若您想让用户通过某种方式输入分类ID,‌而不是通过URL的查询字符串参数来传递,‌您可以在WordPress页面上添加一个表单,‌让用户能够输入他们想要的分类ID。‌以下是一个简单的示例,‌展示了如何创建一个表单,‌让用户输入分类ID,‌并通过提交表单来筛选并展示文章。‌

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

首先,‌在WordPress页面的模板文件中添加以下HTML表单代码:‌

<form method="post" action=""> <!-- 方法一:让用户输入ID方式筛选 -->
    <label for="category_ids">请输入分类ID(‌用逗号分隔)‌:‌</label>
    <input type="text" id="category_ids" name="category_ids">
    <input type="submit" value="筛选文章">
</form>

然后,‌在同一模板文件的PHP部分,‌添加以下代码来处理表单提交,‌并执行文章查询:‌

<?php //方法一:让用户输入分类ID方式筛选
// 引入WordPress环境(‌如果尚未引入)‌
if (!defined('ABSPATH')) {
    define('WP_USE_THEMES', false);
    require_once('../../../wp-load.php'); // 根据实际WordPress安装位置调整路径
}

// 检查表单是否已提交
if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['category_ids'])) {
    // 从表单中获取分类ID字符串,‌并将其分割成数组
    $category_ids = explode(',', $_POST['category_ids']);

    // 如果没有提供有效的分类ID,‌则不显示任何内容
    if (empty($category_ids)) {
        echo '<p>未提供有效的分类ID。‌</p>';
    } else {
        // 创建一个新的WP_Query对象来执行自定义查询
        $query = new WP_Query(array(
            'category__and' => $category_ids, // 使用category__and参数来指定必须同时满足的分类ID数组
            'posts_per_page' => -1, // 获取所有符合条件的文章
            'orderby' => 'date', // 按照文章发布日期排序
            'order' => 'DESC' // 降序排列
        ));

        // 检查是否有文章被查询出来
        if ($query->have_posts()) : ?>
            <ul>
                <?php // 开始循环输出文章
                while ($query->have_posts()) : $query->the_post(); ?>
                    <li>
                        <a href="<?php echo get_permalink(); ?>"><?php echo get_the_title(); ?></a>
                        <!-- 您可以在此处添加更多文章信息,‌例如发布日期、‌作者等 -->
                    </li>
                <?php endwhile; ?>
            </ul>
        <?php else : ?>
            <p>未找到同时属于所有指定分类的文章。‌</p>
        <?php endif;
        // 重置文章数据
        wp_reset_postdata();
    }
}
?>

这段代码首先检查表单是否已通过POST方法提交,‌并且是否包含category_ids字段。‌如果满足条件,‌它将从表单数据中获取分类ID字符串,‌并将其分割成一个数组。‌然后,‌它将使用这个数组来执行文章查询,‌并展示结果。‌如果没有提供有效的分类ID,‌它将显示一条错误消息。‌

方法二:让用户输入分类别名方式筛选 (在方法一的基础上修改成)

要将表单修改为使用分类名称而不是分类ID,‌您需要做几个更改。‌首先,‌表单的输入字段将接收分类名称,‌然后您需要在后端将这些名称转换为ID以进行查询。‌以下是修改后的代码:‌

<form method="post" action=""> <!-- 方法二:让用户输入分类别名方式筛选 -->
    <label for="category_names">请输入分类名称(‌用逗号分隔)‌:‌</label>
    <input type="text" id="category_names" name="category_names">
    <input type="submit" value="筛选文章">
</form>

<?php // 方法二:让用户输入分类别名方式筛选
// 引入WordPress环境(‌如果尚未引入)‌
if (!defined('ABSPATH')) {
    define('WP_USE_THEMES', false);
    require_once('../../../wp-load.php'); // 根据实际WordPress安装位置调整路径
}

// 检查表单是否已提交
if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['category_names'])) {
    // 从表单中获取分类名称字符串,‌并将其分割成数组
    $category_names = explode(',', $_POST['category_names']);

    // 如果没有提供有效的分类名称,‌则不显示任何内容
    if (empty($category_names)) {
        echo '<p>未提供有效的分类名称。‌</p>';
    } else {
        // 根据分类名称获取分类ID
        $category_ids = [];
        foreach ($category_names as $category_name) {
            $category = get_category_by_slug($category_name);
            if ($category) {
                $category_ids[] = $category->term_id;
            }
        }

        // 如果没有找到任何分类ID,‌则显示消息
        if (empty($category_ids)) {
            echo '<p>未找到任何与提供的分类名称匹配的分类。‌</p>';
        } else {
            // 创建一个新的WP_Query对象来执行自定义查询
            $query = new WP_Query(array(
                'category__and' => $category_ids, // 使用category__and参数来指定必须同时满足的分类ID数组
                'posts_per_page' => -1, // 获取所有符合条件的文章
                'orderby' => 'date', // 按照文章发布日期排序
                'order' => 'DESC' // 降序排列
            ));

            // 检查是否有文章被查询出来
            if ($query->have_posts()) : ?>
                <ul>
                    <?php // 开始循环输出文章
                    while ($query->have_posts()) : $query->the_post(); ?>
                        <li>
                            <a href="<?php echo get_permalink(); ?>"><?php echo get_the_title(); ?></a>
                            <!-- 您可以在此处添加更多文章信息,‌例如发布日期、‌作者等 -->
                        </li>
                    <?php endwhile; ?>
                </ul>
            <?php else : ?>
                <p>未找到同时属于所有指定分类的文章。‌</p>
            <?php endif;

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

在这个修改后的代码中,‌表单现在接收分类名称而不是分类ID。‌当用户提交表单时,‌PHP脚本会将分类名称转换为分类ID,‌并使用这些ID来查询文章。‌如果没有找到与提供的分类名称匹配的分类,‌或者没有文章同时属于所有指定的分类,‌则会显示相应的消息。‌

方法三:让用户输入分类名方式筛选 (在方法二的基础上修改成)

要使用分类名称而不是别名进行查询,‌您需要让用户输入分类的名称,‌然后在后台将这些名称转换为对应的分类ID。‌这可以通过WordPress的get_term_by函数来实现,‌它可以根据分类的名称(‌或其他标识符)‌检索分类对象。‌

以下是修改后的代码,‌它允许用户输入分类名称,‌并将这些名称转换为ID以进行查询:‌

<form method="post" action=""> <!-- 方法三:让用户输入分类名方式筛选 -->
    <label for="category_names">请输入分类名称(‌用英文逗号分隔)‌:‌</label>
    <input type="text" id="category_names" name="category_names" placeholder="例如:‌新闻,博客">
    <input type="submit" value="筛选文章">
</form>

<?php //方法三:让用户输入分类名方式筛选
// 引入WordPress环境(‌如果尚未引入)‌
if (!defined('ABSPATH')) {
    define('WP_USE_THEMES', false);
    require_once('../../../wp-load.php'); // 根据实际WordPress安装位置调整路径
}

// 检查表单是否已提交
if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['category_names'])) {
    // 从表单中获取分类名称字符串,‌并将其分割成数组
    $category_names = explode(',', $_POST['category_names']);
    $category_ids = [];

    // 将分类名称转换为分类ID
    foreach ($category_names as $category_name) {
        $category = get_term_by('name', trim($category_name), 'category');
        if ($category) {
            $category_ids[] = $category->term_id;
        }
    }

    // 如果没有提供有效的分类名称,‌则不显示任何内容
    if (empty($category_ids)) {
        echo '<p>未提供有效的分类名称或分类不存在。‌</p>';
    } else {
        // 创建一个新的WP_Query对象来执行自定义查询
        $query = new WP_Query(array(
            'category__and' => $category_ids, // 使用category__and参数来指定必须同时满足的分类ID数组
            'posts_per_page' => -1, // 获取所有符合条件的文章
            'orderby' => 'date', // 按照文章发布日期排序
            'order' => 'DESC' // 降序排列
        ));

        // 检查是否有文章被查询出来
        if ($query->have_posts()) : ?>
            <ul>
                <?php // 开始循环输出文章
                while ($query->have_posts()) : $query->the_post(); ?>
                    <li>
                        <a href="<?php echo get_permalink(); ?>"><?php echo get_the_title(); ?></a>
                        <!-- 您可以在此处添加更多文章信息,‌例如发布日期、‌作者等 -->
                    </li>
                <?php endwhile; ?>
            </ul>
        <?php else : ?>
            <p>未找到同时属于所有指定分类的文章。‌</p>
        <?php endif;

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

在这段代码中,‌用户现在需要输入分类的名称,‌而不是分类的ID。‌代码会将这些名称转换为对应的分类ID,‌并使用这些ID来查询文章。‌如果用户输入了一个不存在的分类名称,‌将显示一个错误消息。‌

方法四:‌让用户输入分类名或分类别名方式筛选

为了修改代码以使其同时支持分类名称和分类别名,‌我们需要对获取分类ID的逻辑进行一些调整。‌具体来说,‌我们将使用get_term_by函数来尝试根据名称或别名获取分类。‌如果根据名称获取不到,‌我们将尝试根据别名获取。‌

以下是修改后的PHP代码段:‌

<form method="post" action="">
    <!-- 方法四:‌让用户输入分类名或分类别名方式筛选 -->
    <label for="category_names">请输入分类名称或分类别名(‌用英文逗号分隔)‌:‌</label>
    <input type="text" id="category_names" name="category_names" placeholder="例如:‌新闻,blog">
    <input type="submit" value="筛选文章">
</form>

<?php
// 方法四:‌让用户输入分类名或分类别名方式筛选
// 引入WordPress环境(‌如果尚未引入)‌
if (!defined('ABSPATH')) {
    define('WP_USE_THEMES', false);
    require_once('../../../wp-load.php'); // 根据实际WordPress安装位置调整路径
}

// 检查表单是否已提交
if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['category_names'])) {
    // 从表单中获取分类名称或别名字符串,‌并将其分割成数组
    $category_names = explode(',', $_POST['category_names']);
    $category_ids = [];

    // 将分类名称或别名转换为分类ID
    foreach ($category_names as $category_name) {
        $category_name = trim($category_name);
        $category = get_term_by('name', $category_name, 'category');
        if (!$category) {
            $category = get_term_by('slug', $category_name, 'category');
        }
        if ($category) {
            $category_ids[] = $category->term_id;
        }
    }

    // 如果没有提供有效的分类名称或别名,‌则不显示任何内容
    if (empty($category_ids)) {
        echo '<p>未提供有效的分类名称或分类别名,‌或分类不存在。‌</p>';
    } else {
        // 创建一个新的WP_Query对象来执行自定义查询
        $query = new WP_Query(array(
            'category__and' => $category_ids, // 使用category__and参数来指定必须同时满足的分类ID数组
            'posts_per_page' => -1, // 获取所有符合条件的文章
            'orderby' => 'date', // 按照文章发布日期排序
            'order' => 'DESC' // 降序排列
        ));

        // 检查是否有文章被查询出来
        if ($query->have_posts()) : ?>
            <ul>
                <?php // 开始循环输出文章
                while ($query->have_posts()) : $query->the_post(); ?>
                    <li>
                        <a href="<?php echo get_permalink(); ?>"><?php echo get_the_title(); ?></a>
                        <!-- 您可以在此处添加更多文章信息,‌例如发布日期、‌作者等 -->
                    </li>
                <?php endwhile; ?>
            </ul>
        <?php else : ?>
            <p>未找到同时属于所有指定分类的文章。‌</p>
        <?php endif;

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

这段代码首先检查表单是否已提交,‌并从表单中获取分类名称或别名字符串。‌然后,‌它将字符串分割成数组,‌并遍历数组中的每个元素,‌尝试根据名称或别名获取分类ID。‌如果找到了分类ID,‌就将其添加到$category_ids数组中。‌最后,‌它使用这些分类ID执行一个自定义的WP_Query查询,‌并输出查询结果。‌如果没有提供有效的分类名称或别名,‌或者没有找到任何文章,‌它将显示相应的消息。‌