You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 16:45:04