我们有一个自定义帖子类型,即hr优先级,它具有多个与之相关的自定义分类法。这些分类法包含多个术语,每个帖子可以具有从这些分类法分配的1对多术语。我们正在尝试建立一个过滤器,以允许访问者在多个分类法中按这些术语的组合来搜索/过滤结果。
例如: 职位“样本职位”的分类法为“年”,术语“ 2018”,“组织”分类法为术语“理事会成员”,“国家”分类法为术语“加拿大”。 “其他示例”一词的“年份”一词为“ 2016”,“组织”分类法为“经理”,“国家”分类法为“加拿大”。 “第三职位”一词的分类法为“年份”,其术语为“ 2018”,“组织”分类法为“安全团队”,而“国家”分类法为“冰岛”。
我们希望能够按所有这些条件过滤结果,因此,如果我选择仅查看year = 2018年以来的帖子,我将获得“第三篇帖子”和“示例帖子”,但是如果我进一步按country = canada筛选出的那些内容,我只会收到“示例帖子”(因为过滤器将为year = 2018和country =“ canada”)。
我正在使用“搜索和过滤器”插件。我尝试将archive-hr-priority.php模板页面用于结果,但结果中根本无法识别该模板。然后,我使用了自定义分类模板,例如taxonomy-year.php,该模板仅使用一个过滤器,因此当我按year = 2018进行过滤时,返回的唯一帖子是从2018年开始的,但是当我添加第二个时搜索字词,例如country =“ canada”,它返回了country = canada的所有结果,但包含所有年份字词。
这是我的搜索和过滤器短代码:
echo do_shortcode( '[searchandfilter post_types="hr-priority" fields="year,country"]' );
这是我在自定义分类模板中使用的代码(我为每个分类创建了一个代码):
if (is_tax() || is_category() || is_tag() ){
$qObj = get_queried_object();
$args = array(
'post_type'=>'hr-priority',
'tax_query' => array( array(
'taxonomy' => $qObj->taxonomy,
'field' => 'id',
'terms' => $qObj->term_id
)),
'post_status'=>'publish',
'posts_per_page'=>20
);
}
echo($qObj->slug); //just to view the term/s being used
$wpb_all_query = new WP_Query($args);
if ( $wpb_all_query->have_posts() ) : ?>
<?php
/* Start the Loop */
while ( $wpb_all_query->have_posts() ) : $wpb_all_query->the_post();
get_template_part( 'template-parts/post/hr-priorities-post', get_post_format() );
endwhile;
这是提交Search&Filter参数后返回的URL:
https://exampleurl.org/org/council-member?country=afghanistan&post_types=hr-priority-un
如何获取它以多个分类法中的多个术语进行过滤,并仅返回与所有搜索参数匹配的结果?
答案 0 :(得分:1)
我对“搜索和过滤器”不熟悉,但这看起来很容易与基础WP_Query
一起使用。您可以使用以下方法搜索多个分类法:
$tax_query = array(
'relation' => 'AND'
);
// get query parameters and compose the condition
$year = $_GET['year'];
if (!empty($year)) {
$cond = array(
'taxonomy' => 'year',
'field' => 'slug',
'terms' => $year,
));
$tax_query[] = $cond;
}
// Repeat for other parameters
$args = array(
'post_type'=>'hr-priority',
'tax_query' => $tax_query,
'post_status'=>'publish',
'posts_per_page'=>20,
);
答案 1 :(得分:0)
我想出了一些其他问题的答案(请参见下面的引用列表)。
首先,我必须在 可能使用的每个分类法中获取术语的完整列表(这样,如果不查询一种税,我可以提供一些价值,而不是空白字符串,用于那个tax_query的'term' =>
值),然后将其转换为子段(下面的第二行), then 然后,我使用get_query_var()
函数来获取每个查询项/任何分类法。
$allStates = get_terms('country', $args = array('hide_empty' => false));
$state_names = wp_list_pluck( $allStates, 'slug' );
$country = (get_query_var('country', $state_names));
然后,我将get_query_var()
的值发送到我的tax_query数组中(我本可以在$args
数组中完成此操作,但在其中更容易阅读),但需要使用'relation' => 'AND'
(as pointed out in another suggested answer)来确保将每个参数都包含在查询参数中:
$tax_query = array(
'relation' => 'AND',
array(
'taxonomy' => 'country',
'field' => 'slug',
'terms' => $country,
),
array(
'taxonomy' => 'org',
'field' => 'slug',
'terms' => $org,
),);
此后,它是相同的一般wp_query()
:
$args = array(
'post_type'=>'hr-priority',
'tax_query' => $tax_query,
'post_status'=>'publish',
'posts_per_page'=>20
);
// print_r($tax_query);
$wp_all_query = new WP_Query($args);
if ( $wp_all_query->have_posts() ) : ?>
用于找出解决方案的答案的引用列表(谢谢!): https://wordpress.stackexchange.com/a/35611/146095 https://wordpress.stackexchange.com/a/157167/146095