Функция фильтрации сообщений по 2 таксономиям - PullRequest
0 голосов
/ 30 января 2019

У меня есть страница круизов , где я могу фильтровать по 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 результатов, но ресто отлично работает.

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' );

Я много об этом изучал и много пробовалразличных вещей, таких как использование ИЛИ и И вместо IN, и тому подобное.Я думаю, что я действительно близок к решению этого, но есть кое-что, что я не вижу.Я далеко, чтобы быть экспертом по PHP, поэтому я постараюсь ответить на все ваши вопросы.

Спасибо!

1 Ответ

0 голосов
/ 30 января 2019

В вашем операторе if в верхней функции он работает, только если установлены оба параметра $_GET['ct'] и $_GET['co'], потому что вы проверяете, установлены ли оба логически с помощью оператора &&.Вы должны разделить это с помощью логического оператора ИЛИ: ||.Это, однако, позволит вам передавать нулевые значения в tax_query.Таким образом, без реструктуризации всего, что у вас есть, вы можете просто сделать следующее:

1) Логически сгруппировать оператор if, убедившись, что текущий запрос является главным запросом Cruise Archive, И по крайней мере ct или co установлено.

2) Запустите пустой массив и добавьте к нему ct и co, если они установлены.

3) Установитереляционный оператор tax_query для AND, если , оба co и ct установлены.

4) Похоже, что реляционные операторы находятся не в том месте, его нужно настроить для обработки того, как каждый запрос связан вне массива.

5) Вместо этогоДля постоянной обработки переменных $ _GET вы можете назвать их как отдельные переменные, поэтому вам не нужно постоянно проверять, установлены ли они с isset(), и можете просто отправлять текстовые сообщения, если они возвращают истинное значение.

В конечном итоге это выглядело бы примерно так:

function belmondo_modify_cruise_archive_query( $query ) {
    // Make sure this is a Cruise Archive's Main query - AND - at at least 'ct' or 'co' are passed via GET.
    if( (is_archive() && is_post_type_archive('cruise') && $query->is_main_query()) && (isset($_GET['ct']) || isset($_GET['co'])) ){
        $tax_query = array(); // Tax Query starts empty (it's an array of arrays)

        // Define variables for ease of use
        $cruise_type   = ( isset($_GET['ct']) ) ? $_GET['ct'] : null;
        $cruise_county = ( isset($_GET['co']) ) ? $_GET['co'] : null;

        // If Type is set, add it to the query
        if( $cruise_type ){
            $tax_query[] = array(
                'taxonomy' => 'cruise_type',
                'field'    => 'slug',
                'terms'    => array( $cruise_type ),
            );
        }

        // If Country is set, add it to the query
        if( $cruise_county ){
            $tax_query[] = array(
                'taxonomy' => 'cruise_country',
                'field'    => 'slug',
                'terms'    => array( $cruise_county ),
            );
        }

        // If BOTH are set, set the relation, otherwise it's not needed
        if( $cruise_type && $cruise_county ){
            $tax_query['relation'] = 'AND';
        }

        $query->set( 'tax_query', $tax_query );
    } 
}
add_filter( 'pre_get_posts', 'belmondo_modify_cruise_archive_query' );

edit: Для ясности я добавил несколько скобок для группировки в ваш оператор if, поскольку у него 4 обязательных и , последний из которых является обязательным или .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...