WordPress WP_List_Table按日期值排序而非字符串的问题求助
解决WP_List_Table按日期值排序但显示月份年份格式的问题
嘿,我懂你这个问题!之前也帮朋友处理过类似的WP_List_Table排序坑——明明数据库里是正确的日期,换成月份+年份显示后就按字母排序乱套了对吧?别慌,核心思路就是排序用原始日期值,显示用格式化后的字符串,这就给你一步步拆解实现方法:
1. 绑定排序到原始日期字段
首先在你的WP_List_Table子类里,通过get_sortable_columns()方法,把显示日期的列和数据库里的原始日期字段关联起来。这样点击列头排序时,WordPress会用真实的日期值而非显示的字符串来排序:
protected function get_sortable_columns() { $sortable_columns = array( // 第一个参数是表格里的列名,第二个是数据库中存储完整日期的字段名 'display_date' => array('original_date', true) ); return $sortable_columns; }
这里display_date是你表格中用来显示日期的列标识,original_date是数据库里存储2017-01-01这类完整日期的字段名。
2. 格式化日期显示
接下来在column_{列名}方法里,把原始日期转换成你想要的January' 17格式。推荐用WordPress自带的date_i18n(),它会自动适配你的站点语言(比如中文环境下会显示“1月' 17”):
protected function column_display_date($item) { // $item['original_date']是从数据库获取的完整日期字符串 $timestamp = strtotime($item['original_date']); // F表示完整月份名称,y表示两位年份,单引号直接输出 return date_i18n("F' y", $timestamp); }
3. 自定义数据集的排序处理(非WP_Query场景)
如果你的表格数据不是来自默认的WP_Query,而是自定义数据库查询或者数组,那需要在prepare_items()方法里手动处理排序逻辑:
public function prepare_items() { // 获取排序参数,记得做安全过滤 $orderby = !empty($_GET['orderby']) ? sanitize_text_field($_GET['orderby']) : 'original_date'; $order = !empty($_GET['order']) ? sanitize_text_field($_GET['order']) : 'ASC'; // 替换成你的数据获取逻辑,比如从自定义表查询数据 $raw_data = $this->fetch_custom_data_from_db(); // 按日期时间戳排序,确保是真实的日期顺序 usort($raw_data, function($a, $b) use ($orderby, $order) { $date_a = strtotime($a[$orderby]); $date_b = strtotime($b[$orderby]); return ($order === 'ASC') ? $date_a - $date_b : $date_b - $date_a; }); // 后续的分页、设置items等逻辑 $this->items = $raw_data; // ... 其他必要的prepare_items代码(比如设置分页、列信息等) }
4. 测试验证
完成以上步骤后,点击日期列的表头,你会发现表格会按照真实的日期先后排序,而显示的却是January' 17、February' 17这种简洁格式,完全符合你的需求!
内容的提问来源于stack exchange,提问作者Khrisna Gunanasurya
相关产品推荐
相关产品推荐

