meta_query尚未设置的键


8

我正在尝试查询画廊系统的自定义帖子类型。我有一个复选框可以将画廊设置为“特色”画廊(通过“更多字段”插件设置)-如果选中此复选框,则meta值将变为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,
                                        ) ),
                        ) );

我已经尝试过各种尝试,例如“比较” =>“不喜欢”,“!=”等。

有任何想法吗?这张票似乎意味着应该对它进行整理:

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

谢谢!

Answers:


7

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

$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

);

我的第一个数组将使用此解决方案覆盖我的第二个数组。似乎您无法对同一字段进行两次查询?
艾伦·金里奇

3

根据Codex中的“ 自定义字段参数”NOT EXISTS自WP版本3.5起提供特殊比较

从技术上讲,它会在发布请求中生成类似以下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)。因此,它仅适用于根本不存在键且不适用于具有虚假值的键的情况。


我对此NOT EXISTS比较感兴趣。作为未设置的元密钥的解决方法,如果未设置元密钥,我只会在save_post钩子上保存一个0 。NOT EXISTS工作如何?它将按OP的查询进行排序main-gal,然后用不包含该元的帖子填充4吗?
helgatheviking 2013年

@helgatheviking我已经详细解释了力学上的问题
拉斯特,2013年

2

正如票证所指出的那样,不支持它。.在那之前,您将不得不依靠自定义解决方案。

以前有几个用户要求这样做,或者至少在WordPress.org论坛上问过如何做到这一点,所以我写了一个函数来完成我从来没有保留过的工作(pastebinned),所幸我找到了原始主题我在其中提供了pastebin链接(不应过期)。

http://pastebin.com/kgLt1RrG

我是8个月前写的,从那以后我还没有测试过,所以让我知道任何问题。

希望有帮助。


太好了,谢谢您-将于今天晚上晚些时候进行测试,让您知道会发生什么。
artparks 2011年

1

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

$args = array(
    'post_type' => 'gallery',
    'posts_per_page' => -1,
    'meta_key' => 'gal-ID',
    'order_by' => 'meta_value',
    'order' => 'ASC',
    'meta_key' => 'main-gal',
    ) );

这将为您提供按meta键排序的所有图库。下一步是弄清楚值1的画廊是在其他帖子之后还是之前。这样,您可以:

  • 处理项目,直到您处理了4个图库项目或到达元值为1的帖子为止
  • 跳过元值为1的帖子,然后在达到第一个非1值时开始处理

其他不需要自定义SQL语句的方法:

  • 进行查询以查找您不想要的画廊,使用它来填充帖子ID数组,然后进行第二次查询,将该数组作为帖子传递以排除
  • 使用分类法而不是自定义字段(很好地解决了此问题,并免费提供了许多其他不错的改进,因此也节省了您的时间)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.