window.location.href/replace拼接URL而非替换?求助排查
咱们先拆解下你遇到的URL拼接而非跳转的问题,主要是代码里的两个小错误导致的,和WordPress本身关系不大:
核心问题1:URL缺少协议前缀
你定义的url变量是'www.becreativeagencja.com/elplast-wp/',没有加上https://前缀。浏览器会把这种没有协议的字符串当成相对路径,所以执行跳转时,它会把这个路径拼接到当前页面的URL后面,而不是跳转到新的独立地址。
核心问题2:position计算逻辑错误
url.indexOf('/')找的是字符串里第一个/的位置(也就是在www.becreativeagencja.com之后),然后加12的数值是硬编码的,完全不符合你的URL结构。比如你的url字符串总长度是35,计算出来的position也是35,这就导致url.slice(0, position)是整个原URL,再加上语言后缀后,得到的是www.becreativeagencja.com/elplast-wp/en,再结合相对路径的问题,最终就变成了当前URL拼接这个字符串,出现错误的跳转地址。
修复方案
方案1:直接修正前端代码(快速解决)
给URL加上完整的https://协议,并用更可靠的URL API来处理路径,避免硬编码位置:
$("#languages p").click(function() { const $language = $(this).text(); const $lang = $language.toLowerCase(); // 使用带https协议的完整绝对URL const baseUrl = new URL('https://www.becreativeagencja.com/elplast-wp/'); // 把语言作为子目录添加到路径末尾,比如 https://www.becreativeagencja.com/elplast-wp/en/ baseUrl.pathname += $lang + '/'; window.location.replace(baseUrl.href); });
如果你的多语言结构是语言放在域名和elplast-wp之间(比如https://www.becreativeagencja.com/en/elplast-wp/),可以调整路径处理逻辑:
$("#languages p").click(function() { const $language = $(this).text(); const $lang = $language.toLowerCase(); const baseUrl = new URL('https://www.becreativeagencja.com/elplast-wp/'); // 拆分路径并插入语言 const pathParts = baseUrl.pathname.split('/'); // 在第二个位置插入语言 pathParts.splice(1, 0, $lang); baseUrl.pathname = pathParts.join('/'); window.location.replace(baseUrl.href); });
方案2:结合WordPress特性(更灵活推荐)
硬编码URL很不灵活,万一站点迁移或URL变更,代码就失效了。可以用WordPress的wp_localize_script函数把站点URL传递到前端:
- 在你的主题
functions.php文件中添加以下代码:
function enqueue_custom_lang_script() { // 加载你的自定义JS文件(替换成你实际的JS文件路径) wp_enqueue_script('custom-lang-script', get_template_directory_uri() . '/js/lang-switcher.js', array('jquery'), '1.0', true); // 传递站点URL到前端全局变量 wp_localize_script('custom-lang-script', 'siteInfo', array( 'siteUrl' => get_site_url() )); } add_action('wp_enqueue_scripts', 'enqueue_custom_lang_script');
- 然后在前端JS中使用这个全局变量:
$("#languages p").click(function() { const $language = $(this).text(); const $lang = $language.toLowerCase(); // 使用WordPress传递的站点URL const baseUrl = new URL(siteInfo.siteUrl + '/elplast-wp/'); baseUrl.pathname += $lang + '/'; window.location.replace(baseUrl.href); });
这样不管你的站点URL怎么变化,代码都能正常工作,也更符合WordPress的开发规范。
内容的提问来源于stack exchange,提问作者Damian Doman

