我已经阅读了所有相关的WordPress文档,我在这里和其他网站上读了很多帖子来找到答案,但我仍然找不到一种方法来做到这一点。
我有一个自定义的帖子类型。我的自定义帖子类型包含元数据。其中一个元数据字段是一个布尔值(1或0),称为“特征”,用作标志。我正在尝试为query\\u posts()创建一个查询(如果必须的话,我会选择WP\\u query),该查询首先返回设置了标志的帖子(按日期或帖子ID DESC排序),然后返回没有设置标志的帖子(也按日期或帖子ID DESC排序)。
这样做的目的是让特色帖子位于列表的顶部,按发布日期排序,最新帖子排在第一位,然后是非特色帖子,还按发布日期排序,最新帖子排在第一位。
例如:
a: ID=800, featured=1
b: ID=801, featured=0
c: ID=802, featured=0
d: ID=803, featured=1
e: ID=804, featured=0
这张帖子列表应该按顺序返回给我:d、a、e、c、b
相反,我得到的是:a,d,b,c,e
这是我到目前为止的查询代码:
$query = query_posts( array(
\'post_type\' => \'my_custom_type\',
\'post_status\' => \'publish\',
\'posts_per_page\' => \'9\',
\'orderby\' => array(
\'meta_value_num\' => \'DESC\',
\'post_ID\' => \'DESC\'
),
\'meta_key\' => \'featured\'
) );
我尝试过orderby的各种变体。我最初尝试在发布日期排序,但尝试了post ID,因为它应该返回相同的顺序,并且是一个简单的int。我将DESC翻到ASC再翻回来,我添加了其他帖子中建议的过滤器。。。无论我做什么,在标志上进行初始排序之后,帖子总是按照ASC顺序(即ASC post ID或ASC post date)排列。
请帮忙!!
SO网友:CraigD
我继续研究我的问题,最终在这里找到了解决方案:I need query_posts() to order results first by a meta value and then by post ID
基本上,WordPress orderby似乎是一团糟。当我检查SQL时,它生成的orderby如下所示:
ORDER BY wppc_postmeta.meta_value+0 DESC
这基本上没有意义。
因此,我创建了一个快速筛选函数来编写orderby代码,就像WordPress首先应该做的那样:
function pb_override_orderby() {
$orderby_statement = "wppc_postmeta.meta_value DESC, wppc_posts.post_date_gmt DESC";
return $orderby_statement;
}
然后,在进行query\\u posts()调用之前,我添加一行:
add_filter(\'posts_orderby\', \'pb_override_orderby\');
这两个代码段抛出了WordPress的错误代码,并将其替换为根据需要工作的正确代码。好多了。WordPress可以在将来的bug修复中进行研究。