方法一:WordPress纯代码实现多分类筛选(显示分类让用户选择)
了解您的需求,如果您想让用户从已有的分类中选择,而不是输入分类名称,您可以使用WordPress的分类下拉菜单(wp_dropdown_categories()
函数)来显示所有分类,并允许用户从中选择一个或多个分类。
以下是一个示例代码,它使用 wp_dropdown_categories()
函数来显示分类下拉菜单,并通过表单提交用户选择的分类ID来筛选文章:
<form method="post" action=""> <!-- 方法一:WordPress纯代码实现多分类筛选(显示分类让用户选择) -->
<label for="category_ids">请选择分类:</label>
<?php
// 显示分类下拉菜单
wp_dropdown_categories(array(
'name' => 'category_ids', // 设置下拉菜单的name属性
'id' => 'category_ids', // 设置下拉菜单的id属性
'show_option_all' => '选择所有分类', // 设置默认选项文本
'hide_empty' => 0, // 是否隐藏没有文章的分类
'hierarchical' => 1, // 是否按层级显示分类
'depth' => 3, // 设置显示的层级深度
'show_count' => 1, // 是否显示分类下的文章数
'selected' => 0, // 设置默认选中的分类ID
'echo' => 1 // 是否输出下拉菜单的HTML代码
));
?>
<input type="submit" value="筛选文章">
</form>
<?php
// 检查表单是否已提交
if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['category_ids'])) {
// 从表单中获取分类ID数组
$category_ids = $_POST['category_ids'];
// 创建一个新的WP_Query对象来执行自定义查询
$query = new WP_Query(array(
'category__in' => $category_ids, // 使用category__in参数来指定要包含的分类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();
}
?>
这段代码将显示一个分类下拉菜单,用户可以选择一个或多个分类。提交表单后,将执行一个自定义查询,显示用户所选分类中的所有文章。如果没有选择任何分类或没有文章属于所选分类,将显示相应的消息。
方法二:WordPress纯代码实现多分类筛选(显示分类让用户选择)(三个选择框)
要将表单修改为三个选择框(下拉菜单),每个选择框对应一个分类,用户可以从每个选择框中选择一个分类来筛选文章,你可以按照以下方式修改HTML和PHP代码:
HTML部分:
<form method="post" action=""> <!-- 方法二:WordPress纯代码实现多分类筛选(显示分类让用户选择)(三个选择框) -->
<!-- 方法三:使用三个选择框让用户选择分类来筛选文章 -->
<label for="category_id_1">选择第一个分类:</label>
<select id="category_id_1" name="category_ids[]">
<option value="">请选择分类</option>
<?php
// 获取所有分类
$categories = get_categories();
foreach ($categories as $category) {
echo '<option value="' . $category->term_id . '">' . $category->name . '</option>';
}
?>
</select>
<label for="category_id_2">选择第二个分类:</label>
<select id="category_id_2" name="category_ids[]">
<option value="">请选择分类</option>
<?php
// 再次获取所有分类
foreach ($categories as $category) {
echo '<option value="' . $category->term_id . '">' . $category->name . '</option>';
}
?>
</select>
<label for="category_id_3">选择第三个分类:</label>
<select id="category_id_3" name="category_ids[]">
<option value="">请选择分类</option>
<?php
// 第三次获取所有分类
foreach ($categories as $category) {
echo '<option value="' . $category->term_id . '">' . $category->name . '</option>';
}
?>
</select>
<input type="submit" value="筛选文章">
</form>
PHP部分(处理表单提交并查询文章):
<?php // 方法二:WordPress纯代码实现多分类筛选(显示分类让用户选择)(三个选择框)
// 引入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 = $_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, // 使用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();
}
}
?>
这样,用户就可以从三个下拉菜单中选择分类来筛选文章了。表单提交后,PHP代码会处理用户的选择,并执行相应的WordPress查询来显示结果。
方法三:WordPress纯代码实现多分类筛选(使用复选框让用户选择分类来筛选文章)
方法三是在方法二的基础上修改的
<!-- 这是上部份代码要和下部份代码组合使用 -->
<form method="post" action="">
<!-- 方法三:使用复选框让用户选择分类来筛选文章 -->
<label for="category_id_1">选择分类:</label>
<?php
// 获取所有分类
$categories = get_categories();
foreach ($categories as $category) {
echo '<input type="checkbox" id="category_id_' . $category->term_id . '" name="category_ids[]" value="' . $category->term_id . '">';
echo '<label for="category_id_' . $category->term_id . '">' . $category->name . '</label><br>';
}
?>
<input type="submit" value="筛选文章">
</form>
<!-- 这是下部份代码要和上部份代码组合使用 -->
<?php // 方法三:WordPress纯代码实现多分类筛选(使用复选框让用户选择分类来筛选文章)
// 引入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 = $_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, // 使用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();
}
}
?>
方法四:WordPress纯代码实现多分类筛选(使用复选框让用户选择分类来筛选文章)(按层级排序)
方法四是在方法三的基础上修改的,实现层级排序
在WordPress中,分类(Categories)通常不具有内置的“一级”和“二级”之分,这样的层级结构更多地与自定义分类法(如标签或自定义类型)或页面层级结构相关联。然而,你可以利用分类的父子关系来实现类似的层级排序。
若要根据父子关系对分类进行排序,并在表单中以层级方式显示它们,你可以使用以下代码:
<!-- 方法四:WordPress纯代码实现多分类筛选(使用复选框让用户选择分类来筛选文章)(按层级排序) -->
<!-- 这是上部份代码要和下部份代码组合使用 -->
<form method="post" action="">
<!-- 使用复选框让用户根据分类层级选择以筛选文章 -->
<?php
// 定义一个递归函数,用于按层级输出分类
function display_categories_hierarchically($categories, $parent = 0, $level = 0) {
foreach ($categories as $category) {
if ($category->parent == $parent) {
// 根据层级缩进
echo str_repeat(' ', $level);
echo '<input type="checkbox" id="category_id_' . $category->term_id . '" name="category_ids[]" value="' . $category->term_id . '">';
echo '<label for="category_id_' . $category->term_id . '">' . $category->name . '</label><br>';
// 递归调用以显示子分类
display_categories_hierarchically($categories, $category->term_id, $level + 1);
}
}
}
// 获取所有分类
$categories = get_categories(array(
'hide_empty' => 0, // 显示空分类
));
// 调用函数并按层级显示分类
display_categories_hierarchically($categories);
?>
<input type="submit" value="筛选文章">
</form>
<!-- 这是下部份代码要和上部份代码组合使用 -->
<?php // 方法四:WordPress纯代码实现多分类筛选(使用复选框让用户选择分类来筛选文章)(按层级排序)
// 引入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 = $_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, // 使用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();
}
}
?>
以下的代码是给方法四加样式,所以只改上部份代码,使用的时候和方法四的下部份
<!-- 方法四:WordPress纯代码实现多分类筛选(使用复选框让用户选择分类来筛选文章)(按层级排序) -->
<form method="post" action="">
<!-- 使用复选框和层级缩进让用户选择分类以筛选文章 -->
<div class="category-selector">
<?php
// 定义一个递归函数,用于按层级输出分类
function display_categories_hierarchically($categories, $parent = 0, $level = 0) {
foreach ($categories as $category) {
if ($category->parent == $parent) {
echo '<div class="category-item" style="margin-left: ' . ($level * 20) . 'px;">';
echo '<input type="checkbox" id="category_id_' . $category->term_id . '" name="category_ids[]" value="' . $category->term_id . '">';
echo '<label for="category_id_' . $category->term_id . '">' . $category->name . '</label>';
echo '</div>';
// 递归调用以显示子分类
display_categories_hierarchically($categories, $category->term_id, $level + 1);
}
}
}
// 获取所有分类
$categories = get_categories(array(
'hide_empty' => 0, // 显示空分类
));
// 调用函数并按层级显示分类
display_categories_hierarchically($categories);
?>
</div>
<input type="submit" value="筛选文章" class="submit-button">
</form>
<style>
.category-selector {
border: 1px solid #ccc;
padding: 10px;
margin-bottom: 10px;
}
.category-item {
margin-bottom: 5px;
}
.category-item label {
font-weight: normal;
}
.submit-button {
padding: 10px 20px;
background-color: #007bff;
color: white;
border: none;
cursor: pointer;
}
.submit-button:hover {
background-color: #0056b3;
}
</style>
以下是这是竖排对齐样式
为了实现每个分类对齐的样式,我们可以使用CSS的padding-left
属性来代替margin-left
,并确保每个分类项都占据相同的宽度(如果需要的话)。下面是一个修改后的示例,其中每个分类项都会对齐,并且子分类会有适当的缩进:
<!-- 这是上部份代码要和下部份代码组合使用 -->
<form method="post" action="">
<!-- 使用复选框和层级缩进让用户选择分类以筛选文章 -->
<div class="category-selector">
<?php
// 定义一个递归函数,用于按层级输出分类
function display_categories_hierarchically($categories, $parent = 0, $level = 0) {
foreach ($categories as $category) {
if ($category->parent == $parent) {
echo '<div class="category-item" style="padding-left: ' . ($level * 20) . 'px;">';
echo '<input type="checkbox" id="category_id_' . $category->term_id . '" name="category_ids[]" value="' . $category->term_id . '">';
echo '<label for="category_id_' . $category->term_id . '">' . $category->name . '</label>';
echo '</div>';
// 递归调用以显示子分类
display_categories_hierarchically($categories, $category->term_id, $level + 1);
}
}
}
// 获取所有分类
$categories = get_categories(array(
'hide_empty' => 0, // 显示空分类
));
// 调用函数并按层级显示分类
display_categories_hierarchically($categories);
?>
</div>
<input type="submit" value="筛选文章" class="submit-button">
</form>
<style>
.category-selector {
border: 1px solid #ccc;
padding: 10px;
margin-bottom: 10px;
}
.category-item {
margin-bottom: 5px;
}
.category-item label {
font-weight: normal;
display: inline-block;
width: calc(100% - 20px); /* Adjust width as needed */
}
.submit-button {
padding: 10px 20px;
background-color: #007bff;
color: white;
border: none;
cursor: pointer;
width: 100%; /* Make submit button full width */
box-sizing: border-box; /* Ensure padding is included in width */
}
.submit-button:hover {
background-color: #0056b3;
}
</style>
在这个示例中,我调整了.category-item label
的样式,使其成为一个inline-block
元素,并设置了一个宽度,以确保所有标签都对齐。提交按钮也被设置为100%宽度,以适应其父容器的宽度。你可以根据需要调整这些样式,以达到你想要的布局效果。
以下是这是横排对齐样式
若您希望分类以横排并对齐的方式展现,可以利用CSS的display: inline-block
或display: flex
属性来实现。以下是一个示例,其中运用了display: flex
来对齐分类,并确保它们在横排上整齐排列:
<!-- 这是上部份代码要和下部份代码组合使用 -->
<form method="post" action="">
<!-- 用户可通过复选框选择分类以筛选文章,分类以横排对齐方式展示 -->
<div class="category-selector">
<?php
// 定义一个递归函数,用于按层级以横排方式输出分类
function display_categories_hierarchically($categories, $parent = 0, $flex_container = true) {
if ($flex_container) {
echo '<div class="flex-container">';
}
foreach ($categories as $category) {
if ($category->parent == $parent) {
echo '<div class="flex-item">';
echo '<input type="checkbox" id="category_id_' . $category->term_id . '" name="category_ids[]" value="' . $category->term_id . '">';
echo '<label for="category_id_' . $category->term_id . '">' . $category->name . '</label>';
echo '</div>';
// 递归调用以显示子分类,但不为子分类创建新的flex容器
display_categories_hierarchically($categories, $category->term_id, false);
}
}
if ($flex_container) {
echo '</div>';
}
}
// 获取所有分类
$categories = get_categories(array(
'hide_empty' => 0, // 展示空分类
));
// 调用函数并按层级以横排方式显示分类
display_categories_hierarchically($categories);
?>
</div>
<input type="submit" value="筛选文章" class="submit-button">
</form>
<style>
.category-selector {
border: 1px solid #ccc;
padding: 10px;
margin-bottom: 10px;
}
.flex-container {
display: flex;
flex-wrap: wrap;
align-items: center;
}
.flex-item {
margin-right: 20px;
margin-bottom: 10px;
}
.flex-item label {
font-weight: normal;
}
.submit-button {
padding: 10px 20px;
background-color: #007bff;
color: white;
border: none;
cursor: pointer;
}
.submit-button:hover {
background-color: #0056b3;
}
</style>
在此示例中,我运用了display: flex
来创建一个灵活的容器,该容器内的项目会自动对齐并横排排列。每个分类项都被置于一个带有flex-item
类的<div>
中,并通过margin-right
来设置它们之间的间距。提交按钮的样式与之前保持一致。您可以根据需要调整间距、对齐方式等样式。
仅显示指定分类ID及其子分类,并对它们进行横排显示
如果您想在表单中仅显示指定分类ID及其子分类,并对它们进行横排显示,您需要对PHP代码进行一些调整。以下是一个示例,该示例将显示指定分类ID(例如ID为5)的分类及其所有子分类,并以横排方式展示:
<!-- 这是上部份代码要和下部份代码组合使用 -->
<form method="post" action="">
<!-- 用户可通过复选框横向选择指定分类ID及其子分类以筛选文章 -->
<div class="category-selector">
<?php
// 定义一个递归函数,用于按层级输出分类
function display_categories_hierarchically($categories, $parent = 0, $level = 0, $specified_id) {
$output = '';
foreach ($categories as $category) {
if ($category->parent == $parent) {
// 如果是指定分类ID或其子分类,则进行显示
if ($category->term_id == $specified_id || $level > 0) {
$output .= '<div class="category-item" style="display: inline-block; margin-right: 20px;">';
$output .= '<input type="checkbox" id="category_id_' . $category->term_id . '" name="category_ids[]" value="' . $category->term_id . '">';
$output .= '<label for="category_id_' . $category->term_id . '">' . $category->name . '</label>';
$output .= '</div>';
// 递归调用以显示子分类
$output .= display_categories_hierarchically($categories, $category->term_id, $level + 1, $specified_id);
}
}
}
return $output;
}
// 获取所有分类
$categories = get_categories(array(
'hide_empty' => 0, // 显示空分类
));
// 调用函数并显示指定分类ID及其子分类
echo display_categories_hierarchically($categories, 0, 0, 5); // 这里的5是指定的分类ID
?>
</div>
<input type="submit" value="筛选文章" class="submit-button">
</form>
<style>
.category-selector {
/* 根据需要添加样式 */
}
.category-item {
/* 根据需要添加样式,已设置为inline-block以实现横排 */
}
.submit-button {
/* 根据需要添加样式 */
padding: 10px 20px;
background-color: #007bff;
color: white;
border: none;
cursor: pointer;
}
.submit-button:hover {
background-color: #0056b3;
}
</style>
在这个示例中,display_categories_hierarchically
函数现在会返回一个字符串,其中包含HTML输出。这个函数会检查每个分类,如果它是指定的分类ID或其子分类,就会将其添加到输出字符串中。子分类会通过递归调用该函数来显示。最后,使用echo
将输出字符串打印到页面上。