问题描述

我喜欢使用自定义字段排除某些帖子。所以如果 my_custom_field_ignore 发行和 1 忽略这个帖子。如果没有设置包含它。

这是我所拥有的

    $args = array(
        'post_type' => $post_type,
        'offset' => $offset,
        'meta_query' => array(
            array(
                'key' => 'my_custom_field_ignore',
                'value' => '1',
                'compare' => '!=',
            )
        )
    );

这仅适用于 my_custom_field_ignore 设置为 1 以外的帖子

如何包括所有帖子 (当然不是 my_custom_field_ignore = 1 的帖子)?

编辑:

这是它在 WP 3.5+上的工作原理

    'meta_query' => array(
        array(
            'key' => 'my_custom_field_ignore',
            'compare' => 'NOT EXISTS',
        )
    )

这样简单的搜索 my_custom_field_ignore 的外观,所以值将被忽略。虽然这可能起作用,但是当他们将 1 更改为 0 时,用户可能会感到困惑,并期望被包含在内。

似乎 3.3 和 3.4 需要一些条件检查。

编辑 2

看起来被检查的回答是诀窍 (至少 3.5+) 。由于一些奇怪的原因,它忽略了第一个帖子”Hello World” 。添加 my_custom_field_ignore 后,将其删除后即可正常工作

最佳解决方案

如果我们定义条件:

A: my_custom_field_ignore EXISTS
B: my_custom_field_ignore = 1

那么 NOT ( A && B )相当于:

NOT ( A ) || NOT ( B )

我们的意思是:

( my_custom_field_ignore NOT EXISTS ) ||  ( my_custom_field_ignore != 1 )

因此,我们可以尝试以下 WP 3.5+(未测试):

 $args = array(
    'post_type'  => $post_type,
    'offset'     => $offset,
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'key'     => 'my_custom_field_ignore',
            'value'   => '1',
            'compare' => '!=',
        ),
        array(
            'key'     => 'my_custom_field_ignore',
            'compare' => 'NOT EXISTS',
            'value'   => '1',     #<-- just some value as a pre 3.9 bugfix (Codex)
        ),
    )
);

参考文献

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