我有一个page of cruises,在这里我可以按2种不同的分类法进行过滤(很抱歉,页面使用西班牙语,英语版本不完整)。 我遇到的问题是我无法使过滤器一直都在工作。例如,如果我使双重过滤器起作用,则过滤一种分类法不起作用。如果简单过滤器有效,则双重过滤器无效。
这是当前代码,可以完美地按2种分类法进行过滤,但是如果我仅使用一种进行过滤,则不会。
function belmondo_modify_cruise_archive_query( $query ) {
if( is_archive() && is_post_type_archive('cruise') && $query->is_main_query() && isset($_GET['ct']) && isset($_GET['co'])) {
$taxquery = array(
'relation' => 'AND',
array(
'taxonomy' => 'cruise_type',
'field' => 'slug',
'terms' => array($_GET['ct']),
'operator'=> 'AND',
),
array(
'taxonomy' => 'cruise_country',
'field' => 'slug',
'terms' => array($_GET['co']),
'operator'=> 'AND',
),
);
$query->set( 'tax_query', $taxquery );
}
}
add_filter( 'pre_get_posts', 'belmondo_modify_cruise_archive_query' );
在此之前,我还有其他代码,它可以完美运行,但没有默认代码。默认情况下,页面显示所有帖子,使用此代码,“显示全部”显示0条结果,但resto完美。
function belmondo_modify_cruise_archive_query( $query ) {
if( is_archive() && is_post_type_archive('cruise') && $query->is_main_query() && isset($_GET['ct']) && isset($_GET['co'])) {
$taxquery = array(
'relation' => 'AND',
array(
'taxonomy' => 'cruise_type',
'field' => 'slug',
'terms' => array($_GET['ct']),
'operator'=> 'AND',
),
array(
'taxonomy' => 'cruise_country',
'field' => 'slug',
'terms' => array($_GET['co']),
'operator'=> 'IN',
),
);
$query->set( 'tax_query', $taxquery );
} elseif( is_archive() && is_post_type_archive('cruise') && $query->is_main_query() ) {
$taxquery = array(
'relation' => 'OR',
array(
'taxonomy' => 'cruise_type',
'field' => 'slug',
'terms' => array($_GET['ct']),
'operator'=> 'IN',
),
array(
'taxonomy' => 'cruise_country',
'field' => 'slug',
'terms' => array($_GET['co']),
'operator'=> 'IN',
),
);
$query->set( 'tax_query', $taxquery );
}
}
add_filter( 'pre_get_posts', 'belmondo_modify_cruise_archive_query' );
我对此进行了很多研究,并且尝试了很多不同的事情,例如使用OR和AND代替IN,诸如此类。 我想我真的很想解决这个问题,但是有一些我没有看到。我距离成为PHP专家还很遥远,所以我将尽力回答您的所有问题。
谢谢!
答案 0 :(得分:1)
在顶部函数的TreeViewItem
语句中,只有同时设置了TreeViewItem
和if
时,它才会运行,因为您正在检查是否使用{{1 }}运算符。您应该使用逻辑OR运算符将其拆分:$_GET['ct']
。但是,这将使您将空值传递给$_GET['co']
。因此,无需重组所有内容,您可以执行以下操作:
1)在逻辑上将&&
语句分组在一起,确保当前请求是Cruise Cruise的Main-Query,并且至少||
或 tax_query
已设置。
2)启动一个空数组,并向其中添加if
和ct
。
3)如果同时设置了{strong> co
和ct
,则将co
的关系运算符设置为tax_query
。
4)您似乎把关系运算符放在错误的位置,应该将其设置为处理每个查询在数组 之外的关联方式。
5)您可能不想将$ _GET变量不断地处理,而是将它们命名为单个变量,这样就不必继续检查是否已将它们设置为AND
,并且如果返回则可以仅输入文本真实的价值。
最终看起来像这样:
co
编辑:为清楚起见,我在您的ct
语句中添加了一些分组括号,因为它有4个必需的和,最后一个是必需的或。