在 WordPress 中,将固定链接结构设置为
%postname%时,系统默认会尝试使用文章标题的拼音或英文标题作为文章的别名(slug)。但有时我们希望更精确地控制别名,例如自动使用“年月 + 文章 ID”的格式(如202510123),以确保唯一性、简洁性并避免中文转拼音带来的问题。

🔥 痛点:优雅的 %postname% 链接 vs. 残酷的现实
WordPress 中设置固定链接为 /%postname%/ 是 SEO 的黄金标准——简洁、包含关键词、用户友好。然而,当你为中文博客发愁时,尴尬出现了:中文标题生成的 URL 是一串难以理解的 %e4%b8%ad%e6%96%87 乱码,令人抓狂!即使使用英文标题,长文章标题生成的超长 URL 也极其不友好,更别提修改文章标题后原链接直接失效,导致宝贵的SEO权重流失和恼人的 404 错误。
🛡️ 终极解决方案:两全其美 – 保留 %postname% 设置,却自动生成 年月ID 别名!
这就是本指南要为你带来的完美方案:你的固定链接格式依然优雅地设置为 /%postname%/,但每当你发布文章时,系统会自动且智能地生成一个形如 202510123 的别名(URL slug)。这个别名完美结合了年、月和唯一的文章 ID,彻底解决上述所有痛点!
💪 核心优势:为什么这个方案是 SEO 与维护的完美选择?
- 保留最优设置: 后台固定链接设置保持不变(
/%postname%/),符合SEO最佳实践。 - 极致稳定性: 年月 + ID 组成的别名永不改变!无论你如何修改文章标题、内容甚至分类,文章的永久链接始终如一,彻底杜绝死链(404 错误),保障SEO根基稳固。
- URL 简洁精炼: 自动生成的别名结构简短、清晰、一致(如
/2025101024/),远超冗长的中文或英文标题生成的 URL。 - 完美兼容中文: 不再需要插件处理中文转拼音或忍受乱码,年月数字+ID 的 URL 全球通用。
- 自动化省心: 文章发布或更新(初次保存)时自动生成,无需手动干预,大大提升内容发布效率。
- 用户友好可读性: 虽然核心是 ID,但
/年月ID的结构仍然保留了部分层次和时间信息,比纯数字 ID 更友好。
🛠️ 实战教程:一行代码实现自动化别名生成
只需将以下精心设计的代码片段添加到你的 functions.php 文件(强烈建议使用子主题进行操作)即可:
/**
* WordPress 设置固定链接为 %postname% 时,自动使用年月+文章ID做别名
* 作者: haitheme / 来源: 嗨主题
*/
add_filter( 'wp_unique_post_slug', 'hai_generate_custom_slug_on_date_id', 10, 6 );
function hai_generate_custom_slug_on_date_id( $slug, $post_ID, $post_status, $post_type, $post_parent, $original_slug = null ) {
// 关键检查: 只处理文章(post),且在发布或初次保存时触发
if ( 'post' !== $post_type || 'auto-draft' === $post_status ) {
return $slug;
}
// 获取文章发布时间 (GMT)
$post_date_gmt = get_post_field( 'post_date_gmt', $post_ID );
if ( empty( $post_date_gmt ) || '0000-00-00 00:00:00' === $post_date_gmt ) {
$post_date_gmt = current_time( 'mysql', true ); // 当前 GMT 时间作为默认值
}
// 将 GMT 时间转换为本地时间 (年月)
$post_date_local = get_date_from_gmt( $post_date_gmt );
$date = date( 'ym', strtotime( $post_date_local ) );
// 生成唯一的年月+ID别名 (确保ID足够长,这里用%04d保证4位数)
$new_slug = $date . sprintf( "%04d", $post_ID );
return $new_slug;
}
批量处理历史文章(可选)
/**
* 批量更新历史文章的别名为“年月+ID”
*/
function hai_batch_update_old_posts_slug() {
// 查询所有已发布的文章(排除页面、自定义文章类型,可根据需求调整post_type)
$args = [
'post_type' => 'post',
'post_status' => 'publish',
'posts_per_page' => -1, // 查询所有文章
'fields' => 'ids' // 仅返回文章ID,提高效率
];
$post_ids = get_posts($args);
if (empty($post_ids)) {
echo '没有找到需要更新的文章';
return;
}
foreach ($post_ids as $post_id) {
$post = get_post($post_id);
// 提取发布年月
$year_month = date('Ym', strtotime($post->post_date));
// 生成新别名
$new_slug = $year_month . sprintf( "%04d", $post_ID );
// 更新别名
wp_update_post([
'ID' => $post_id,
'post_name' => $new_slug
]);
echo '已更新文章ID ' . $post_id . ' 的别名为:' . $new_slug . '<br>';
}
}
// 执行批量更新(仅需访问一次网站首页即可触发,执行后删除该行)
add_action('init', 'hai_batch_update_old_posts_slug');
📌 重要说明与进阶技巧
- 精确触发生成时机: 代码只在发布 新文章 或第一次将草稿状态改为发布时执行。已发布文章修改标题不会改变别名,确保链接稳定性。
- 文章类型限定: 默认仅作用于 “文章” (
post),如需应用到自定义文章类型,修改'post' !== $post_type条件即可。 - 别名格式定制: 想用
年-月-ID或年/月/日/ID?简单调整$new_slug的拼接格式,如$year . '-' . $month . '-' . $post_ID或加入date( 'd', $date )。 - ID 位数控制:
sprintf("%04d", $post_ID)确保 ID 至少 4 位(不足补零)。根据网站规模调整数字4(例如万篇文章用%05d)。 - 时区处理: 代码自动处理 GMT 时间与本地时区转换,确保服务器时区设置正确。
- 兼容性: 尽量避免与其他修改 slug 的插件同时使用。如遇冲突,可尝试调整
add_filter的优先级(第3个参数)。
🚀 发布与测试流程
- 安全备份: 修改
functions.php前务必备份网站文件和数据库。 - 部署代码: 将代码放入当前主题(推荐子主题)的
functions.php底部。 - 测试验证:
- 创建新文章,输入标题(中英文皆可)。
- 点击 “发布” 或 “更新”。
- 检查文章编辑界面的 “固定链接” 模块,确认别名自动变为
/2025101001/格式。 - 访问前台文章,核对浏览器地址栏 URL 是否符合预期。

✅ 总结:拥抱稳定、SEO 友好的永久链接
通过这个强大而简洁的方案,你成功实现了:
💎 保留
%postname%的后台设置 + 自动生成年月+ID的别名 = 终极 SEO 链接结构
彻底告别中文乱码死链陷阱、消灭冗长丑陋的 URL、再也不惧标题修改引发的链接失效!这不仅大幅提升网站的专业性和用户体验,更是为你的 SEO 长期策略打下坚实可靠的基础。
立即部署此方案,让你的 WordPress 链接既优雅又坚如磐石!
延伸优化建议:
- 避免别名重复:“年月 + ID” 格式中,文章 ID 是唯一的,因此别名不会重复,无需担心冲突问题;
- SEO 影响:若之前已使用自定义别名且已被搜索引擎收录,修改别名后需通过 “301 重定向”(如使用 Redirection 插件)将旧连接指向新连接,避免流量丢失;
- 自定义文章类型适配:若需要对 “页面”“产品” 等自定义文章类型生效,需在代码中修改$excluded_post_type和post_type参数(如将post_type => ‘post’改为post_type => [‘post’, ‘page’, ‘product’]);
- 代码备份:修改functions.php前建议备份文件,若添加代码后出现网站报错,可通过 FTP 删除错误代码恢复网站。
- 提交网站地图:在 Google Search Console 中提交新的站点地图,加速搜索引擎对新链接结构的识别。
(本文由 [嗨主题] 原创发布,专注解决 WordPress 实战 SEO 难题,转载请注明出处。)






评论
抢沙发