如何通过WordPress Polylang向Angular应用传递语言代码?切换语言后语言代码未更新的问题求助
解决Polylang语言同步到Angular应用的问题
我之前也碰到过Polylang和嵌入Angular应用的语言同步问题,你的现有实现里主要有两个坑:Polylang当前语言的正确获取方式和AJAX请求的缓存问题,下面给你几个可行的解决方案:
1. 修正PHP端获取Polylang当前语言的逻辑
你原来用get_bloginfo("language")拿到的其实是WordPress站点的默认语言,不是Polylang切换后的前台活跃语言。Polylang提供了专门的函数来获取当前语言,咱们修改getLanguage.php:
<?php require_once("../../../../../wp-load.php"); // 先确认Polylang函数已加载 if (function_exists('pll_current_language')) { // 获取当前语言的locale格式(比如de_DE、fr_FR) $current_locale = pll_current_language('locale'); echo json_encode($current_locale); } else { // 降级到站点默认语言作为备选 $default_lang = get_bloginfo("language"); echo json_encode($default_lang); } // 加上缓存禁用头,避免浏览器缓存旧结果 header("Cache-Control: no-cache, no-store, must-revalidate"); header("Pragma: no-cache"); header("Expires: 0"); ?>
2. 避免Angular HTTP请求被缓存
浏览器会对GET请求做缓存,这也是你切换语言后仍拿到旧值的原因之一。可以在Angular的请求里加一个时间戳参数,强制每次请求都更新:
// http.service.ts getLanguage(): Observable<string> { // 追加随机时间戳,绕过缓存 const requestUrl = `${environment.url}?timestamp=${new Date().getTime()}`; return this.http.get<string>(requestUrl); }
3. 更高效的方案:直接在WordPress页面注入语言值
其实不用AJAX请求这么麻烦,既然Angular是嵌入在WordPress主题的page-app.php里,咱们可以直接在页面渲染时把当前语言值输出为全局变量,Angular初始化时直接读取:
在page-app.php里添加:
<?php // 获取当前Polylang语言的locale $wp_current_lang = function_exists('pll_current_language') ? pll_current_language('locale') : get_bloginfo("language"); ?> <!-- 输出全局变量给Angular读取 --> <script> window.wpCurrentLanguage = "<?php echo esc_js($wp_current_lang); ?>"; </script>
在app.component.ts里读取:
ngOnInit(): void { // 直接读取全局变量,无需AJAX请求 this.lang = (window as any).wpCurrentLanguage; console.log('当前语言:', this.lang); }
这个方案不仅避免了缓存问题,还减少了一次HTTP请求,性能更好。
总结一下:核心是要用Polylang的专属函数获取当前活跃语言,同时避免请求缓存问题,直接注入全局变量是最省心的方式。
内容的提问来源于stack exchange,提问作者Fonty
相关产品推荐
相关产品推荐

