尚未设置的键的META_QUERY

时间:2011-07-26 作者:artparks

我正在尝试查询库系统的自定义帖子类型。我有一个复选框可以将库设置为“特色”库(通过“更多字段”插件设置)-如果选中此复选框,则元值变为1,如果未选中,则元值变为0。一切都很好。但是,如果从未选中该框,则不会创建元键,这意味着我无法查询“不象1”,因为它不存在。

我想要的查询是拉出4个在这个meta值中没有标记为“1”的库,还有那些根本没有这个值的库。是否有方法始终为新添加的帖子提供此元键的默认值(即如果未选中此框,则始终默认为0),或者是否有方法查询尚未设置的键?

我当前的查询是:

$args = array(
                        \'post_type\' => \'gallery\',
                        \'showposts\' => 4,
                        \'meta_key\' => \'gal-ID\',
                        \'order_by\' => \'meta_value\',
                        \'order\' => \'ASC\',
                        \'meta_query\' => array( array(
                                            \'key\' => \'main-gal\',
                                            \'value\' => false,
                                        ) ),
                        ) );
我也尝试过使用“比较”=>“不喜欢”、“!=”进行各种尝试等等等等。

有什么想法吗?这张罚单似乎暗示这是应该解决的问题:

http://core.trac.wordpress.org/ticket/18158

谢谢

4 个回复
SO网友:ArleyM

这个庞大的函数有点吓人,我是这样工作的-有两个参数(不包括特性)

$args = array(

    \'meta_query\' => array(
        \'relation\' => \'OR\',
            array( // new and edited posts
                \'key\' => \'Set as Featured Post\',
                \'compare\' => \'!=\',
                \'value\' => 1
            ),

            array( // get old posts w/out custom field
                \'key\' => \'Set as Featured Post\',
                \'value\' => \'1\',
                \'compare\' => \'NOT EXISTS\'
            ) 
        ),
    \'posts_per_page\' => 30

);

SO网友:Rarst

根据Custom Field Parameters 在法典中,特殊NOT EXISTS 自WP版本3.5起提供比较

从技术上讲,它在POST请求中生成类似以下SQL查询的内容:

$posts = get_posts( array(
    \'meta_query\' => array(
        array(
            \'key\'     => \'wrong\',
            \'compare\' => \'NOT EXISTS\',
        ),
    ),
) );
SELECT *,wp_posts.ID
FROM wp_posts
LEFT JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id AND wp_postmeta.meta_key = \'wrong\')
WHERE 1=1 AND wp_posts.post_type = \'post\' AND (wp_posts.post_status = \'publish\') AND (wp_postmeta.post_id IS NULL)
GROUP BY wp_posts.ID
ORDER BY wp_posts.post_date DESC
LIMIT 0, 5
它的工作原理是在提供的键上连接元表,并且只选择那个些并没有产生有意义数据的记录(IS NULL). 因此,它只适用于键根本不存在的情况,并且不适用于存在值为falsy的键。

SO网友:t31os

正如罚单所指出的,它不受支持。。在此之前,您必须依赖自定义解决方案。

一些用户之前已经问过这个问题,或者至少问过如何在WordPress上重做。org论坛,所以我写了一个函数来完成我从未掌握的工作(pastebinned),幸运的是我找到了我提供pastebin链接的原始主题(该链接不会过期)。

http://pastebin.com/kgLt1RrG

我是8个月前写的,从那时起我就没有测试过它,所以请告诉我任何问题。

希望这有帮助。。

SO网友:Tom J Nowell

最简单的方法,尽管不是最干净的:

$args = array(
    \'post_type\' => \'gallery\',
    \'posts_per_page\' => -1,
    \'meta_key\' => \'gal-ID\',
    \'order_by\' => \'meta_value\',
    \'order\' => \'ASC\',
    \'meta_key\' => \'main-gal\',
    ) );
这将为您提供按元键排序的所有库。下一步是确定值为1的图库位于其他帖子之后还是之前。通过这种方式,您可以:

处理项目,直到处理完4个库项目,或到达元值为1的帖子,跳过元值为1的帖子,然后在到达第一个非1值时开始处理其他不需要自定义SQL语句的方法:

执行查询以查找您不想要的库,使用它填充帖子ID数组,然后执行第二次查询,将该数组作为帖子传递,以排除使用分类法而非自定义字段的帖子(很好地解决了这一问题,并免费提供了许多其他不错的改进,因此也节省了您的时间)

结束

相关推荐