背景:我有一个自定义的post类型“events”,它的post meta值为unix时间戳,称为事件开始日期。我还有一个ticket\\u status的post meta值,它有3个可能的值(S=售罄,Y=特价,I=仅邀请)。我目前按事件开始日期从最早到最晚进行排序。
问题:我希望事件按照现在的状态从最早到最晚显示,但我希望所有售罄事件都显示在列表的底部。
我目前将此作为我的$args作为:
\'post_type\' => array(\'events\'),
\'posts_per_page\' => 25,
\'post_status\' => \'publish\',
\'meta_key\' => "event_start_date",
\'orderby\' => "meta_value title\',
\'order\' => \'ASC\'
我还有一个过滤器,它返回$orderby:
$orderby .= ", wp_postmeta.meta_value " . $query->query_vars[\'order\'];
我尝试过按event\\u start\\u date然后按ticket\\u status排序,但之后它会按1)特价活动、2)邀请活动和3)售罄活动排序。这导致事件按错误的时间顺序显示。
可以做一个案例陈述吗?与此类似:
ORDER BY CASE WHEN ticket_status = \'S\' THEN 1 ELSE 0 END, event_start_date ASC
任何能帮我做到这一点的东西都会很棒!提前谢谢你。
SO网友:LUIS
如果您使用的是Wordpress 4.2或更新版本,则可以执行以下操作:
$args = array(
\'post_type\' => \'events\',
\'posts_per_page\' => 10,
\'meta_query\' => array(
\'relation\' => \'AND\',
\'start_date_clause\' => array(
\'key\' => \'start_date\',
\'compare\' => \'EXISTS\',
),
\'ticket_status_order_clause\' => array(
\'key\' => \'ticket_status_order\',
\'compare\' => \'EXISTS\',
),
),
\'order_by\' => array(
\'start_date_clause\' => \'ASC\',
\'ticket_status_order_clause\' => \'ASC\',
)
);
您必须创建ticket\\u status\\u订单,因为无法从可用键/值中按字符串排序:
ASC:(I=仅邀请,S=售罄,Y=特价)DESC:(Y=特价,S=售罄,I=仅邀请)
“售罄”总是排在中间。
有关查询的更多信息,请查看此处:Query improvements in WP 4.2: ‘orderby’ and ‘meta_query’