如何用Polylang翻译WooCommerce产品且不重复创建产品?
针对免费版Polylang默认会为WooCommerce产品创建独立翻译内容的问题,提供两种可行方案:
方案一:自定义字段+模板修改(推荐,完全保持单产品ID/URL)
这种方式彻底禁用Polylang对产品的翻译功能,通过自定义字段存储多语言内容,在模板中根据当前语言调用对应内容。
禁用Polylang对产品的翻译支持
进入Polylang设置 → 「自定义文章类型」,取消勾选「产品(product)」,保存设置后Polylang将不再为产品生成独立翻译内容。添加多语言自定义字段
在产品编辑页的「自定义字段」区域,为每个需要翻译的字段添加对应语言的键值对:- 例如英文标题:键填
product_title_en,值填英文名称 - 中文标题:键填
product_title_zh,值填中文名称 - 同理添加
product_desc_en(英文描述)、product_desc_zh(中文描述)
如果觉得原生自定义字段麻烦,可以用免费版Advanced Custom Fields(ACF)创建更直观的多语言字段组
- 例如英文标题:键填
修改产品模板文件
复制主题的single-product.php和content-product.php到子主题目录(避免主题更新丢失修改),然后替换标题和描述的输出逻辑:// 获取当前语言标识(根据你的Polylang语言设置调整,比如'en'、'zh') $current_lang = pll_current_language(); // 替换产品标题(single-product.php中) $custom_title = get_post_meta(get_the_ID(), "product_title_{$current_lang}", true); $product_title = !empty($custom_title) ? $custom_title : get_the_title(); echo '<h1 class="product_title entry-title">' . esc_html($product_title) . '</h1>'; // 替换产品描述(single-product.php中) $custom_desc = get_post_meta(get_the_ID(), "product_desc_{$current_lang}", true); $product_desc = !empty($custom_desc) ? wpautop($custom_desc) : get_the_content(); echo '<div class="entry-content">' . $product_desc . '</div>';产品列表页(
content-product.php)做类似修改,替换标题和简短描述的输出即可。
方案二:同步字段+强制URL指向主产品(适合不想大量改模板的用户)
这种方式保留Polylang的产品翻译功能,但通过同步字段和代码强制所有语言指向同一个产品URL:
开启字段同步
进入Polylang设置 → 「高级」,开启「同步自定义字段」,然后添加WooCommerce核心字段(如_price、_stock等)到同步列表,确保翻译版产品的核心信息和主产品保持一致。强制语言切换指向主产品URL
在子主题的functions.php中添加以下代码,让产品的语言切换链接始终指向默认语言的产品URL:add_filter('pll_get_post_translation_url', function($url, $post_id, $lang) { if (get_post_type($post_id) !== 'product') return $url; // 获取默认语言的主产品ID $main_product_id = pll_get_post($post_id, pll_default_language()); return get_permalink($main_product_id); }, 10, 3);翻译产品仅修改名称和描述
创建产品的翻译版本时,只修改产品名称和描述,其他核心字段依赖Polylang的同步功能自动保持一致,用户切换语言时会加载对应翻译的内容,但访问的是同一个URL。
内容的提问来源于stack exchange,提问作者creators

