用于按2个分类法筛选帖子的功能

时间:2019-01-30 19:57:44

标签: php wordpress custom-taxonomy

我有一个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专家还很遥远,所以我将尽力回答您的所有问题。

谢谢!

1 个答案:

答案 0 :(得分:1)

在顶部函数的TreeViewItem语句中,只有同时设置了TreeViewItemif时,它才会运行,因为您正在检查是否使用{{1 }}运算符。您应该使用逻辑OR运算符将其拆分:$_GET['ct']。但是,这将使您将空值传递给$_GET['co']。因此,无需重组所有内容,您可以执行以下操作:

1)在逻辑上将&&语句分组在一起,确保当前请求是Cruise Cruise的Main-Query,并且至少|| tax_query已设置。

2)启动一个空数组,并向其中添加ifct

3)如果同时设置了{strong> coct,则将co的关系运算符设置为tax_query

4)您似乎把关系运算符放在错误的位置,应该将其设置为处理每个查询在数组 之外的关联方式。

5)您可能不想将$ _GET变量不断地处理,而是将它们命名为单个变量,这样就不必继续检查是否已将它们设置为AND,并且如果返回则可以仅输入文本真实的价值。

最终看起来像这样:

co

编辑:为清楚起见,我在您的ct语句中添加了一些分组括号,因为它有4个必需的,最后一个是必需的

相关问题