WordPress按自定义字段排序文章异常:仅显示8篇而非设置的10篇
问题原因及解决方案
问题根源
你的查询仅返回存在featured自定义字段的文章,未设置过该字段的university类型文章会被自动排除。如果数据库中仅有8篇文章带有featured字段(无论值为true还是false),即便设置posts_per_page=10,最终也只会显示这8篇符合筛选条件的文章。
当直接在WP_Query参数中指定meta_key时,WordPress会默认添加筛选规则:仅包含拥有该meta键的文章。而ACF的布尔字段若从未被编辑过,不会在数据库中生成对应的meta记录,这类文章就会被排除在外。
修正后的查询代码
要实现「精选文章优先展示,同时包含所有发布的university文章」的需求,需通过meta_query明确覆盖所有情况(字段为true、字段为false、无此字段),并调整排序规则:
$args = array( 'post_type' => 'university', 'post_status' => 'publish', 'posts_per_page' => 10, 'meta_query' => array( 'relation' => 'OR', // 筛选featured为true的文章 array( 'key' => 'featured', 'value' => '1', // ACF布尔值true在数据库中存储为字符串'1' 'compare' => '=' ), // 筛选featured为false的文章 array( 'key' => 'featured', 'value' => '0', 'compare' => '=' ), // 筛选从未设置过featured字段的文章 array( 'key' => 'featured', 'compare' => 'NOT EXISTS' ) ), 'orderby' => array( // 优先按featured值降序,true(1)排在false(0)和无字段的文章前面 'meta_value' => 'DESC', // 可选:非精选文章按发布日期降序排序 'date' => 'DESC' ) );
关键说明
- ACF的布尔类型字段在数据库中实际存储为字符串
'1'(true)和'0'(false),因此筛选时直接指定对应字符串值更准确。 - 使用
meta_query的OR关系确保所有university类型文章都被纳入查询范围,不会遗漏未设置字段的文章。 orderby数组可定义多维度排序规则,保证精选文章优先展示,非精选文章按你需要的逻辑(如发布日期)排序。
内容的提问来源于stack exchange,提问作者Nuriddin Gulamov
相关产品推荐
相关产品推荐

