<form method="get" action="<?php echo home_url('/'); ?>">
<!-- 选择第一个父分类下的分类 -->
<select name="cat_group_1">
<option value="">展会分类</option>
<?php
$categories = get_categories(array('parent' => 6)); // 获取parent ID为6的所有分类
foreach ($categories as $cat) {
echo '<option value="' . esc_attr($cat->term_id) . '">' . esc_html($cat->name) . '</option>';
}
?>
</select>
<!-- 选择第二个父分类下的分类 -->
<select name="cat_group_2">
<option value="">地区分类</option>
<?php
$categories = get_categories(array('parent' => 28)); // 获取parent ID为28的所有分类
foreach ($categories as $cat) {
echo '<option value="' . esc_attr($cat->term_id) . '">' . esc_html($cat->name) . '</option>';
}
?>
</select>
<input type="submit" value="筛选">
</form>
然后,在处理筛选请求时,你可以分别检查cat_group_1
和cat_group_2
的值,并使用tax_query
中的relation
参数来组合这些条件。但是,请注意,tax_query
的relation
参数是在同一个tax_query
内部的不同条件之间使用的,而不是用于组合来自不同tax_query
的参数。如果你想要同时应用两个不同分类法的筛选条件,你需要将它们放在同一个tax_query
数组中,但这在分类(categories)的情况下并不适用,因为分类(categories)是一个单一的分类法(taxonomy)。
如果你的目标是基于两个不同的分类法(比如“分类”和“自定义分类法”)进行筛选,那么你需要为每个分类法创建一个单独的tax_query
数组,并在外层使用逻辑操作符(如relation
=> 'AND'
)来组合它们。但在当前的情况下,你只能基于用户从两个不同父分类下选择的一级分类进行筛选。
显示筛选结果
要在WordPress页面上显示筛选结果,你需要在表单提交后使用WP_Query
来执行查询,并显示匹配的文章。这通常是在处理表单提交后,在模板文件的某个部分(比如index.php
、archive.php
或者一个自定义的模板文件中)完成的。
下面是一个基本的例子,展示了如何在表单提交后使用WP_Query
来显示筛选结果:
首先,确保你的表单像上面那样设置了正确的name
属性(例如cat_group_1
和cat_group_2
)。
然后,在你的模板文件中,你可以检查$_GET
变量来确定是否有筛选条件被提交,并使用这些条件来执行查询。
<?php
// 检查是否有GET参数被提交
if (isset($_GET['cat_group_1']) || isset($_GET['cat_group_2'])) {
// 设置查询参数
$args = array(
'post_type' => 'post', // 你可以根据需要更改为其他文章类型
'posts_per_page' => -1, // 显示所有文章,或者设置具体的数量
);
// 如果cat_group_1有值,添加查询条件
if (isset($_GET['cat_group_1']) && !empty($_GET['cat_group_1'])) {
$cat_id_1 = intval($_GET['cat_group_1']);
$args['tax_query'] = array(
array(
'taxonomy' => 'category', // 分类的taxonomy名称
'field' => 'term_id',
'terms' => $cat_id_1,
),
);
}
// 如果cat_group_2有值,并且我们还没有设置tax_query(或想要添加额外的条件),添加查询条件
if (isset($_GET['cat_group_2']) && !empty($_GET['cat_group_2']) && (!isset($args['tax_query']) || !is_array($args['tax_query']))) {
$cat_id_2 = intval($_GET['cat_group_2']);
$args['tax_query'] = array(
array(
'taxonomy' => 'category',
'field' => 'term_id',
'terms' => $cat_id_2,
),
// 注意:这里不能简单地将两个条件放到同一个tax_query数组中,
// 因为这样会查询同时属于这两个分类的文章(如果有的话)。
// 如果你想要查询属于这两个分类中任意一个的文章,你需要使用更复杂的逻辑,
// 比如组合两个独立的查询结果,或者使用JavaScript来处理表单提交并构建更复杂的查询。
);
} elseif (isset($_GET['cat_group_2']) && !empty($_GET['cat_group_2']) && is_array($args['tax_query'])) {
// 如果你想要同时应用两个条件(这通常不是分类的用途,因为分类是层级结构的),
// 你可以尝试使用'relation' => 'OR',但这在分类查询中可能不适用,因为它会查询所有子分类。
// 在这种情况下,你可能需要构建两个独立的查询,并合并结果。
}
// 执行查询
$query = new WP_Query($args);
// 检查是否有文章
if ($query->have_posts()) {
// 开始循环
while ($query->have_posts()) {
$query->the_post();
// 显示文章内容,例如标题、摘要等
the_title();
the_excerpt();
// 其他你想要的文章内容
}
// 恢复原始查询
wp_reset_postdata();
} else {
// 没有文章时显示的内容
echo '没有找到匹配的文章。';
}
} else {
// 显示默认的页面内容或文章列表
}
?>
请注意,上述代码示例中的tax_query
部分仅用于演示如何根据单个分类ID进行筛选。由于分类是层级结构的,并且你通常不会想要同时根据两个不同的父分类进行筛选(除非你想要查找同时属于这两个分类的文章,这在分类结构中通常是不可能的),你可能需要根据你的具体需求调整逻辑。
如果你想要让用户能够选择来自不同父分类的子分类,并显示匹配这些子分类的文章,你可能需要构建更复杂的逻辑来处理这些选择,并可能需要在前端使用JavaScript来辅助表单的构建和提交。