如何按作者指定顺序排序ACF Relationship字段?代码未生效
解决ACF Relationship字段前端按后台排序显示的问题
1. 优先使用ACF原生获取方式
ACF的Relationship字段默认会以后台拖放调整后的顺序返回内容,无需额外排序代码。直接用get_field获取后循环输出即可:
$related_posts = get_field('your_relationship_field'); if( $related_posts ): foreach( $related_posts as $post ): setup_postdata($post); // 示例:输出文章标题 echo '<h3>' . get_the_title() . '</h3>'; endforeach; wp_reset_postdata(); endif;
2. 使用WP_Query时的正确排序写法
如果必须用WP_Query扩展查询逻辑,一定要指定orderby => 'post__in',否则WP会默认按发布日期排序,覆盖ACF的自定义顺序:
// 第三个参数设为false,直接获取原始ID数组(保持后台排序) $related_ids = get_field('your_relationship_field', false, false); if( $related_ids ): $args = array( 'post_type' => 'your_post_type', // 替换为你的自定义文章类型 'post__in' => $related_ids, 'orderby' => 'post__in', // 关键:按ID数组的顺序排序 'posts_per_page' => -1 ); $query = new WP_Query($args); if( $query->have_posts() ): while( $query->have_posts() ): $query->the_post(); echo '<h3>' . get_the_title() . '</h3>'; endwhile; wp_reset_postdata(); endif; endif;
3. 排查代码失效的常见原因
- 字段名错误:确认
get_field中的字段slug和ACF后台设置的完全一致(区分大小写)。 - 查询未重置:如果之前有其他
WP_Query操作,遗漏wp_reset_postdata()会导致后续查询混乱,检查代码中是否存在该问题。 - 缓存干扰:清除WordPress全站缓存、ACF字段缓存(ACF设置页有「Clear Cache」按钮),避免旧数据覆盖新设置。
- 钩子冲突:检查
functions.php中是否有pre_get_posts或posts_orderby类的自定义钩子,这类代码可能强制修改排序规则,可暂时注释测试。 - 字段返回格式错误:在ACF字段编辑页,确认「Return Format」设置为「Post Object」或「Post ID」,不要选择其他格式。
4. 极端情况排查
如果以上方法都无效,先打印ID数组确认存储顺序是否正确:
var_dump(get_field('your_relationship_field', false, false));
如果数组顺序和后台拖放的不一致,尝试重新保存包含该字段的文章,或导出导入ACF字段组重置配置。
内容的提问来源于stack exchange,提问作者Dabin Kim
相关产品推荐
相关产品推荐

