这个问题在网上似乎没有答案,也许是因为这是不可能的。我只是想查询所有的帖子,其中中继器字段"有行"。例如
$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。下面是行数