我有几个分类法注册到一个定制的post类型。我试图通过这些分类中的术语组合,让用户可以选择过滤这种自定义post类型中的帖子。
如果用户为每个分类法选择至少一个术语,但如果总体上只选择了一个项(即没有为其他分类法选择任何项),则结果为空。
问题的具体例子----我的定制post类型是“产品”。我为这个post类型创建了几个不同的分类,并在每个分类法中创建了不同的术语,如下所示:
产品类型(分类法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‘=>和。但就我的目的而言,我需要WP返回结果,即使只选择了一个分类法下的一个术语。
如果有人能指出正确的方向,我会非常感激的。已经做了很多研究,但找不到我的方向。谢谢!
发布于 2022-12-04 15:19:11
我自己想出来的。关键是,如果用户只在一个分类法中选中复选框(Es),对于所有其他场景,我需要对关系使用'OR‘和’‘。
是从this answer那里得到的。
如果你有两个以上的分类,事情会变得更复杂,因为你必须考虑所有的关系组合。您还需要只查询带有勾选复选框的分类法。
例如,您需要根据所选内容分配不同的关系值:
税1+税2
关系应该是(‘和’)
只查询税1及税2
税1+税3
关系应该是(‘和’)
只查询税1及税3
税2+税3
关系应该是(‘和’)
只查询税务2及税款3
税1+税2+税3
关系应该是(‘和’)
查询所有三个分类法
只征收税1或只缴税2或只缴税3
关系应该是(‘或’)
只使用复选框查询分类法(或者只查询所有3项,因为这是“OR”关系。它不会影响前端的结果。显然,如果你有很多帖子,它可能会影响你的性能。)
如果有人想要的话,我可以贴出我的最后代码。
https://stackoverflow.com/questions/74671613
复制相似问题