问题描述

我试图查询图库系统的自定义帖子类型。我有一个复选框来设置一个画廊作为一个”featured” 画廊 (通过更多字段插件设置) – 如果这是检查,那么元值将变为 1,然后如果未选中,它变为 0. 所有好。但是,如果该框尚未被检查,那么元键从不被创建,这意味着我不能查询 NOT LIKE 1,因为它不存在。

我想要的查询是拉出 4 个没有标记为’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,
                                        ) ),
                        ) );

而且我尝试过’compare’ => ‘NOT LIKE’,’!=’ 等

有任何想法吗?这张票似乎暗示这是一个应该整理的东西:

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

谢谢!

最佳解决方案

这个巨大的功能有点吓人,我得到了这样的工作 – 有两个参数 (排除功能)

$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

);

次佳解决方案

根据法典中的 Custom Field Parameters,自 WP 版本 3.5 起可以使用特殊的 NOT EXISTS 比较

从技术上讲,它在帖子请求中产生如下面的 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) 来工作。所以它只适用于键不存在的情况,并且不适用于存在伪造值的键。

第三种解决方案

正如门票所指出的,它不受支持。直到那时,你将不得不依靠一个自定义的解决方案。

有几个用户以前曾经问过这个问题,或者至少问到如何在 WordPress.org 论坛上做到这一点,所以我写了一个功能来完成我从来没有持有的工作 (粘贴),幸运的是我发现了原来的主题我提供了 pastebin 链接 (不应该过期) 。

http://pastebin.com/kgLt1RrG

我写了 8 个月前,我没有测试 (从那时起),所以让我知道任何问题。

希望有帮助..

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。