ACF查询帖子由中继器字段不空



这个问题在网上似乎没有答案,也许是因为这是不可能的。我只是想查询所有的帖子,其中中继器字段"有行"。例如

$args = array(
'meta_query'        => array(
'relation' => 'AND',
    array(
        'key'       => 'repeater_field',
        'value'     => '',
        'compare'   => '=!'
    )
);

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

有人对此有什么看法吗?

假设您有一个标记为My Repeater Field的中继器字段,并且该中继器至少包含一个标记为的字段。

假设您有默认的wp_表前缀,您需要查看DB的wp_postmeta表,以注意到中继器上该字段的值与meta_key一起存储:

NAME_OF_THE_REPEATER_index_NAME_OF_FIELD_ON_THE_REPEATER

因此,在我们的例子中,如果一个帖子在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

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

$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 );

注意:如WP Docs所述,您只能在WP>= 3.5和中使用EXISTS比较,而在WordPress 3.9和以上中使用'EXISTS'或'NOT EXISTS'比较时不需要指定值。我还假设您使用PHP>= 5.4,所以您可以使用短数组语法。如果没有,只需将[]替换为array()

您可以使用$wpdb对象查询wordpress数据库。ACF字段保存在数据库的prod_postmeta中,因此您将在那里运行查询。您的meta_value将是您的中继器字段的键,因此请确保在下面的查询中替换它。任何ACF字段的所有键都以field_开头,然后是随机字符/数字,如下所示。一旦获得了帖子id,就可以对这些帖子id运行get_post()。如果你还需要什么或有什么问题,请告诉我。

global $wpdb;
$results = $wpdb->get_results("SELECT post_id from prod_postmeta WHERE meta_value = 'field_534eeaaa74199'");
$echo $results;

可以。我已经测试过了。只有"欢迎世界"的帖子不起作用。

$args = array(
    'post_type'=> 'post', 
    'posts_per_page' => -1,
    'meta_query'        => array(
        'relation' => 'AND',
        array(
            'key'       => 'repeater_field',
            'value'     => '0',
            'compare'   => '!='
        )
));
$the_query = new WP_Query( $args );

"repeater_field"是字段名,而不是field_key。下面是行数

相关内容

  • 没有找到相关文章

最新更新