WP_Query не работает с несколькими параметрами категории

#php #wordpress #search #parameters

#php #wordpress #Поиск #параметры

Вопрос:

Ситуация: я не могу успешно настроить параметр категории в 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,
    );
  

Затем я попытался объединить две переменные, и это вроде как сработало. В частности, он работал как оператор OR, фильтруя по региону или теме. Он не будет фильтроваться по обоим.

 $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 . Я заставил это работать на основе amp;amp; .

 $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 параметра? Другими словами, мне нужно настроить это так, чтобы мои пользователи могли искать регион и / или тему или вообще ничего.

Ответ №1:

Ваш вопрос расплывчатый, но это может помочь:

 $args = array(
  'post_type' => 'post',
  'tax_query' => array(
      'relation' => 'AND',
      array(
          'taxonomy' => 'movie_genre',
          'field'    => 'slug',
          'terms'    => array( 'action', 'comedy' ),
      ),
      array(
        'taxonomy' => 'actor',
        'field'    => 'term_id',
        'terms'    => array( 103, 115, 206 ),
        'operator' => 'NOT IN',
      ),
  ),
);
$query = new WP_Query( $args );
  

Таким образом, вы можете выполнять поиск по нескольким таксономиям. Вы можете использовать in relation для указания отношения and или not .

Комментарии:

1. Спасибо за ваш вклад. Я переформулировал свой вопрос внизу и проверю параметр таксономии.

2. Я только что попробовал это, и я мог заставить работать оператор AND, но при использовании оператора OR и вложенности это не работало. Любая другая помощь очень ценится.