WordPress+ACF按pinned字段及日期排序问题求助(含无字段旧文章)
解决方案:WordPress按ACF固定字段+日期排序并包含无字段旧文章
你的核心问题是未设置pinned字段的旧文章无法被正确归类到“非固定”组,原代码的orderby逻辑无法识别这类文章的状态。以下是两种可行的修正方案:
方法1:直接修正WP_Query参数(无需额外过滤器)
通过给meta_query的条件组设置别名,让排序逻辑能精准识别所有文章的固定状态:
$args = array( 'post_type' => 'post', 'posts_per_page' => 5, 'meta_query' => array( 'relation' => 'OR', // 标记固定文章(pinned=1) 'pinned_true' => array( 'key' => 'pinned', 'value' => '1', 'compare' => '=' ), // 标记非固定或无字段的文章 'pinned_false_or_missing' => array( 'relation' => 'OR', array( 'key' => 'pinned', 'value' => '0', 'compare' => '=' ), array( 'key' => 'pinned', 'compare' => 'NOT EXISTS' ) ) ), 'orderby' => array( // 固定文章优先排序 'pinned_true' => 'DESC', // 同组内按发布日期降序排列 'post_date' => 'DESC' ) ); $results = new WP_Query($args);
方法2:自定义SQL排序逻辑(灵活性更高)
通过posts_orderby过滤器直接改写排序语句,强制将无字段文章归为“非固定”类别:
// 添加排序规则过滤器 add_filter('posts_orderby', 'custom_pinned_date_order', 10, 2); function custom_pinned_date_order($orderby, $query) { global $wpdb; // 仅对指定查询生效,避免影响全局 if ($query->get('orderby') === 'pinned_date') { $orderby = " CASE WHEN {$wpdb->postmeta}.meta_key = 'pinned' AND {$wpdb->postmeta}.meta_value = '1' THEN 1 ELSE 2 END ASC, {$wpdb->posts}.post_date DESC "; } return $orderby; } // 构建查询参数 $args = array( 'post_type' => 'post', 'posts_per_page' => 5, 'orderby' => 'pinned_date', // 确保包含所有文章,无论是否有pinned字段 'meta_query' => array( 'relation' => 'OR', array('key' => 'pinned', 'compare' => 'EXISTS'), array('key' => 'pinned', 'compare' => 'NOT EXISTS') ) ); $results = new WP_Query($args);
最终效果
两种方案都能实现:
pinned=true的文章排在最前列,按发布日期降序排列pinned=false或未设置该字段的旧文章紧随其后,同样按发布日期降序排列- 不会过滤任何文章,旧内容全部正常展示
内容的提问来源于stack exchange,提问作者Richard Ockerby
相关产品推荐
相关产品推荐

