按元值对帖子进行排序:2种不同的顺序

时间:2015-10-14 作者:Evan Hobbs

我有一个自定义post类型的meta值,名为workshop 哪个是start_time 作为UNIX时间戳。现在我可以用

$query->set(\'posts_per_page\', -1);
$query->set(\'meta_key\', \'start_time\');
$query->set(\'orderby\', \'meta_value_num\');
$query->set(\'order\', \'ASC\');
我想做的是将其分为两种不同的方式,因为有些研讨会可能会在将来举行,有些研讨会可能已经通过。因此,我的理想分类是:

首先是仍在未来的研讨会,即start_time >= time() 已排序ASCstart_time < time() 已排序的描述,但它们仍将显示在同一查询中。有没有办法做到这一点?

1 个回复
SO网友:HU ist Sebastian

我认为它应该能够钩住posts_clauses filter 向sql查询中添加字段。

add_filter( \'posts_clauses\', \'intercept_query_clauses\', 20, 1 );

function intercept_query_clauses( $pieces ){
    global $wpdb;
    $pieces[\'fields\'].=\', (IF(UNIX_TIMESTAMP()>=\'.$wpdb->postmeta.\'.meta_value,\'.$wpdb->postmeta.\'.meta_value,(UNIX-TIMESTAMP() - \'.$wpdb->postmeta.\'.meta_value)+UNIX_TIMESTAMP(\'2099-01-01\'))) as timestamp_direction\';
    $pieces[\'orderby\']=\'timestamp_direction ASC\';
    return $pieces;
}
逻辑如下:

假设在元字段中有一些时间戳

事件1(过去):9999

事件2(过去):10000

现在的时间戳:11111

事件3(未来):12222

事件4(未来):13333

2099-01-01的时间戳:100000

我们在查询中构建一个临时字段,如果该字段的时间戳高于当前时间戳,则该字段具有元字段的时间戳。如果元字段低于元字段,则首先从当前时间戳中减去它,然后从未来的日期时间戳中减去它。之后,我们有以下值:

事件1:101112

事件2:101111

事件3:12222

事件4:13333

现在,按timestamp\\u方向对其进行排序为我们提供了所需的顺序:首先是未来事件的排序ASC,然后是过去事件的排序DESC:

事件3:12222

事件4:13333

事件2:101111

事件1:101112

相关推荐

Sort posts in a specific way

我目前有6个职位属于“服务”类别。每个服务都有\\u内容和1-2个文档(小册子和/或T&C以及外部表单)现在,假设这6篇文章的ID为1,2,3,4,5,6,但我希望它是2,5,3,1,4,6。这可能吗?如果是,我将如何实现它?