我有个习惯WP_Query
按两个元字段(日期和时间)对某些事件进行排序。
$args = array(
\'post_type\' => \'event\',
\'posts_per_page\' => 10,
\'meta_query\' => array(
\'relation\' => \'AND\',
\'date_clause\' => array(
\'key\' => \'date\',
),
\'time_clause\' => array(
\'key\' => \'time\',
),
),
\'orderby\' => array(
\'date_clause\' => \'ASC\',
\'time_clause\' => \'ASC\',
),
);
$query = new WP_Query( $args );
大多数事件都有日期和时间,但我们偶尔可能会遇到以下两种情况之一的事件:
一个没有日期或时间的事件(希望它显示在最后)一个有日期但没有时间的事件(这会按日期正确排序,但没有时间的事件会首先显示,我们希望这些事件显示在最后)有没有一种好的方法来实现这一点,而不需要额外的元字段?
SO网友:mozboz
通常情况下,如果排序顺序不能按照您需要的顺序自动生成内容,那么就没有好的方法来实现这一点。这是因为WP\\U查询不允许插入表示“按字段X排序”的逻辑except 如果$some\\u条件\'
在某个地方,你必须为你想要的东西出现的顺序编写逻辑,我认为在你查询WP\\u查询和拥有“表示”代码的地方之外的一个地方整齐地编写逻辑是有意义的。
然而,正如您所知,为了便于参考,有几种方法可以实现您的目标,我向您推荐:
- Write a new meta_value that stores the order
钩住可能添加或更新此帖子类型的每个位置,并使用一个函数写入连续的帖子元值,您可以使用它轻松地在WP\\u查询中排序。这为您提供了最大的灵活性,可以使用PHP代码定义排序,而且很少运行,因此速度很快。
优点:快速,便于查询,使用WP\\u Query的所有功能
缺点:可能是一些复杂的PHP。一定要把它挂在所有正确的地方。
- Run and render multiple WP_Query\'s for each case
如果您有两个案例要按WP\\U查询不支持的顺序显示,例如您有一些空值出现在列表的错误端,则此选项有时很有用。您需要在一个WP\\u查询中查询空值,然后运行另一个查询,其中包含您想要排序的内容和一个条件,即“不是空值”:
优点:最简单的演示代码
缺点:您可能需要重复UI演示(循环)。仅支持较简单的情况
- Get all posts into an array and then sort them how you want:你可以做一个
get_posts()
获取所有内容,然后进行一些自定义编码,以按您想要的顺序对它们进行排序或输出。优点:正是你想要的顺序。订购代码和演示代码<缺点:代码复杂,可能需要滚动您自己的分页
- Inject custom
ORDER BY
SQL
您可以使用例如\'posts_orderby\'
滤器这些可能包括复杂的SQLORDER BY CASE
允许您编写任意复杂排序语句的语句,但这将涉及到一些复杂的SQL优点:所有PHP/presentation代码都简化了
缺点:需要编写复杂的SQL。将来可能会中断WP\\U查询