我有几个注册到自定义帖子类型的分类法。我试图让用户可以选择通过这些分类法中的术语组合来过滤此自定义帖子类型中的帖子。
问题 如果用户为每个分类法至少选择一个术语,我就能得到我想要的结果,但如果只选择了一个术语(即没有为其他分类法选择任何术语),则结果为空。
问题的具体示例 我的自定义帖子类型是“产品”。我为此帖子类型创建了几种不同的分类法,并在每个分类法中创建了不同的术语,如下所示:
产品类型(分类1)
主题(分类2)
等等
如果用户选择“明信片”和“励志”,则查询能够返回同时选择“明信片”和“励志”的产品。但是,如果用户仅选中“明信片”,则结果为空。我想要的是查询返回所有选中“明信片”的帖子。
这是我尝试过的:
首先,我通过将过滤器输出为页面上的复选框来创建过滤器
<form method="GET">
<h3>Product Types</h3>
<?php $terms = get_terms([
'taxonomy' => 'product_types',
'hide_empty' => false
]);
foreach ($terms as $term) :
?>
<label onchange="this.form.submit()">
<input
type="checkbox"
name="collections[]"
value="<?php echo $term->slug; ?>"
<?php checked(
(isset($_GET['collections']) && in_array($term->slug, $_GET['collections']))
) ?>
/>
<?php echo $term->name; ?>
</label>
<?php endforeach; ?>
<h3>Themes</h3>
<?php $terms = get_terms([
'taxonomy' => 'themes',
'hide_empty' => false,
]);
foreach ($terms as $term) :
?>
<label onchange="this.form.submit()">
<input
type="checkbox"
name="collections[]"
value="<?php echo $term->slug; ?>"
<?php checked(
(isset($_GET['collections']) && in_array($term->slug, $_GET['collections']))
) ?>
/>
<?php echo $term->name; ?>
</label>
<?php endforeach; ?>
</form>
然后,我使用tax_query来查找与用户选择匹配的产品。
<?php
$collections_val = $_GET['collections'];
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
];
// Append our tax-query if we have terms. Make sure it is a valid string or array
$terms = $collections_val;
if ( $terms ) {
$args['tax_query'] = [
'relation' => 'AND',
[
'taxonomy' => 'product_types',
'field' => 'slug',
'terms' => $terms,
],
[
'taxonomy' => 'themes',
'field' => 'slug',
'terms' => $terms,
],
];
}
$product_query = new WP_Query( $args );
?>
<?php if ( $product_query->have_posts() ) :
while ( $product_query->have_posts() ): $product_query->the_post();
echo the_title();
endwhile;
else :
echo 'No results';
endif; ?>
我知道这就是我的代码告诉 WP 执行的操作 b/c 我正在使用 'relation' => 'AND'。但出于我的目的,即使只选择一种分类法下的一个术语,我也需要 WP 返回结果。
如果有人能指出我正确的方向,我将非常感激。已经做了很多研究,但找不到我的方法。谢谢!
我自己想出来了。关键是,如果用户仅勾选一个分类中的复选框,我需要使用“OR”来表示关系,而对于所有其他场景,我需要使用“AND”。
从这个答案得到了这个想法。
但是,如果您有超过 2 个分类法,事情会变得有点复杂,因为您必须考虑所有关系组合。您还需要仅查询带有勾选复选框的分类法。
例如,您需要根据所选内容分配不同的关系值:
税1 + 税2
关系应该是 ('AND')
只查询税1和税2
税1+税3
关系应该是 ('AND')
只查询税1和税3
税2 + 税3
关系应该是 ('AND')
只查询税2和税3
税1+税2+税3
关系应该是 ('AND')
查询所有 3 个分类法
仅税1或仅税2或仅税3
关系应该是('OR')
仅查询选中复选框的分类法(或者只查询所有 3 个,因为它是“OR”关系。它不会影响前端结果。显然,如果您有很多帖子,它可能会影响性能。)
如果有人需要,我可以发布我的最终代码。
我真的很想看到最终的代码😊谢谢。