如何在使用d-m-Y格式时按日期排序

时间:2019-05-06 作者:Connor

该问题依据以下内容—How to Sort Custom Field Admin Column by Date

我正在尝试添加按每个帖子自定义字段中手动指定的日期对自定义帖子管理列表列进行排序的功能。日期将添加到d-m-Y 格式,无法更改。

我已经使用下面的代码在自定义帖子管理列表中添加了新列,除了排序之外,其他一切都正常工作。单击排序链接时,日期排序不正确。

我被告知,问题是因为日期不是以mysql格式存储的,我需要使用posts_orderby 胡克,但我不太确定如何做到这一点。

任何帮助都将不胜感激。

//add custom field column to post list
function add_admin_course_column_title( $columns ) {
  $columns[\'online_start\'] = __( \'Online Start\' );
  return $columns;
}
add_filter( \'manage_courses_posts_columns\', \'add_admin_course_column_title\' );

function add_admin_course_column( $column, $post_id ) {
    if ( \'online_start\' === $column ) {
        $onlinestart = get_post_meta( $post_id, \'online_start\', true );

        if ( ! $onlinestart ) {
                _e( \'n/a\' );
        } 
        else {
            echo $onlinestart;
        }
    }
}
add_action( \'manage_courses_posts_custom_column\', \'add_admin_course_column\', 10, 2);

function add_sortable_date_column( $columns ) {
  $columns[\'online_start\'] = \'online_start\';
  return $columns;
}
add_filter( \'manage_edit-courses_sortable_columns\', \'add_sortable_date_column\');

function courses_columns_orderby( $query ) {
    if( ! is_admin() )
    return;
    $orderby = $query->get( \'orderby\');
    switch( $orderby ){
        case \'online_start\': 
            $query->set(\'meta_key\',\'online_start\');
            $query->set(\'orderby\',\'meta_value_datetime\');
            $query->set(\'meta_type\', \'datetime\');
            break;
        default: break;
    }
}
add_action( \'pre_get_posts\', \'courses_columns_orderby\' );

1 个回复
最合适的回答,由SO网友:HU ist Sebastian 整理而成

您需要直接扩展MySQL查询,因为您必须使用MySQL函数STR_to_DATE,以便不影响分页等。

您应该能够通过以下方式更改pre\\u get\\u帖子来实现这一点:

add_action( \'pre_get_posts\', \'courses_columns_orderby\' );

function courses_columns_orderby( $query ) {
    if( ! is_admin() )
    return;
    $orderby = $query->get( \'orderby\');
    switch( $orderby ){
        case \'online_start\': 
            add_filter( \'posts_join\', \'do_order_by_custom_date_field_join\' );
            add_filter( \'posts_orderby\', \'do_order_by_custom_date_field_orderby\',10,2 );
            break;
        default: break;
    }
}
现在,我们手动加入meta\\u表,以便定义它获得的别名:

function do_order_by_custom_date_field_join($join){
    global $wpdb;
    $join.="LEFT JOIN $wpdb->postmeta my_order_meta ON (($wpdb->posts.ID = my_order_meta.post_id) AND (my_order_meta.meta_key = \'online_start\')) ";
    //as we don\'t want our join to be used more than once on this page, we remove the filter
    remove_filter( \'posts_join\', \'do_order_by_custom_date_field_join\' );
    return $join;
}
最后,我们将订单更改为日期,但使用STR\\u to\\u date函数:

function do_order_by_custom_date_field_orderby($orderby, $wp_query){
    $orderby = "STR_TO_DATE(my_order_meta.meta_value,\'%d-%m-%Y\') ".$wp_query->get(\'order\');
    remove_filter(\'posts_orderby\', \'do_order_by_custom_date_field_orderby\');
    return $orderby;
}
现在,orderby应该可以正常工作了(没有进行测试)

快乐的编码。

相关推荐

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。这可能吗?如果是,我将如何实现它?