如何按照dd.mm.yyyy格式的标题对管理中的帖子进行排序?

时间:2017-07-28 作者:Ivan Topić

我为预订创建了一个自定义的帖子类型,新帖子由访客插入,标题格式为预订发生的日期。因此,admin中的帖子列表如下所示:

enter image description here

有没有办法我可以按日期标题在管理列表中排序这些帖子?一般来说,我想解决办法是获取标题,将其转换为日期,然后对这些帖子进行排序。如果是这样,我如何在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;

}

1 个回复
最合适的回答,由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的影响下编写这种子字符串排序的;-)

但首先考虑另一种方法,比如以可排序的方式编写标题。

结束

相关推荐

POST获取忽略SORT_COLUMN?

我正在为我的投资组合使用下面的子页面代码。出于某种原因,它似乎忽略了我在页面上设置的顺序。有什么帮助吗? <?php $args = array( \'post_type\' => \'page\', \'sort_column\' => \'menu_order\', \'post_status\' => \'publish\', \'posts_per_page\