首页 > 解决方案 > 带有 ACF 嵌套字段的 WP MetaQuery

问题描述

好的,所以我需要获取与当前帖子相关的所有帖子。这是通过查询帖子上的关系字段设置的,而不是我当前的。但奇怪的是,关系字段嵌套在一个重复器字段中,用于在页面上重复块。所以在我的“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 让我的字段有问题并测试它是否具有适当的值?

标签: wordpressrelationshiprepeateradvanced-custom-fieldspost-meta

解决方案


我找到了解决方案,但它并不漂亮。问题是您必须使用键“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');

推荐阅读