我为预订创建了一个自定义的帖子类型,新帖子由访客插入,标题格式为预订发生的日期。因此,admin中的帖子列表如下所示:
有没有办法我可以按日期标题在管理列表中排序这些帖子?一般来说,我想解决办法是获取标题,将其转换为日期,然后对这些帖子进行排序。如果是这样,我如何在pre\\u get\\u posts()过滤器中执行此操作?
也许我可以做得更好,但这些功能的其他方面都很好。每个帖子都包含ACF中继器,时间以步为单位,所以里面有点复杂。
编辑:
这就是我的过滤器,它可以正确地修改posts_per_page
只是为了确保它能正常工作。我尝试将其重新创建为插件类。
public function __construct(){
add_action( \'pre_get_posts\', array($this, \'sort_admin_daily_reservations\'));
add_filter( \'posts_orderby\', array($this, \'test_sorting_filter\' ), 10, 2);
}
public function sort_admin_daily_reservations($query) {
if(is_admin() && $query->is_main_query() && in_array ($query->get(\'post_type\'), array(\'Booking\')) )
{
$query->set(\'orderby\', \'wpse_mod_title\');
$query->set(\'order\', \'DESC\');
//$query->set(\'posts_per_page\', 2);
}
return $query;
}
public function test_sorting_filter($orderby, \\WP_Query $q) {
global $wpdb;
$_orderby = $q->get( \'orderby\' );
$_order = $q->get( \'order\' );
if(\'wpse_mod_title \' === $_orderby && in_array( $_order , [ \'ASC\', \'DESC\' ], true ))
$orderby = " CONCAT(
SUBSTRING( {$wpdb->posts}.post_title, 7, 4 ),
SUBSTRING( {$wpdb->posts}.post_title, 4, 2 ),
SUBSTRING( {$wpdb->posts}.post_title, 1, 2 )
) {$_order} ";
return $orderby;
}
最合适的回答,由SO网友:birgire 整理而成
看起来帖子的标题有日期格式DD.MM.YYYY.
我们可以订购DD.MM.YYYY
标题为YYYYMMDD
使用:
$query = new WP_Query( [ \'orderby\' => \'wpse_mod_title \' ] );
这类插件支持:
/**
* Plugin Name: WPSE-274981: Sort DD.MM.YYYY Post Titles as YYYYMMDD In WP_Query
* Desription: Supported by the wpse_mod_title orderby value
*/
add_filter( \'posts_orderby\', function( $orderby, \\WP_Query $q ) use ( &$wpdb )
{
$_orderby = $q->get( \'orderby\' );
$_order = $q->get( \'order\' );
if( \'wpse_mod_title\' === $_orderby && in_array( $_order , [ \'ASC\', \'DESC\' ], true ) )
$orderby = " CONCAT(
SUBSTRING( {$wpdb->posts}.post_title, 7, 4 ), // Get the YYYY part
SUBSTRING( {$wpdb->posts}.post_title, 4, 2 ), // Get the MM part
SUBSTRING( {$wpdb->posts}.post_title, 1, 2 ) // Get the DD part
) {$_order} ";
return $orderby;
}, 10, 2 );
注意,这假设
DD.MM.YYYY
标题格式,不带空格。
我们可以考虑在SQL中对其进行裁剪,使其更加灵活。
我想我是在@bonger或@thedeadmedic的影响下编写这种子字符串排序的;-)
但首先考虑另一种方法,比如以可排序的方式编写标题。