Положение:
Я не могу успешно указать параметр категории в WP_Query, который выполняет поиск в двух категориях, смешивающих отношения ИЛИ и И.
Пояснение:
У меня есть поиск / фильтр, который сортирует по регионам, месяцам и годам, и он прекрасно работает! При использовании параметра 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,
);
Затем я попытался объединить две переменные, и это отчасти сработало. В частности, он работал как оператор ИЛИ, фильтруя по региону или теме. Он не будет фильтровать по обоим.
$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 параметра? Иными словами, мне нужно настроить его так, чтобы мои пользователи могли искать регион и / или тему или вообще ничего.