You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 01:27:31