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

ACF布尔字段Post meta查询异常:置顶帖子排序不符合预期

问题:ACF布尔字段置顶帖子排序异常

需求

需要对ACF布尔字段pinned_post进行查询,实现:

  • 标记为“置顶帖子”的内容排在结果顶部
  • 其余未置顶的帖子按日期降序排列

遇到的问题

  • 简单查询代码无法实现预期效果,置顶帖子反而出现在分页结果的最底部
  • 曾设置为置顶后取消的帖子,会集中在置顶区域附近,无法正常归为未置顶帖子按日期排序

尝试过的无效代码

$query->set('meta_query', array(
    'key' => 'pinned_post',
    'value' => 1
));

$query->set('orderby', array(
    'meta_value' => 'DESC', // 预期置顶帖优先
    'date' => 'DESC', // 其余按日期降序
));

当前使用的代码

function meta_pinned_posts($query) {
    if (!is_main_site() || is_admin() || !$query->is_main_query() || !(is_archive() || is_home())) {
        return;
    }

    // 设置元查询
    $query->set('meta_query', array(
        'relation' => 'OR',
        'pinned_post' => array(
            'key' => 'pinned_post',
            'value' => '1', // 置顶帖子
            'compare' => '=',
            'type' => 'NUMERIC',
        ),
        'non_pinned_post' => array(
            'key' => 'pinned_post',
            'value' => '0', // 非置顶帖子
            'compare' => '=',
            'type' => 'NUMERIC',
        ),
        'null_pinned_post' => array(
            'key' => 'pinned_post',
            'compare' => 'NOT EXISTS', // 没有该字段的帖子
        ),
    ));

    // 设置排序
    $query->set('orderby', array(
        'pinned_post' => 'DESC', // 置顶帖优先
        'date' => 'DESC', // 其余按日期降序
    ));

    $query->set('order', 'DESC');
}

add_action('pre_get_posts', 'meta_pinned_posts');

疑问

  • 是否可以强制空字段返回false来解决排序问题?
  • 是否有其他因素干扰pre_get_posts钩子的执行?

内容的提问来源于stack exchange,提问作者rickjh55

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 11:13:26