Поиск и фильтрация запросов по нескольким таксономиям в WordPress - PullRequest
0 голосов
/ 05 октября 2018

У нас есть пользовательский тип записи hr-priority, с которым связано несколько пользовательских таксономий.Эти таксономии содержат несколько терминов, и каждому сообщению может быть присвоено одно-много терминов из этих таксономий.Мы пытаемся настроить фильтр, который позволяет посетителям искать / фильтровать результаты, комбинируя эти термины в нескольких таксономиях.

Например: пост "Образец поста" имеет для таксономии "год"термин "2018", таксономия "org", термин "член совета" и таксономия "страна", термин "канада".В посте «Другой образец» для «год» используется термин «2016», для таксономии «org» - термин «менеджер», а для таксономии «страна» - термин «Канада».В посте «Третий пост» для таксономии «год» - термин «2018», для организации таксономия - «группа безопасности», а в таксономии «страна» - термин «Исландия».

Мы хотимбыть в состоянии отфильтровать результаты по всем этим условиям, поэтому, если я выберу просто просмотреть сообщения за год = 2018, я получу «Третье сообщение» и «Образец сообщения», но затем, если я отфильтрую их по стране = КанадеЯ получу только «Образец поста» (потому что фильтры будут иметь год = 2018 и страна = «Канада»).

Я использую плагин Search & Filter.Я попытался использовать страницу шаблона archive-hr-priority.php для результатов, но этот шаблон вообще не был распознан в результатах.Затем я использовал пользовательские шаблоны таксономии, такие как taxonomy-year.php, которые работали только с одним фильтром, поэтому, когда я отфильтровал по году = 2018, единственные возвращаемые сообщения были из года 2018, но затем, когда я добавил второйПоисковый запрос, например country = "canada", вернул все результаты для country = canada, но со всеми терминами года.

Это мой шорткод поиска и фильтрации:

echo do_shortcode( '[searchandfilter post_types="hr-priority" fields="year,country"]' );

И этокод, который я использую в пользовательских шаблонах таксономии (я создал один для каждой таксономии):

if (is_tax() || is_category() || is_tag() ){
        $qObj = get_queried_object();

        $args = array(
            'post_type'=>'hr-priority',
            'tax_query' => array( array(
                  'taxonomy' => $qObj->taxonomy,
                  'field' => 'id',
                  'terms' => $qObj->term_id
                )),
            'post_status'=>'publish',
            'posts_per_page'=>20
        );
    }
    echo($qObj->slug); //just to view the term/s being used
     $wpb_all_query = new WP_Query($args);
    if ( $wpb_all_query->have_posts() ) : ?>
        <?php
        /* Start the Loop */
        while ( $wpb_all_query->have_posts() ) : $wpb_all_query->the_post();

            get_template_part( 'template-parts/post/hr-priorities-post', get_post_format() );

        endwhile;

И этот URL-адрес возвращается после отправки параметров поиска и фильтрации:

https://exampleurl.org/org/council-member?country=afghanistan&post_types=hr-priority-un

Какможно заставить его фильтровать по нескольким терминам в нескольких таксономиях и возвращать только результаты, которые соответствуют ВСЕМ параметрам поиска?

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Я понял это с некоторыми ответами на несколько других вопросов (см. Список цитирования ниже).

Во-первых, мне нужно было взять полный список терминов в каждой таксономии. Я может использовать (таким образом, если бы один налог не запрашивался, я мог бы указать какое-то значение, а не пустую строку, для значения 'term' => этого tax_query), которое я затем превратил в слагы (вторая строка ниже), затем Я использовал функцию get_query_var(), чтобы получить запрашиваемый термин из каждой / любой из таксономий.

    $allStates = get_terms('country', $args = array('hide_empty' => false));
    $state_names = wp_list_pluck( $allStates, 'slug' );
    $country = (get_query_var('country', $state_names));

Затем я отправил значение get_query_var() в массив для моего tax_query(Я мог бы просто сделать это в массиве $args, но его было легче читать вне этого), но мне нужно было использовать 'relation' => 'AND' (, как указано в другом предлагаемом ответе ), чтобы сделатьуверен, что каждый из них будет включен в аргументы запроса:

      $tax_query = array(
      'relation' => 'AND',
      array(
        'taxonomy' => 'country',
        'field' => 'slug',
        'terms' => $country,
      ),
      array(
        'taxonomy' => 'org',
        'field' => 'slug',
        'terms' => $org,
      ),);

После этого это был тот же общий wp_query():

        $args = array(
            'post_type'=>'hr-priority',
            'tax_query' => $tax_query,
            'post_status'=>'publish',
            'posts_per_page'=>20
        );
//  print_r($tax_query);
     $wp_all_query = new WP_Query($args);
    if ( $wp_all_query->have_posts() ) : ?>

Список цитирования для ответов, используемых при выясненииРешение (спасибо!): https://wordpress.stackexchange.com/a/35611/146095 https://wordpress.stackexchange.com/a/157167/146095

0 голосов
/ 05 октября 2018

Я не знаком с "Search & Filter", но это выглядит достаточно просто, чтобы сделать с базой WP_Query.Вы можете выполнять поиск по нескольким таксономиям со следующими данными:

$tax_query = array(
  'relation' => 'AND'
);

// get query parameters and compose the condition
$year = $_GET['year'];
if (!empty($year)) {
  $cond = array(
    'taxonomy' => 'year',
    'field' => 'slug',
    'terms' => $year,
  ));
  $tax_query[] = $cond;
}
// Repeat for other parameters

$args = array(
  'post_type'=>'hr-priority',
  'tax_query' => $tax_query,  
  'post_status'=>'publish',
  'posts_per_page'=>20,
);

Справочная документация

...