带有 ACF 嵌套字段的 WP MetaQuery

Posted

技术标签:

【中文标题】带有 ACF 嵌套字段的 WP MetaQuery【英文标题】:WP MetaQuery with ACF nested fields 【发布时间】:2019-03-26 13:53:38 【问题描述】:

好的,所以我需要获取与当前帖子相关的所有帖子。这是通过查询帖子上的关系字段设置的,而不是我当前的。但奇怪的是,关系字段嵌套在一个重复器字段中,用于在页面上重复块。 所以在我的“block_repeater”中有一个关系字段“block_relations”,我的查询看起来像这样:

$args = array(
            'post_type' => array('post', 'page'),
            'meta_key' => 'block_relations',
            'value' => '"' . $post->ID . '"',
            'compare' => 'LIKE',
        );
$q = new WP_Query($args);

此查询不返回任何内容,我认为这是因为嵌套。在我的数据库“postmeta”表中,“block_relations”的条目看起来像“blocks_0_block_relations”、“blocks_1_block_relations”等等。 有没有办法在一个查询中执行此操作,而不是查询所有具有“块”转发器的帖子,然后 foreach 让我的字段有问题并测试它是否具有适当的值?

【问题讨论】:

【参考方案1】:

你的 $args 数组不正确

$args = array(
    'post_type' => array('post', 'page'),
    'meta_query' => array( array(
      'key' => 'block_relations',
      'value' => $post->ID,
      'compare' => 'LIKE',
    ) )
);
$q = new WP_Query($args);

【讨论】:

【参考方案2】:

我找到了解决方案,但它并不漂亮。问题是您必须使用键“blocks_0_block_relations”,但元查询使用 equals(=) 运算符搜索 meta_key,因此您必须制作自定义过滤器来过滤掉您的特定查询并更改它以使用 LIKE 比较。 解决方案:

$args = array(
    'post_type' => array('post', 'page'),
    'meta_query' => array( 
        array(
            'key' => 'blocks_$_block_relations',
            'value' => $post->ID,
            'compare' => 'LIKE',
             ) 
        ),
    );
$q = new WP_Query($args);

以及用于更改 where 子句的自定义过滤器:

function my_posts_where( $where )  
    $where = str_replace("meta_key = 'blocks_$", "meta_key LIKE 'blocks_%", $where);
    return $where;


add_filter('posts_where', 'my_posts_where');

【讨论】:

以上是关于带有 ACF 嵌套字段的 WP MetaQuery的主要内容,如果未能解决你的问题,请参考以下文章

ACF 字段的 WP 查询过滤器不起作用

php 使用ACF选项页面的WP全局自定义字段

WP-API 的 JWT 身份验证 - 发布到 ACF 字段

Wordpress:带有过滤器的存档页面不起作用(ACF)

php 从WP管理员隐藏某些页面(基于ACF /自定义字段)

高级自定义字段 acf_form() 'uploader' => 'basic' 无法在前端显示完整的 wp 媒体上传器