WP_Query多个类别参数不起作用

时间:2019-03-06 17:44:53

标签: php wordpress search parameters

情况: 我无法在WP_Query中成功地在混合OR和AND关系的两个类别中进行搜索的类别参数。

说明: 我有一个按地区,月份和年份排序的搜索/过滤器,效果很好!使用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。我在&&的基础上使它起作用。

$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 个答案:

答案 0 :(得分: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 );

您可以通过多种分类法进行搜索。您可以在relation中使用来指定andnot关系。