我有一个名为reservation
的自定义帖子类型。在里面,我得到了你指定的活动/房间的预订(不重要)。
当我转到我的自定义帖子类型页面时,我会很好地显示所有帖子。第一列是预订日期。现在预订日期可以是一个-28.11.2015
,但也可以是多个日期-28.11.2015, 29.11.2015, 02.12.2015.
我想启用该列的排序。问题是,这是一个字符串,而不是一个数字,所以我不能像这里描述的那样创建一个简单的可排序列查询。
到目前为止,我尝试了这个:
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_date']
阵列中,其中$custom = get_post_custom($post->ID)
。所以我可以像$custom['reservation_date'][0]
一样得到它们。
我也可以分开第一个日期
preg_match('/^(.+?),/', $custom['reservation_date'][0], $matches);
如果只有一个日期,没有逗号,我可以把它们像一样拿出来
$first_date = (!empty($matches)) ? $matches[0] : $custom['reservation_date'][0];
现在困扰我的是如何在自定义查询中使用它?目前排序是在meta_value
reservation_date
(字符串)上完成的。我该如何根据第一次约会进行排序?
假设我有这样的日期:
2015年11月19日,2015年12月20日
2015年11月28日
2015年11月14日,2015年12月15日
2015年11月13日
当我点击按升序排序时,我想得到
2015年11月13日
2015年11月14日,2015年12月15日
2015年11月19日,2015年12月20日
2015年11月28日
再点击一次该列,就会命令它们下降
2015年11月28日
2015年11月19日,2015年12月20日
2015年11月14日,2015年12月15日
2015年11月13日
感谢您的帮助。
您将无法在WP查询中排序,因为您没有以WordPress理解的方式存储值。
https://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters
您应该将日期存储为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;
}
});