我需要QUERY_POSTS()首先按元值对结果排序,然后按帖子ID排序

时间:2018-11-25 作者:CraigD

我已经阅读了所有相关的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)排列。

请帮忙!!

1 个回复
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修复中进行研究。

结束

相关推荐

最小化对数据库的wp_Query调用

我有一个非常基本的问题,这个问题可以通过原始sql查询轻松完成,我们可以将想要输出的数据库列命名为 select id,name,date from tableA where id>\'100\' 但同样的事情Wp_Query 提供了大量与我们完全无关的垃圾数据。我们可以使用php 但问题是,它肯定会杀死数据库,因为它正在幕后进行大量调用。我们与var_dump 而且它是巨大的数据,99%对我们没有用处。我们只想列出id和name列,而不是像这样的列PING_STATUS,COM