帮助按两个元值对Post循环进行排序

时间:2016-07-27 作者:gishua

背景:我有一个自定义的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
任何能帮我做到这一点的东西都会很棒!提前谢谢你。

1 个回复
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’

相关推荐

WooCommerce sort by SKU

所以我试过了https://gist.github.com/bekarice/1883b7e678ec89cc8f4d 在我的网站上。只要所有产品都有SKU,效果就很好。如果产品没有SKU,则根本不会显示。也就是说,是否有其他方法可以按SKU排序,但不要求产品实际具有SKU?