借助PolyLang实现购物车关键词多语言更新(AJAX/WooCommerce)
解决WooCommerce AJAX购物车中“product/products”的PolyLang多语言翻译问题
嗨,我来帮你搞定这个多语言翻译的问题!其实不用写一堆复杂的pll_current_language()条件判断,利用PolyLang自带的翻译函数就能优雅解决,还能轻松适配后续新增的语言。下面是具体的实现步骤:
1. 用PolyLang的单复数翻译函数替换硬编码文本
PolyLang提供了pll_n()函数,专门用来处理单复数的翻译逻辑,它会根据你传入的数量自动切换单复数形式,同时匹配当前语言的翻译内容。
把你之前定义$item这类变量的代码,替换成下面的写法:
// 获取购物车商品总数 $cart_count = WC()->cart->get_cart_contents_count(); // 用pll_n处理单复数翻译:参数分别是单数文本、复数文本、数量 $item_label = pll_n('product', 'products', $cart_count);
这样不管用户切换到哪种语言,只要你在PolyLang后台配置了对应翻译,$item_label就会自动输出正确的文本。
2. 确保AJAX请求能识别当前语言
AJAX请求默认可能不会携带语言上下文,所以需要在你的AJAX回调函数开头,手动设置当前语言,避免翻译失效。我们可以从PolyLang的cookie或者前端传入的参数里获取语言标识:
add_action('wp_ajax_update_cart', 'custom_update_cart_callback'); add_action('wp_ajax_nopriv_update_cart', 'custom_update_cart_callback'); function custom_update_cart_callback() { // 优先从POST参数获取语言,其次从PolyLang的cookie读取 if (isset($_POST['lang'])) { pll_set_language($_POST['lang']); } elseif (isset($_COOKIE['pll_language'])) { pll_set_language($_COOKIE['pll_language']); } // 你的购物车更新逻辑 $cart_count = WC()->cart->get_cart_contents_count(); $item_label = pll_n('product', 'products', $cart_count); $cart_total = WC()->cart->get_cart_total(); // 返回JSON格式的响应 wp_send_json([ 'count' => $cart_count, 'item_text' => sprintf('%d %s', $cart_count, $item_label), 'total' => $cart_total ]); wp_die(); // 必须加上,结束AJAX请求 }
3. (可选)前端AJAX请求携带语言参数
如果你的站点cookie机制有特殊设置,也可以在前端发送AJAX请求时主动带上当前语言标识,确保后端能准确识别:
// 获取当前语言(可以从PolyLang的全局变量或HTML的lang属性获取) const currentLang = pll_current_language || document.documentElement.lang; jQuery.ajax({ url: ajax_object.ajax_url, // 替换成你的AJAX URL type: 'POST', data: { action: 'update_cart', lang: currentLang }, success: function(response) { // 更新页面上的购物车元素 $('.cart-count').text(response.count); $('.cart-item-text').text(response.item_text); $('.cart-total').text(response.total); } });
4. 在PolyLang后台配置翻译
最后一步,别忘了去PolyLang的翻译界面,找到product和products这两个字符串,添加对应语言的翻译内容。如果你的代码里用了自定义文本域,记得在PolyLang的设置里把这个文本域标记为可翻译的。
这样修改后,用户切换语言时,购物车的“product/products”文本就会自动同步翻译了,而且比硬写条件判断灵活得多,后续加新语言也不用改代码~
内容的提问来源于stack exchange,提问作者tobiasg
相关产品推荐
相关产品推荐

