情况: 我无法在WP_Query中成功地在混合OR和AND关系的两个类别中进行搜索的类别参数。
说明:
我有一个按地区,月份和年份排序的搜索/过滤器,效果很好!使用category_name
参数时,它将成功搜索区域。
<?php // These grab data from the URL which are submitted by the form
$p_topi = $_GET['topic'];
$p_reg = $_GET['region'];
$p_mon = $_GET['mon'];
$p_year = (int) $_GET['yr'];
?>
<?php
$archive_args = array(
'post_type' => 'thought_leadership',
'category_name' => $p_reg, // Pay attention to this
'year' => $p_year,
'monthnum'=> $p_mon,
'posts_per_page' => 100,
);
$archive_query = new WP_Query($archive_args);
if ($archive_query->have_posts()) : while ($archive_query->have_posts()) : $archive_query->the_post(); ?>
我被要求添加按主题排序。我通过用category_name
替换变量来测试它,效果很好。
$archive_args = array(
'post_type' => 'thought_leadership',
'category_name' => $p_topi, // Changed the variable to topic
'year' => $p_year,
'monthnum'=> $p_mon,
'posts_per_page' => 100,
);
然后,我尝试将两个变量组合在一起,并且工作正常。具体来说,它用作OR运算符,可以按区域或主题进行过滤。不会同时过滤两者。
$archive_args = array(
'post_type' => 'thought_leadership',
'category_name' => "$p_topi, $p_reg", // Combined the variables
'year' => $p_year,
'monthnum'=> $p_mon,
'posts_per_page' => 100,
);
然后我尝试使用+
符号使该参数同时接受两个变量。它可以工作,但是现在不能用作OR运算符。换句话说,我必须选择一个主题和地区,否则搜索将找不到任何结果。
$archive_args = array(
'post_type' => 'thought_leadership',
'category_name' => "$p_topi+$p_reg", // + makes it an AND operator
'year' => $p_year,
'monthnum'=> $p_mon,
'posts_per_page' => 100,
);
我研究了WP_Query,并找到了以下出色的参考文献:https://codex.wordpress.org/Class_Reference/WP_Query#Category_Parameters
我尝试了category__and
,但返回的结果没有符合该条件的帖子。
$archive_args = array(
'post_type' => 'thought_leadership',
'category__and' => array( 12, 5 ), // 12 = ID for topic, 5 = ID for region
'year' => $p_year,
'monthnum'=> $p_mon,
'posts_per_page' => 100,
);
我还测试了category__in
,但发现它不会显示类别的子级。这是一个问题,因为主题和地区都有孩子。像category__and
一样,它不会返回符合该条件的帖子。
$archive_args = array(
'post_type' => 'thought_leadership',
'category__in' => array( 12, 5 ),
'year' => $p_year,
'monthnum'=> $p_mon,
'posts_per_page' => 100,
);
根据@Muhammad tayyab的建议,我尝试使用tax_query
。我在&&的基础上使它起作用。
$archive_args = array(
'post_type' => 'thought_leadership',
'year' => $p_year,
'monthnum'=> $p_mon,
'posts_per_page' => 100,
'tax_query' => array(
'relation' => 'AND',
array(
'taxonomy' => 'category', // correct
'field' => 'slug', // correct
'terms' => $p_reg,
),
array(
'taxonomy' => 'category', // correct
'field' => 'slug', // correct
'terms' => $p_topi,
)
,)
);
但是我无法成功使OR运算符与嵌套数组一起使用。
$archive_args = array(
'post_type' => 'thought_leadership',
'year' => $p_year,
'monthnum'=> $p_mon,
'posts_per_page' => 100,
'tax_query' => array(
'relation' => 'OR',
array(
'taxonomy' => 'category',
'field' => 'slug',
'terms' => $p_reg,
),
array(
'relation' => 'AND',
array(
'taxonomy' => 'category',
'field' => 'slug',
'terms' => $p_reg,
),
array(
'taxonomy' => 'category',
'field' => 'slug',
'terms' => $p_topi,
),
),
),
);
主要问题: 您是否知道创建搜索将接受0、1或2个参数的任何方式?换句话说,我需要对其进行设置,以便我的用户可以搜索区域和/或主题,或者根本没有搜索。
答案 0 :(得分:1)
您的问题含糊不清,但这可能会有所帮助:
$args = array(
'post_type' => 'post',
'tax_query' => array(
'relation' => 'AND',
array(
'taxonomy' => 'movie_genre',
'field' => 'slug',
'terms' => array( 'action', 'comedy' ),
),
array(
'taxonomy' => 'actor',
'field' => 'term_id',
'terms' => array( 103, 115, 206 ),
'operator' => 'NOT IN',
),
),
);
$query = new WP_Query( $args );
您可以通过多种分类法进行搜索。您可以在relation
中使用来指定and
或not
关系。