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查询,并输出查询结果。如果没有提供有效的分类名称或别名,或者没有找到任何文章,它将显示相应的消息。