ACF 关系字段的 WordPress 查询
Posted
技术标签:
【中文标题】ACF 关系字段的 WordPress 查询【英文标题】:WordPress query by ACF relationship field 【发布时间】:2017-06-20 01:05:48 【问题描述】:我有一个自定义帖子类型“建筑”和另一个自定义帖子类型“建筑师”。建筑通过 ACF 关系字段与建筑师相关。
在单一建筑师页面中,我想显示与该特定建筑师关联的建筑物列表。
到目前为止,我通过以下方式实现了这一目标:
$loop = new WP_Query( array( 'post_type' => 'building', 'paged' => $paged, 'posts_per_page' => -1 ) );
if ( $loop->have_posts() ) : ?>
<ul>
<?php while ( $loop->have_posts() ) : $loop->the_post();
$building_name = get_the_title();
$building_link = get_the_permalink();
$architects = get_field('architect');
if( $architects ): ?>
<?php foreach( $architects as $post):?>
<?php setup_postdata($post);
if( get_the_title() == $architect_name ) ?>
<li><a href="<?php echo $building_link; ?>"><?php echo $building_name ?></a></li>
<?php ?>
<?php endforeach; ?>
<?php wp_reset_postdata(); ?>
<?php endif; ?>
<?php endwhile; ?>
</ul>
<?php endif;
wp_reset_postdata();
但是这似乎不是很有效,我希望将关系引入查询本身,我已经尝试这样做:
$buildings = get_posts(array(
'post_type' => 'building',
'meta_query' => array(
array(
'key' => 'architect',
'value' => '"' . get_the_ID() . '"',
'compare' => 'LIKE'
)
)
));
<?php if( $buildings ): ?>
<ul>
<?php foreach( $buildings as $building): ?>
<li><a href="<?php echo get_permalink( $building->ID ); ?>"><?php echo get_the_title( $building->ID ); ?></a></li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
这不起作用,它不会返回任何东西......
你能看出我做错了什么吗?或者你有什么其他想法来解决这种情况?
【问题讨论】:
您在 ACF 字段中调用的位置是什么?我没有看到任何遵循传统文档模式的内容 (advancedcustomfields.com/resources/relationship) 您的架构师字段是否允许多个值?如果架构师是单选,则说明您使用了错误的元查询(由于数据的存储方式,上述元查询仅适用于多选)。 @NathanDawson 建筑师是一个允许多选的关系字段 @Aibrean 在我的第二个示例中,我试图按照此链接advancedcustomfields.com/resources/querying-relationship-fields 遵循官方 ACF 文档 @GuillermoCarone 你找到解决方案了吗? ACF 代码无法正常工作。 【参考方案1】:这样的事情应该在单个建筑师页面上执行(因为您已经在循环中只显示该建筑师并且您需要获取建筑物)...基于 ACF 文档。
<?php
$posts = get_field('building');
if( $posts ): ?>
<ul>
<?php foreach( $posts as $p ): // variable must NOT be called $post (IMPORTANT) ?>
<li>
<a href="<?php echo get_permalink( $p->ID ); ?>"><?php echo get_the_title( $p->ID ); ?></a>
<span>Custom field from $post: <?php the_field('author', $p->ID); ?></span>
</li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
如果你是基于查询,它会更像
<?php
$ids = get_field('building', false, false);
$query = new WP_Query(array(
'post_type' => 'architect',
'posts_per_page' => -1,
'post__in' => $ids,
'post_status' => 'any',
'orderby' => 'post__in',
));
?>
这在很大程度上取决于您建立关系的方式。您是否在建筑师页面上显示自定义字段并在那里选择建筑物?
【讨论】:
谢谢@Aibrean。我有一个关系字段,列出了我的“添加建筑”页面中显示的所有建筑师,因此当我添加新建筑时,我可以将其与相应的建筑师链接。我可以告诉您的代码假设相反,在“添加建筑师”页面中选择了建筑物。对吗? 理论上你可以两者都做,但如果你想在建筑师页面上显示建筑物,则必须从该页面中选择建筑物。否则使用 ACF 没有实际意义,您最好使用分类法。【参考方案2】:我通过更改 meta_query 中的值解决了这个问题。
从此:
'"' . get_the_ID() . '"'
到:
get_the_ID()
【讨论】:
该死的,你能发布你的代码吗?这让我发疯。 ACF 代码不起作用。 @pASH【参考方案3】:这是我目前正在使用的解决方案。我看起来很结实。
$buildings = new WP_Query(array(
'post_type' => 'building',
'posts_per_page' => -1,
'suppress_filters' => 0,
'meta_query' => array(
array(
'key' => 'architect',
'value' => '"'.$architect_id.'"',
'compare' => 'LIKE'
)
),
'order' => 'ASC',
'orderby' => 'title',
'post_status' => 'publish',
));
while ( $buildings->have_posts() )
$buildings->the_post();
// print title, content, or whatever here.
【讨论】:
以上是关于ACF 关系字段的 WordPress 查询的主要内容,如果未能解决你的问题,请参考以下文章
Gatsby Wordpress ACF 图像字段返回“null”
在 foreach 循环中获取 ACF 字段数据 - wordpress
javascript WordPress查询多种帖子类型(REST API),对REST API的请求 - 查询多个帖子类型并按ACF字段对数据排序