WooCommerce 产品是带有自定义字段的自定义 WordPress“文章”。它们使用“产品分类”和“产品标签”自定义分类法进行排列。在这里,我们将向您展示多语言 WooCommerce 网站的工作原理,以及您的 WooCommerce 主题需要满足哪些条件才能实现 Multilingual Ready。
多语言 WooCommerce 网站的工作原理
当网站使用 WPML 时,系统会为每个内容元素分配一种语言。这意味着每个产品、分类和标签都将具有语言属性。翻译作为单独的产品保存在数据库中,并使用 WPML 的语言表链接在一起。翻译后的产品共享相同的图像,并拥有自己独立的字段,其中包含正确语言的文本。

网站管理员可以使用 WPML 的产品翻译表方便地进行翻译。这样,他们就可以专注于翻译所需的文本,而不必担心翻译是如何存储在数据库中的。
由于翻译在数据库中是分开的,因此显示多语言 WooCommerce 网站也很容易。实际上,如果您使用 WordPress 和 WooCommerce API,您的主题可能已经实现了 Multilingual Ready。只需进行少量测试和可能的微调,您就可以实现完全的多语言兼容性并进军新市场。
多语言 WooCommerce 网站所需的插件
要运行多语言 WooCommerce 网站,需要以下插件:
- WooCommerce
- WPML 核心插件、WPML 字符串翻译和 WPML 媒体翻译附加组件
- WPML Multilingual & Multicurrency for WooCommerce
WPML 及所有相关插件(包括 WPML Multilingual & Multicurrency for WooCommerce)均包含在 Multilingual CMS 帐户类型中。
模板中的硬编码文本
您的模板文件会混合显示产品信息和硬编码文本。例如,大多数模板将包含产品名称和“Buy”链接。产品名称来自数据库,因此您无需担心如何翻译它。
您应确保使用 GetText 使所有硬编码文本都可翻译。
正确
<p><?php _e('Similar products:', 'my-textdomain') ?></p><input type="button" name="buy-button" value="<?php esc_attr_e('Buy now!', 'my-textdomain') ?>" />
在下面的示例中,“Similar products”和“Buy now!”没有包装在 GetText 调用中。
错误
<p><?php echo 'Similar products:'; ?></p>
<input type="button" name="buy-button" value="Buy now!" />
正确
<p><?php _e('Similar products:', 'my-textdomain') ?></p><input type="button" name="buy-button" value="<?php esc_attr_e('Buy now!', 'my-textdomain') ?>" />错误
<p><?php echo 'Similar products:'; ?></p><input type="button" name="buy-button" value="Buy now!" />“Similar products”和“Buy now!”没有包装在 GetText 调用中。
| 正确 | 错误 |
|---|---|
<p><?php _e('Similar products:', 'my-textdomain') ?></p><input type="button" name="buy-button" value="<?php esc_attr_e('Buy now!', 'my-textdomain') ?>" /> | <p><?php echo 'Similar products:'; ?></p><input type="button" name="buy-button" value="Buy now!" />“Similar products”和“Buy now!”没有包装在 GetText 调用中。 |
确保对所有 GetText 调用使用主题的 textdomain。
硬编码的 WooCommerce 页面
许多电子商务主题包含特殊页面,例如购物车或帐户页面。主题通常包含指向这些页面的链接,这些链接会显示在网站的每个页面上。
如果您对这些链接使用 WordPress 菜单,那么一切就绪。WPML 会为每种语言显示不同的 WordPress 菜单,因此指向这些“特殊页面”的链接会因语言而异。但是,如果您在模板文件中硬编码了这些链接,则需要允许 WPML 将这些链接替换为正确语言的页面链接。
链接到特殊 WooCommerce 页面的正确方法是使用 WordPress API 函数和 WooCommerce 页面 ID。WPML Multilingual & Multicurrency for WooCommerce 会过滤带有 WooCommerce 页面 ID 的 get_option() 调用。它将返回当前语言页面的 ID。
正确
<a href="<?php echo get_permalink(get_option('woocommerce_shop_page_id')) ?>"><?php _e('Shop page', 'my-textdomain') ?></a>
<a href="<?php echo get_permalink(wc_get_page_id('shop')) ?>"><?php _e('Shop page', 'my-textdomain') ?></a>
“shop”是默认语言页面的别名。
错误
<a href="<?php echo get_permalink(5) ?>"><?php _e('Shop page', 'my-textdomain') ?></a>
“shop page” ID 是硬编码的。它在不同网站和不同语言中会有所不同。
<a href="/shop"><?php _e('Shop page', 'my-textdomain') ?></a>
“shop page” URL 是硬编码的。它在不同语言中会有所不同。
| 正确 | 错误 |
|---|---|
<a href="<?php echo get_permalink(get_option('woocommerce_shop_page_id')) ?>"><?php _e('Shop page', 'my-textdomain') ?></a><a href="<?php echo get_permalink(wc_get_page_id('shop')) ?>"><?php _e('Shop page', 'my-textdomain') ?></a>“shop”是默认语言页面的别名。 | <a href="<?php echo get_permalink(5) ?>"><?php _e('Shop page', 'my-textdomain') ?></a>“shop page” ID 是硬编码的。它在不同网站和不同语言中会有所不同。 <a href="/shop"><?php _e('Shop page', 'my-textdomain') ?></a>“shop page” URL 是硬编码的。它在不同语言中会有所不同。 |
Multilingual Ready 产品列表
如果您使用 WooCommerce 简码来显示产品列表,那么一切就绪。WooCommerce 将加载正确语言的产品并将其显示出来。
如果您更喜欢使用自己的代码手动加载产品,请确保您使用的是 WordPress API 或 WooCommerce API 调用。如果您直接访问数据库,WPML 将不会过滤您的调用,您将获得所有语言的所有产品的混合列表。
正确
<?php $products = get_posts(array('post_type' => 'product', 'suppress_filters' => 0)); ?><?php
$args = array(
'post_type' => 'product',
'posts_per_page' => 10,
);
$products = new WP_Query( $args );
?>
错误
<?php $products = get_posts(array('post_type' => 'product')); ?>
suppress_filters 默认将设置为 true,这会阻止语言过滤。
$products = $wpdb->get_results($wpdb->prepare(“SELECT * FROM {$wpdb->posts} WHERE post_type='product' ORDER BY ID DESC LIMIT %d", 10));
WPML 不会过滤低级别的 SQL 查询。系统将返回所有语言的所有产品。
| 正确 | 错误 |
|---|---|
<?php $products = get_posts(array('post_type' => 'product', 'suppress_filters' => 0)); ?><?php | <?php $products = get_posts(array('post_type' => 'product')); ?>suppress_filters 默认将设置为 true,这会阻止语言过滤。 $products = $wpdb->get_results($wpdb->prepare(“SELECT * FROM {$wpdb->posts} WHERE post_type='product' ORDER BY ID DESC LIMIT %d", 10));WPML 不会过滤低级别的 SQL 查询。系统将返回所有语言的所有产品。 |
加载正确的产品后,您在显示它们时就无需担心语言问题。每个产品都将带有自己的自定义字段,其中包含正确语言的信息。
Multilingual Ready 产品模板
由于翻译存储在单独的产品中,因此在多语言 WooCommerce 网站上显示单个产品不需要额外的操作。
多货币支付选项
您的多语言 WooCommerce 网站可能还包含多种货币。对于许多非美国网站来说,支持多种货币是一项非常重要的功能。例如,许多欧洲网站需要收取欧元、英镑和美元。东欧网站通常需要俄罗斯卢布,而亚洲网站则需要各种其他不同的货币。
WPML Multilingual & Multicurrency for WooCommerce 包含多货币支持功能。要允许访问者在货币之间切换,您的主题应包含一个可选的货币切换器。
您可以通过使用 PHP 调用或插入简码来显示货币切换器。
<?php do_action('currency_switcher', array('format' => '%name (%symbol)')); ?>
[currency_switcher]
有关更多信息,请参阅有关 WooCommerce 多货币的教程。请注意,只有在网站使用多种货币时,您才会在前端看到货币切换器。
使您的 WooCommerce 网站兼容 RTL
WooCommerce 主题需要遵循与任何其他 WordPress 主题相同的 RTL 主题支持指南。您应该创建一个 rtl.css 文件,其中包含用于 RTL 显示的 CSS 规则。
使用流式设计处理不同语言的不同文本长度
在创建 Multilingual Ready WooCommerce 主题时,请记住某些文本在某些语言中会更长,而在其他语言中会更短。有时,您甚至无法进行测试,因为您的最终用户将自行翻译。
例如,请看这两个产品区块。
根据经验,请使用长度为 2 倍和 1/2 的文本来测试您的主题。这将涵盖大多数情况。处理不同大小文本的最佳方法是允许流式布局。流式布局允许元素调整大小并占据它们所需的区域。创建具有流式大小的优雅模板并非易事,但这样做有助于避免视觉故障

准备好开始了吗?
如果您是开发人员,正在构建 WooCommerce 主题或扩展,您绝对应该加入我们的 Go Global 计划。您将获得一个免费的 WPML 开发者帐户,并获得我们兼容性团队的优先支持。WooCommerce 商店只是您主题的一个(重要)部分。您绝对应该阅读我们关于实现主题 WPML 兼容性的指南。
在为客户构建网站?购买 WPML,开始构建适用于 WooCommerce 及更多平台的多语言网站。

