如何通过.htaccess正则规则正确实现WordPress链接结构跳转
你之前生成的规则无法实现需求的根本原因是:旧URL结构里只有年份、月份、文章别名三个信息,新结构需要的分类别名、文章ID两个参数不存在于旧URL中,仅靠.htaccess的正则匹配无法拿到这两个缺失的参数,所以不能用简单的RedirectMatch规则直接实现。
以下是两种可落地的解决方案:
方案一:使用WordPress内置逻辑实现自动跳转(推荐,无需手动维护规则)
你可以把下面的代码添加到当前使用主题的functions.php文件末尾,也可以通过代码片段类插件插入,WordPress会自动根据旧链接里的文章别名匹配对应文章,自动拼接成新结构的URL完成301跳转,适配所有存量文章:
add_action('template_redirect', function() { // 匹配旧链接规则:/年/月/文章别名.html if (preg_match('#^/([0-9]{4})/([0-9]{2})/([^/]+)\.html$#', $_SERVER['REQUEST_URI'], $matches)) { $post_name = $matches[3]; // 根据文章别名查询对应文章 $target_post = get_page_by_path($post_name, OBJECT, 'post'); if ($target_post) { // 获取文章首个分类的别名 $post_categories = get_the_category($target_post->ID); $category_slug = $post_categories[0]->slug; // 生成符合要求的新结构URL $new_permalink = home_url("/{$category_slug}/{$target_post->post_name}/{$target_post->ID}/"); // 执行301永久跳转 wp_redirect($new_permalink, 301); exit; } } });
配置完成后清空站点缓存和浏览器缓存即可生效,测试阶段可以先把301改成302避免跳转缓存影响调试,确认没问题后改回301即可。
方案二:.htaccess手动映射(仅适合文章数量较少的站点)
如果你的站点文章总数少于50篇,可以手动整理所有文章的旧别名、对应分类别名、文章ID的映射关系,在.htaccess中逐篇编写跳转规则,示例如下:
<IfModule mod_rewrite.c> RewriteEngine On # 单篇文章跳转规则示例:旧别名test-post,分类别名news,文章ID123 RewriteRule ^[0-9]{4}/[0-9]{2}/test-post\.html$ /news/test-post/123/ [L,R=301] # 其余文章按照上述格式逐个添加规则即可 </IfModule>
该方案无需修改WordPress代码,但每新增文章都需要手动补充规则,维护成本较高,文章量大的站点不推荐使用。
内容的提问来源于stack exchange,提问作者Mo.Ali
相关产品推荐
相关产品推荐

