我需要在查询中进行多级排序。问题是如何像在SQL中那样对一个值DESC和另一个值ASC进行排序。当我在终端中运行时,以下SQL似乎为我提供了所需的内容:
SELECT DISTINCT * FROM wp_posts
INNER JOIN wp_postmeta
ON wp_posts.ID = wp_postmeta.post_id
WHERE wp_posts.post_type = \'post\'
AND wp_postmeta.meta_key = \'pb_issue_featured\'
AND wp_posts.post_status = \'publish\'
ORDER BY wp_postmeta.meta_value DESC, wp_posts.menu_order ASC;
The
pb_issue_featured
是布尔值。我需要的最终结果是查询显示顶部此字段的meta值为1的帖子,然后在下面显示所有其他帖子。然后,第二层订购是指定的
menu_order
(我正在使用post-types-order插件)。
问题是我的布尔值需要从高到低(1到0)排序,但menu\\u的顺序正好相反。插件首先排序的菜单顺序为1。因此,在WP\\u查询中使用内置的“orderby”不起作用。有人有什么建议吗?我查看了“posts\\u orderby”过滤器,但无法获取它。我真的不知道应该在哪里应用它,也不知道如何解决它。它只是没有按照我的方式重新排序。
谢谢你的帮助!如果相关的话,我会发布实际的WP\\u查询,但我希望尽量简短。
查询参数:
$args = array(
\'post_type\' => \'post\',
\'meta_key\' => \'pb_issue_featured\',
\'orderby\' => \'meta_value\',
\'order\' => \'DESC\',
\'post_status\' => \'publish\',
\'posts_per_page\' => $posts,
\'paged\' => $paged,
\'meta_query\' => array(
array(
\'key\' => \'headline\',
\'value\' => 1,
\'compare\' => \'!=\'
)
)
);
$q = new WP_Query($args);
最合适的回答,由SO网友:Marin Bînzari 整理而成
Try this:
$args = array(
\'post_type\' => \'post\',
\'meta_key\' => \'pb_issue_featured\',
\'orderby\' => \'meta_value\',
\'order\' => \'DESC\',
\'posts_per_page\' => $posts,
\'paged\' => $paged,
\'paged\' => 1,
\'meta_query\' => array(
array(
\'key\' => \'headline\',
\'value\' => 1,
\'compare\' => \'!=\'
)
)
);
add_filter( \'posts_orderby\', \'filter_query\' );
$q = new WP_Query($args);
remove_filter( \'posts_orderby\', \'filter_query\' );
function filter_query( $query ) {
$query .= \', wp_posts.menu_order ASC\';
return $query;
}