如何使用WordPress的get_posts()函数按日期格式的文章标题排序
解决方案
问题根因
直接使用order_by => 'title'排序失效,是因为你的文章标题是dd-mm-yyyy格式的字符串,MySQL默认的字符串排序逻辑是逐位对比字符编码,会优先按日期的「日」维度排序,其次是「月」,最后是「年」,和我们需要的「年→月→日」的日期排序逻辑完全不符,因此会出现顺序混乱。
下面提供两种适配方案,可根据你的场景选择:
方案1:修改SQL排序规则(推荐,性能更好)
通过WordPress的posts_orderby钩子临时修改排序逻辑,用MySQL内置的STR_TO_DATE函数将标题字符串转为日期格式再排序,适合数据量较大的场景:
// 定义自定义排序的钩子函数 function custom_sort_by_title_date( $orderby, $query ) { // 仅对标记了自定义orderby的查询生效,避免影响全站其他查询 if ( $query->get( 'orderby' ) === 'title_date' ) { global $wpdb; return "STR_TO_DATE( {$wpdb->posts}.post_title, '%d-%m-%Y' ) " . $query->get( 'order' ); } return $orderby; } // 挂载钩子 add_filter( 'posts_orderby', 'custom_sort_by_title_date', 10, 2 ); // 调用get_posts查询 $target_posts = get_posts( [ 'post_type' => '替换为你的自定义文章类型别名', 'posts_per_page' => -1, 'orderby' => 'title_date', // 自定义标识,触发上面的排序规则 'order' => 'ASC', // ASC为日期升序(旧的在前),DESC为日期降序(新的在前) 'post_status' => 'publish', ] ); // 查询完成后移除钩子,避免影响后续其他查询 remove_filter( 'posts_orderby', 'custom_sort_by_title_date', 10 );
方案2:PHP端二次排序(适合小数据量)
如果不想修改SQL查询逻辑,也可以先拿到所有文章,再用PHP对结果集按日期排序,适合文章总数不超过1000的场景:
// 先查询所有符合条件的自定义文章 $target_posts = get_posts( [ 'post_type' => '替换为你的自定义文章类型别名', 'posts_per_page' => -1, 'post_status' => 'publish', ] ); // 对结果按标题对应的日期排序 usort( $target_posts, function( $a, $b ) { $date_a = DateTime::createFromFormat( 'd-m-Y', $a->post_title )->getTimestamp(); $date_b = DateTime::createFromFormat( 'd-m-Y', $b->post_title )->getTimestamp(); // 升序返回 $date_a - $date_b,降序返回 $date_b - $date_a return $date_a - $date_b; } );
注意事项
- 请确保所有自定义文章的标题严格遵循
dd-mm-yyyy格式,无多余空格、特殊字符,否则日期解析会出错。如果存在不符合格式的文章,可以在排序逻辑中新增判断,将解析失败的文章统一排在最前/最后。 - 数据量大于1000的场景优先选择方案1,数据库层面的排序性能远高于PHP端排序。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

