Php Wordpress自定义帖子类型列排序查询

Php Wordpress自定义帖子类型列排序查询,php,mysql,wordpress,sorting,Php,Mysql,Wordpress,Sorting,我有一个自定义的post类型,名为reservation。在它里面,我得到了你指定的活动/房间的预订(不重要) 当我转到我的自定义帖子类型页面时,我会很好地显示所有帖子。第一列是预订日期。现在预订日期可以是一个-2015年11月28日,但也可以是多个日期-2015年11月28日、2015年11月29日、2015年12月2日。 我想启用该列的排序。问题是,这是一个字符串,而不是一个数字,所以我不能像前面描述的那样创建一个简单的可排序列查询 到目前为止,我试过: add_filter( 'manag

我有一个自定义的post类型,名为
reservation
。在它里面,我得到了你指定的活动/房间的预订(不重要)

当我转到我的自定义帖子类型页面时,我会很好地显示所有帖子。第一列是预订日期。现在预订日期可以是一个-
2015年11月28日
,但也可以是多个日期-
2015年11月28日、2015年11月29日、2015年12月2日。

我想启用该列的排序。问题是,这是一个字符串,而不是一个数字,所以我不能像前面描述的那样创建一个简单的可排序列查询

到目前为止,我试过:

add_filter( 'manage_edit-reservation_sortable_columns', 'reservation_sortable_column' );

if (!function_exists('reservation_sortable_column')) {
    function reservation_sortable_column( $columns ) {
        $columns['reservation_date'] = 'reservation_date';
        return $columns;
    }
}

add_filter( 'posts_clauses', 'manage_wp_posts_be_qe_pre_get_posts', 1, 2 );

if (!function_exists('manage_wp_posts_be_qe_pre_get_posts')) {
    function manage_wp_posts_be_qe_pre_get_posts( $pieces, $query ) {
        global $wpdb;
        if ($query->is_main_query() && ( $orderby = $query->get('orderby') ) ) {
            $order = strtoupper( $query->get('order') );
            if ( !in_array( $order, array('ASC', 'DESC') ) ) {
                $order = 'ASC';
                switch ($orderby) {
                    case 'reservation_date':
                        $pieces[ 'join' ] .= " LEFT JOIN $wpdb->postmeta wp_rd ON wp_rd.post_id = {$wpdb->posts}.ID AND wp_rd.meta_key = 'reservation_date'";
                        $pieces[ 'orderby' ] = "STR_TO_DATE( wp_rd.meta_value,'%d.%m.%Y' ) $order, " . $pieces[ 'orderby' ];
                        break;
                }
            }
            return $pieces;
        }
    }
}
这不起作用,因为我在处理字符串

幸运的是,我的日期(当一个人选择它们时)已经从最低到最高排序。它们存储在
$custom['reservation\u date']
数组中,其中
$custom=get\u post\u custom($post->ID)
。所以我可以像
$custom['reservation\u date'][0]
那样获得它们

我也可以分开第一次约会

preg_match('/^(.+?),/', $custom['reservation_date'][0], $matches);
如果只有一个日期,没有逗号,我就可以像这样把它们取出来:

$first_date = (!empty($matches)) ? $matches[0] : $custom['reservation_date'][0];
现在困扰我的是如何在自定义查询中使用它?目前,排序是在
meta\u值
reservation\u日期
(字符串)上完成的。我怎样才能根据这些第一次的日期进行排序

假设我有这样的约会:

2015年11月19日,2015年11月20日

2015年11月28日

2015年11月14日,2015年11月15日

2015年11月13日

当我按升序对它们排序时,我希望

2015年11月13日

2015年11月14日,2015年11月15日

2015年11月19日,2015年11月20日

2015年11月28日

再点击该列,它们将按降序排列

2015年11月28日

2015年11月19日,2015年11月20日

2015年11月14日,2015年11月15日

2015年11月13日


非常感谢您的帮助。

您将无法在WP查询中排序,因为您没有以WordPress理解的方式存储这些值

您应该将日期存储为YYYY-mm-dd

更改日期的存储方式或在数据库请求排序后使用PHP

// 1. if you change how "reservation_date" is stored in the db

$posts = get_posts(array(
    'posts_per_page' => -1,
    'post_type' => 'reservation',
    'meta_key' => 'reservation_date',
    'orderby' => 'meta_value',
    'order' => 'ASC'
));

// 2. if you choose to sort with PHP after pulling the data

$posts = get_posts(array(
    'posts_per_page' => -1,
    'post_type' => 'reservation'
));

usort($posts, function ($post_a, $post_b) {
    $post_a_custom = get_post_custom($post_a->ID);
    $post_b_custom = get_post_custom($post_b->ID);

    $post_a_date = DateTime::createFromFormat('d.m.Y', $post_a_custom['reservation_date'][0]);
    $post_b_date = DateTime::createFromFormat('d.m.Y', $post_b_custom['reservation_date'][0]);

    if ($post_a_date == $post_b_date) {
        return 0;
    } else if ($post_a_date > $post_b_date) {
        return -1;
    } else {
        return 1;
    }
});

不能那样做。我的Datepicker(从中获取日期)将条目存储为字符串,而不是数字。我的插件中的所有东西都已经在工作了,除了这个。我可能会构建一个自定义的元值,从中我可以排序其中包含数字,然后我可以使用
pre\u get\u posts
解决方案。我只是从教程中复制了这一部分,我的sql知识基本上是不存在的:这就是为什么我在这里寻求任何帮助和指导。我会看看我能做些什么,但我已经创建了所有东西并在工作(前端和后端),排序只是我想添加的一个功能(除非客户要求,否则不必要)。我不想把一切都搞砸。是的,当我创建最终版本时,我可能会用unix转换时间。谢谢你的回答。我仍在开发我的插件,这肯定会派上用场,我会将其标记为正确,如果我还有任何问题,我会问:)