无插件手动为WordPress全类型URL添加/language/前缀的实现咨询
无插件实现WordPress全内容语言URL前缀改造方案
核心实现逻辑
通过WordPress内置的重写规则API、链接生成过滤器、模板重定向钩子,不依赖第三方插件即可完成所有内容类型的URL语言前缀适配,覆盖普通文章、独立页面、WooCommerce产品、所有自定义文章类型的路由与链接生成。
具体操作步骤
- 注册自定义语言查询变量
先让WordPress能够识别URL中携带的语言参数,将lang加入允许读取的公共查询变量列表:
add_filter('query_vars', function($vars) { $vars[] = 'lang'; return $vars; });- 注册自定义语言查询变量
- 注册高优先级语言路由规则
匹配所有格式为/{两位语言代码}/任意子路径的URL,将语言代码捕获为lang查询参数,必须将规则优先级设为top,否则会被WordPress默认固定链接规则抢占匹配,这是绝大多数自定义方案不生效的核心原因:
add_action('init', function() { add_rewrite_rule( '^([a-z]{2})/(.*)?$', '?lang=$1&pagename=$2', 'top' ); });- 注册高优先级语言路由规则
- 全局覆盖所有类型的链接生成逻辑
分别挂钩文章、页面、自定义文章类型的链接生成过滤器,自动在所有生成的URL路径最前面拼接当前语言代码,确保所有输出给用户的链接都符合要求:
// 适配普通文章链接 add_filter('post_link', function($permalink, $post) { $current_lang = get_query_var('lang') ?: 'en'; return home_url("/{$current_lang}" . wp_make_link_relative($permalink)); }, 10, 2); // 适配独立页面链接 add_filter('page_link', function($permalink) { $current_lang = get_query_var('lang') ?: 'en'; return home_url("/{$current_lang}" . wp_make_link_relative($permalink)); }); // 适配自定义文章类型(含WooCommerce产品)链接 add_filter('post_type_link', function($permalink, $post) { $current_lang = get_query_var('lang') ?: 'en'; return home_url("/{$current_lang}" . wp_make_link_relative($permalink)); }, 10, 2);- 全局覆盖所有类型的链接生成逻辑
- 旧URL自动301跳转
针对用户直接访问不带语言前缀的旧URL的场景,自动跳转到对应语言前缀的新URL,避免重复内容与404:
add_action('template_redirect', function() { if (!get_query_var('lang') && !is_admin() && strpos($_SERVER['REQUEST_URI'], '/wp-admin') !== 0 && strpos($_SERVER['REQUEST_URI'], 'wp-content') === false && strpos($_SERVER['REQUEST_URI'], 'wp-includes') === false ) { $redirect_target = home_url('/en' . $_SERVER['REQUEST_URI']); wp_redirect($redirect_target, 301); exit; } });- 旧URL自动301跳转
常见不生效的排查点
- 所有代码添加完成后,必须进入WordPress后台「设置-固定链接」页面,不修改任何内容直接点击保存,刷新系统内置的重写规则缓存
- 检查站点伪静态配置:Apache站点需确认
.htaccess文件包含WordPress默认的重写规则;Nginx站点需确认配置中已将所有非静态文件的请求转发到根目录index.php - 清空服务器端页面缓存、CDN缓存、对象缓存,避免旧规则残留
- 不要修改默认固定链接结构为带语言代码的格式,会和自定义重写规则产生路由冲突
内容的提问来源于stack exchange,提问作者paolaG
相关产品推荐
相关产品推荐

