如何使用WP_Query按ACF用户字段的display_name排序文章?
解决ACF用户字段按display_name排序文章的问题
你遇到的问题是因为ACF的user字段(array格式)在数据库里存的是序列化的用户ID数组,直接用orderby => meta_value只会按用户ID排序,没法直接调用用户的display_name字段。下面给你两种可行的解决方案:
方案一:数据库层面关联用户表排序(适合大量文章)
通过修改WP_Query的SQL查询语句,关联WordPress的用户表,直接按display_name排序:
// 基础查询参数 $args = array( 'post_status' => 'publish', 'post_type' => 'the_post_type', 'meta_key' => 'users', // 你的ACF字段名 ); // 添加钩子修改查询语句 add_filter('posts_join', function($join) { global $wpdb; // 关联wp_users表,提取序列化数组里的用户ID $join .= " LEFT JOIN {$wpdb->users} u ON SUBSTRING_INDEX(SUBSTRING_INDEX({$wpdb->postmeta}.meta_value, '\"', 3), '\"', -1) = u.ID "; return $join; }); add_filter('posts_orderby', function($orderby) { global $wpdb; // 按用户display_name升序排序 return "u.display_name ASC"; }); // 执行查询 $query = new WP_Query($args); // 用完钩子记得移除,避免影响后续查询 remove_filter('posts_join', '__return_false'); remove_filter('posts_orderby', '__return_false');
注意:这个方案假设你的user字段是单选用户(array格式下仅存一个用户ID),如果是多选用户,需要额外处理排序逻辑(比如指定按第一个用户的名称排序)。
方案二:PHP层面排序(适合少量文章)
如果你的文章数量不多,可以先获取所有符合条件的文章,再用PHP的usort函数按用户昵称排序,这种方法更直观:
// 获取所有目标文章 $args = array( 'post_status' => 'publish', 'post_type' => 'the_post_type', 'meta_key' => 'users', 'posts_per_page' => -1, // 取出所有文章 ); $query = new WP_Query($args); $posts = $query->posts; // 按用户display_name排序 usort($posts, function($post_a, $post_b) { // 获取ACF字段返回的用户数组(假设数组第一个元素是目标用户对象) $user_a = get_field('users', $post_a->ID); $user_b = get_field('users', $post_b->ID); $name_a = $user_a[0]->display_name; $name_b = $user_b[0]->display_name; // 字符串比较,返回排序结果 return strcmp($name_a, $name_b); }); // 遍历排序后的文章数组即可 foreach ($posts as $post) { // 你的文章输出逻辑 }
内容的提问来源于stack exchange,提问作者zwt
相关产品推荐
相关产品推荐

