WP_QUERY关系和/或的多次使用

时间:2012-03-19 作者:pistolshrimp

我有两个自定义字段,我想对自定义帖子类型进行元查询:

start_date
status
我想要的结果是

(start_date >= 1332115200 AND status = 1) OR (status = 2)
这是否可以使用WP\\U查询?

2 个回复
最合适的回答,由SO网友:Boone Gorges 整理而成

meta_query 不支持序列中的此类复杂子句。

有几种方法可以绕过此限制。

一个是过滤posts_where_paged 并手动修改SQL。我只是花了几分钟的时间来处理这个选项,它不是很简单-您必须编写一个非常复杂的preg_replace() 正确分组括号等。

  • 一个更有希望的选择是手动获取帖子ID的白名单,然后将结果提供给post__in 的参数WP_Query:

    global $wpdb;
    $post_ids = $wpdb->get_col( $wpdb->prepare( "
        SELECT post_id 
        FROM $wpdb->postmeta.pm 
        INNER JOIN $wpdb->postmeta.pm2 ON (pm.post_id = pm2.post_id)
        WHERE
            (pm.meta_key = \'status\' AND pm.meta_value = \'1\' 
            AND pm2.meta_key = \'start_date\' AND pm2.meta_value >= \'1332115200\')
        OR
            (pm.meta_key = \'status\' AND pm.meta_value = \'2\')
    " ) );
    
    $query_args = array( \'post__in\' => $post_ids ); // plus whatever else you want
    $my_query = new WP_Query( $query_args );
    
    何时WP_Query 组装SQL$post_ids 变成如下子句:AND ID IN (1,2,3), 这就像是传递给其他参数的白名单WP_Query.

    请注意,无论哪种方式,此查询都不会那么快,因为它需要对未索引的对象进行松散类型转换meta_value. 明智地缓存:)

  • SO网友:byronyasgur

    我想你的答案是正确的this page,阅读该部分,Order & Order By Paramaters.

    简单地说,按meta\\u值排序意味着您的查询将包含类似的内容

    \'orderby\' => \'meta_value\', \'meta_key\' => \'your_meta_key\'
    
    。。。但是,像您给出的示例这样做有点棘手,尽管我认为您会发现它实际上是在标题“多个自定义字段处理:”下解释的。结合“自定义字段参数”的第二部分阅读,您最终应该会得到它。

    注意阵列。我认为在您的示例中,应该最终得到3个嵌套数组。

    结束

    相关推荐

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

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