由Repeater字段的ACF查询帖子不为空

Nic*_*ick 6 wordpress advanced-custom-fields

这个问题在互联网上似乎没有答案,也许是因为这是不可能的.我只是想查询转发器字段"有行"的所有帖子.即

$args = array(
'meta_query'        => array(
'relation' => 'AND',
    array(
        'key'       => 'repeater_field',
        'value'     => '',
        'compare'   => '=!'
    )
);
Run Code Online (Sandbox Code Playgroud)

我知道另一种方法是在循环中运行if语句来过滤它们,但是这会混淆一些基于查询中帖子数量的其他逻辑.

有没有人对此有任何想法?

Jor*_*bot 7

让我们考虑你有一个标有My Repeater Field的Repeater Field,这个转发器在Repeater上至少包含一个标记为A Field的字段.

假设您有默认的wp_表前缀,您需要查看数据库的wp_postmeta表,注意转发器上此字段的值与以下内容一起存储meta_key:

NAME_OF_THE_REPEATER_index_NAME_OF_FIELD_ON_THE_REPEATER

因此,在我们的示例中,如果帖子在转发器字段上有3行,则其值将存储为:

my_repeater_field_0_a_field_on_the_repeater
my_repeater_field_1_a_field_on_the_repeater
my_repeater_field_2_a_field_on_the_repeater
Run Code Online (Sandbox Code Playgroud)

知道了这一点,如果你想查询转发器上至少有一行的所有帖子,你可以这样做:

$meta_query = [
    [
        'key'     => 'my_repeater_field_0_a_field_on_the_repeater',
        'compare' => 'EXISTS',
    ]
];

$args = [
    'posts_per_page'   => -1,
    'orderby'          => 'date',
    'order'            => 'DESC',
    'meta_query'       => $meta_query,
    'post_type'        => 'post',
    'post_status'      => 'publish',
];

$posts_array = get_posts( $args );
Run Code Online (Sandbox Code Playgroud)

注意:如WP Docs所述,您只能EXISTS在WP> = 3.5上使用比较,并且在WordPress 3.9及更高版本中使用"EXISTS"或"NOT EXISTS"比较时无需指定值.我还假设您使用PHP> = 5.4,因此您可以使用短数组语法.如果没有,只是更换[]了array().