如何按current_time('mysql')生成的meta_value实现文章查询排序?
问题原因
你当前的查询没有指定自定义字段的类型,orderby=meta_value默认将字段值作为普通字符串处理,orderby=meta_value_num会将值转为数值排序,二者都不适配Y-m-d H:i:s格式的时间字段排序规则,因此出现排序错乱的问题。
修复方案
在查询参数中新增meta_type参数声明字段类型为DATETIME,同时将orderby参数调整为meta_value_datetime(WordPress 4.2及以上版本支持),修改后的代码如下:
$args = [ 'post_type' => 'komik', 'post_status' => 'publish', 'order' => 'DESC', 'orderby' => 'meta_value_datetime', 'meta_key' => 'komik_last_update', 'meta_type' => 'DATETIME', 'no_found_rows' => true, 'posts_per_page' => 20 ];
注意事项
- 若使用的WordPress版本低于4.2,无需修改
orderby参数,仅添加meta_type='DATETIME'配置即可生效,数据库会按声明的日期时间类型处理排序逻辑。 - 需确保所有文章的
komik_last_update字段存储格式统一为Y-m-d H:i:s的标准MySQL时间格式,无格式异常、内容缺失的情况。 - 若存在部分文章未设置该自定义字段的情况,可以添加
meta_query参数过滤无该字段的文章,避免干扰排序:
$args = [ 'post_type' => 'komik', 'post_status' => 'publish', 'order' => 'DESC', 'orderby' => 'meta_value_datetime', 'meta_key' => 'komik_last_update', 'meta_type' => 'DATETIME', 'meta_query' => [ [ 'key' => 'komik_last_update', 'compare' => 'EXISTS', ] ], 'no_found_rows' => true, 'posts_per_page' => 20 ];
内容的提问来源于stack exchange,提问作者Hadezuka
相关产品推荐
相关产品推荐

