Advanced WP Query and/or

时间:2013-07-03 作者:Nate

我正在尝试创建一个高级的、可重用的查询函数。

我需要按类别或类别+标记进行查询。

我知道如何处理自定义字段(元查询),但如何处理简单的类别和标记?

伪SQL查询将是:

Select * from Posts where ( cat_id = 1 OR (cat_id = 5 AND tag_id = 6) )
查询可能会更改为需要包含一组标记

Select * from Posts where ( cat_id = 1 OR ( cat_id = 5 AND tag_id = (5,6,7) ))
目前我正在使用wp\\u query并传递参数,但我想如果需要的话,我可以编写一个一次性的query\\u帖子。

这是我自定义查询的粗略版本。我想我需要为我想要的“or”语句添加另一个参数?

$args = array(
     \'post_type\'            => $postType, //assume \'post\'
     \'cat\'                  => $cat_id, //currently a single id
     \'orderby\'              => \'date\',
     \'post_status\'          => \'publish\',
    );
我得到了一些帮助Best practice for multiple queries on page

所以现在我需要添加一个tax\\u查询,但这里是查询失败的地方

$taxQuery = array(
       \'relation\' => \'AND\',  //Is this "And" my original query, or just "and" these two parameters?            
                array(
                    \'taxonomy\' => \'category\',
                    \'field\' => \'id\',
                    \'terms\' => 5
                ),
                array(
                    \'taxonomy\' => \'post_tag\',
                    \'field\' => \'id\',
                    \'terms\' => array(5,6,7)
                )
        );
我更新的WP\\U查询将是:

$args = array(
     \'post_type\'            => $postType, //assume \'post\'
     \'cat\'                  => $cat_id, //currently a single id
     \'tax_query\'            => $taxQuery,
     \'orderby\'              => \'date\',
     \'post_status\'          => \'publish\',
    );
感谢您抽出时间!

2 个回复
SO网友:s_ha_dum

我不能百分之百确定你在问什么,但正如书面所述,这将是错误的。tax_query 是一个数组数组,但您有一个数组数组数组。在放置$taxQuery 进入array($taxQuery). 这应该更正确:

$args = array(
     \'post_type\'            => $postType, //assume \'post\'
     \'cat\'                  => $cat_id, //currently a single id
     \'tax_query\'            => $taxQuery,
     \'orderby\'              => \'date\',
     \'post_status\'          => \'publish\',
);
使用您的版本,如果您var_dump 您可以在SQL中看到的查询0=1,它反映了tax_query, 如果你有debugging enabled 你可以看到Notices

不幸的是,您无法执行像这样复杂的查询。。。

Select * from Posts where ( cat_id = 1 OR ( cat_id = 5 AND tag_id = (5,6,7) ))
。。。具有WP_Query. 中的嵌套条件WHERE 太复杂了WP_Query.

您有多种选择:

自己编写SQLWP_Query 做部分工作,至少改变WHERE 带有的子句posts_where

  • 运行几个查询以获取数据

    $post_ids = new WP_Query(array(
      // query for one post type
      \'fields\' => \'ids\',
      // other parameters
    ));
    
    $post_ids_2 = new WP_Query(array(
      // query for the others
      \'fields\' => \'ids\',
      // other parameters
    ));
    // join them
    $post_ids = $post_ids->posts + $post_ids_2->posts;
    $posts_qry = new WP_Query(array(\'post__in\'=> $posts_ids));
    
    那就是taken from another answer 因此,没有一个参数适合您,但这应该会给您一些想法。这是迄今为止最简单的解决方案,但也是效率最低的。

  • SO网友:Edwin Daniels

    对我来说,执行AND/或嵌套查询的一种方法是只传递一个值数组。我相信它通过IN(a,b…)隐式地使用列表作为ORMySQL语法。

    下面是一个我可以用于分类查询的示例:

    // ... Other query params in $query
    
    $query[\'tax_query\'] = [\'relation\' => \'AND\'];
    
    $query[\'tax_query\'][] =[[   \'taxonomy\' => \'field_a\',
                                \'field\' => \'slug\',
                                \'terms\' => [\'a\',\'b\',\'c\']]; // this is the "OR"
    
    
    $query[\'tax_query\'][] =[[   \'taxonomy\' => \'field_b\',
                                \'field\' => \'slug\',
                                \'terms\' => [\'d\',\'e\',\'f\']]; // this is the "OR"
    
    
    $get_posts = new WP_Query;
    $posts = $get_posts->query($query);
    
    这实际上会生成一个查询,例如:

    field_a IN(\'a\',\'b\',\'c\') AND field_b IN(\'d\',\'e\',\'f\')
    

    结束

    相关推荐

    使用新的WP-Query()从循环中过滤后期格式;

    嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post