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

如何阻止WordPress的wp_insert_post自动将post_name转换为小写

问题原因

WordPress处理post_name(文章别名/Slug)字段时,默认会调用sanitize_title_with_dashes函数做安全清理,该函数内置了将英文字符统一转换为小写的逻辑,核心目的是避免大小写敏感的URL规则导致不同大小写的同名字符被识别为不同路径,属于框架默认的兼容性设计,并非异常清理行为。

解决方案

方案1:单次插入时直接操作数据库(推荐,影响范围最小)

不修改全局配置,仅针对需要保留大小写的目标文章单独处理,避免影响其他业务逻辑,示例代码:

global $wpdb;
// 组装文章基础字段,先不填post_name
$post = array(
    'post_title' => '你的文章标题',
    'post_status' => 'publish',
    'post_type' => 'post',
    // 其他需要的字段
);
$post_id = wp_insert_post( $post, true );

if ( !is_wp_error( $post_id ) ) {
    // 直接更新数据库字段,跳过默认的sanitize清理逻辑
    $wpdb->update(
        $wpdb->posts,
        array( 'post_name' => 'SampleWord' ),
        array( 'ID' => $post_id ),
        array( '%s' ),
        array( '%d' )
    );
    // 清理文章缓存,保证后续读取到最新的post_name
    clean_post_cache( $post_id );
}

方案2:全局修改Slug清理规则,保留大小写

如果需要所有场景下(包括后台手动发布文章、其他调用插入文章接口的逻辑)的post_name都保留大小写,可以通过钩子替换默认的清理逻辑实现,示例代码:

// 移除默认的slug清理钩子
remove_filter( 'sanitize_title', 'sanitize_title_with_dashes', 10 );
// 新增自定义清理逻辑,保留字符大小写
add_filter( 'sanitize_title', 'custom_sanitize_title_preserve_case', 10, 3 );

function custom_sanitize_title_preserve_case( $title, $raw_title, $context ) {
    if ( 'save' === $context ) {
        $title = $raw_title;
        // 替换空白字符、下划线为横杠
        $title = preg_replace( '/[\s_]+/', '-', $title );
        // 移除所有非英文字母、数字、横杠的特殊字符
        $title = preg_replace( '|[^a-zA-Z0-9\-]|', '', $title );
        // 合并连续的横杠
        $title = preg_replace( '|-+|', '-', $title );
        // 去除首尾的横杠
        $title = trim( $title, '-' );
    }
    return $title;
}
注意事项
  • 绝大多数Web服务器的默认配置是URL路径不区分大小写,修改后SampleWord和sampleword会被识别为同一个路径,可能出现404、文章访问冲突等问题,修改前请确认你的服务器配置已开启URL大小写识别。
  • 全局修改规则会影响所有文章、页面、自定义文章类型的Slug生成逻辑,建议先在测试环境验证符合业务需求后再部署到生产环境。

内容的提问来源于stack exchange,提问作者SkyDev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 17:45:03