Условные аргументы для WP_Query и tax_query в зависимости от наличия значения в $somevar

20 июн. 2012 г., 04:09:11
Просмотры: 27.2K
Голосов: 8

Я создал новый запрос для произвольного типа записей 'courses'. Результаты затем фильтруются с помощью tax_query, запрашивая 3 пользовательские таксономии, соответствующие одному или нескольким ID терминов. Они передаются со страницы поиска.

Вот код, который работает нормально до настоящего момента:

// Давайте эмулируем отправленные ID из виджета поиска курсов
// со статическими ID терминов для каждой пользовательской таксономии
$search_course_area = array(65, 62);
$search_course_level = array(117); //52 для дальнейшей фильтрации
$search_course_mode = array(54, 56); 


//Начинаем новый запрос
$query = new WP_Query(
    array(
        //Получаем ВСЕ записи курсов
        'post_type' => 'course',
        'posts_per_page' => '-1',
        //Фильтруем таксономии по ID, переданным из виджета поиска курсов
        'tax_query' => array(
                //Устанавливаем условие отношения для фильтров
                //в данном случае мы используем AND, так как это явно
                //установлено пользователем при поиске
                'relation' => 'AND',
                //Сначала проверяем и получаем course-area на основе ID
                array(
                    'taxonomy' => 'course-area',
                    'field' => 'id',
                    'terms' => $search_course_area
                ),
                //И снова для второй таксономии
                array(
                    'taxonomy' => 'study-levels',
                    'field' => 'id',
                    'terms' => $search_course_level
                ),
                //Наконец проверяем и получаем course-mode на основе ID
                array(
                    'taxonomy' => 'course-mode',
                    'field' => 'id',
                    'terms' => $search_course_mode
                ),
        )
    )
);

То, с чем у меня возникли небольшие трудности - это если передается пустой массив, это, очевидно, нарушит запрос и не вернет результатов.

Какой был бы самый чистый способ решить эту проблему?

0
Все ответы на вопрос 2
3
23

Вы можете определить аргументы за пределами инициализации WP_Query:

<?php
$tax_query = array('relation' => 'AND');
    if (isset($search_course_area))
    {
        $tax_query[] =  array(
                'taxonomy' => 'course-area',
                'field' => 'id',
                'terms' => $search_course_area
            );
    }
    if (isset($search_course_level))
    {
        $tax_query[] =  array(
                'taxonomy' => 'study-levels',
                'field' => 'id',
                'terms' => $search_course_level
            );
    }
    if (isset($search_course_mode))
    {
        $tax_query[] =  array(
                'taxonomy' => 'course-mode',
                'field' => 'id',
                'terms' => $search_course_mode
            );
    }

$query = new WP_Query(
    array(
        //Извлекаем ВСЕ записи курсов
        'post_type' => 'course',
        'posts_per_page' => '-1',
        //Фильтруем таксономии по id, переданным из виджета поиска курсов
        'tax_query' => $tax_query,
    )
);
?>
20 июн. 2012 г. 04:44:55
Комментарии

Большое спасибо, Джессика!

Я заблудился в минном поле массивов, очень признателен

Craig Pearson Craig Pearson
20 июн. 2012 г. 05:05:45

@CraigPearson Без проблем, рада была помочь. :)

jessica jessica
20 июн. 2012 г. 05:08:07

Это потрясающе - огромное спасибо!

klewis klewis
19 авг. 2022 г. 18:35:16
0

На случай, если кто-то увидит это сейчас, если у вас несколько условий в вашем экземпляре запроса, вам следует обернуть вашу переменную в другой массив.. что-то вроде:

$meta_query = array();

if ( 0 == $current_user->ID ) {
    $meta_query[] = array(array(
        'key'     => 'restrito_para_visualizar',
        'value'   => '1',
        'compare' => '!=',
        'type'    => 'CHAR',
    ),
    array(
        'key'     => 'ativo',
        'value'   => '1',
        'compare' => '=',
        'type'    => 'NUMERIC',
    ));
} else {
    $meta_query[] = array(
    array(
        'key'     => 'ativo',
        'value'   => '1',
        'compare' => '=',
        'type'    => 'NUMERIC',
    )); 
}
3 окт. 2018 г. 23:51:48