WPML

按照设计,在多语言网站上有些功能的运作方式会有所不同:以默认语言术语为键的 WordPress 函数、WordPress 无法本地化的日期后缀、高级翻译编辑器不会自动生成的别名。支持问题通常会将它们作为错误提出;但它们并不是。本页面将说明会发生什么、原因以及相应的解决方法。

已翻译文章中的 has_category() 及其他条件标签

WordPress 核心的 has_category() 故意不被 WPML 过滤。在翻译版本中,类别是已翻译的术语,具有自己的别名,因此即使法语文章属于法语“news”类别,has_category('news') 在法语文章中也为 false。这同样适用于 has_term()in_category() 以及任何比较默认语言别名或术语 ID 的代码。请使用已翻译的别名调用条件语句,或者先通过 wpml_object_id 过滤器解析术语 ID。

您看到的情况

原生 WordPress 函数 has_category 对已翻译文章不起作用。

示例如下:

  1. 我们有一个英语别名为“test”的类别,其法语翻译为“test-fr”。
  2. 该类别已分配给文章。
  3. 当您在主题的 single.php 文件的循环中调用 has_category("test") 时,它对默认语言返回 true,但对翻译版本返回 false

解决方法

在您的主题的 functions.php 文件中定义一个新的过滤器:

function wp_has_category ($category) {
$category = get_term_by('name', $category, 'category');
return has_category($category);
}
add_filter('wp_has_category', 'wp_has_category', 10, 1);

has_category 函数替换为这个新过滤器:
apply_filters( 'wp_has_category', 'test' )

该过滤器根据原始类别的名称获取已翻译的类别,并检查该已翻译的类别是否已分配给文章。

参考:wpmlcore-3024。

日期后缀(1st、2nd、3rd)不可翻译

这是 WordPress 核心的限制,而不是 WPML 的限制:后缀来自 PHP 的日期格式化,并且从不经过翻译函数。

您看到的情况

某些主题或插件使用 wp_date()date_i18n() WordPress 函数来显示日期。根据所选参数,这些日期可能会使用如 1st 或 26th 的后缀。

目前,由于 WordPress 核心中长期存在的已知限制,无法翻译日期后缀。

解决方法

作为临时解决方法,您可以使用 wp_date 过滤器获取日期,然后在页面上渲染之前修改后缀。在继续操作之前,请对您的网站进行完整备份,并按照以下步骤操作:


  • 在您主题的 functions.php 中添加一个小型 wp_date 过滤器,将每个后缀注册为字符串(icl_register_string),并返回其翻译(icl_t)以代替英语后缀:

  • 打开显示日期的页面。这将执行添加的过滤器。

  • 前往 WPML字符串翻译并翻译日期。

  • 您需要单独翻译每个后缀(例如 1st、2nd…),因为它可能会根据语言而变化。

参考:compsupp-5773。

高级翻译编辑器不会自动生成别名

当您填写别名字段时,编辑器会对其进行翻译;当您将其留空时,编辑器会保留原始别名。它绝不会自行从已翻译的标题中派生出别名。

您看到的情况

如果您使用我们的高级翻译编辑器翻译文章,别名字段不会自动填充。如果您随后决定将别名字段留空,它会在已翻译的文章中加载原始语言的别名

参考:wpmlsupp-8574。

WooCommerce 产品简短说明中的页面构建器简码

简短说明即文章摘要,根据 WordPress 的定义,它是一个纯文本字段,因此 WPML 不会像在内容中那样解析其中的页面构建器简码。WooCommerce 恰好会渲染它们,这就是为什么这种不匹配会让人感到惊讶的原因。

您看到的情况

WooCommerce 产品简短说明基于文章摘要字段,而该字段通常是一个不处理简码的简单文本字段。因此,如果您将页面构建器简码粘贴到文章摘要中,它们预期是不起作用的,并且在翻译文章摘要时,WPML 也不会尝试处理此类简码。

但 WooCommerce 处理这些“摘要”的方式略有不同,简码确实起作用,但 WPML 仍然表现得好像它们不起作用一样,如果简码包含需要翻译的属性或应自动处理的内部链接,这就不容易实现了。

解决方法

我们已经准备了可以作为插件添加的代码来提供此功能。将以下代码复制并粘贴到一个您可以命名为 wpmlpb-excerpts.php 的文件中,并保存在您的 wp-content/plugins/ 目录中,然后激活该插件。

<?php
/**
 * Plugin Name: WPML Page Builders - Proces Excerpts
 * Description: Parses shortcode strings in exceprts.
 * Version: 1.0
 */
namespace WPMLPB686;

( new Excerpts() )->add_hooks();

class Excerpts {

	const SEPARATOR_START = '<!--WPML_EXCERPT_START-->';
	const SEPARATOR_END   = '<!--WPML_EXCERPT_END-->';

	public function add_hooks() {
		add_filter( 'wpml_pb_shortcode_content_for_translation', [ $this, 'joinWithContent' ], 10, 2 );
		add_filter( 'wpml_tm_translation_job_data', [ $this, 'excludeFromJob' ], 10, 2 );
		add_action( 'wpml_pro_translation_completed', [ $this, 'splitFromContent' ], 999 );
	}

	public function joinWithContent( $content, $id ) {
		$post = get_post( $id );
		if ( $post && $post->post_excerpt ) {
			$content .= self::SEPARATOR_START . $post->post_excerpt . self::SEPARATOR_END;
		}

		return $content;
	}

	public function excludeFromJob( $package, $post ) {
		if ( preg_match( '/[[^]]+]/', $post->post_excerpt ) ) {
			$package['contents']['excerpt']['translate'] = 0;
			$package['contents']['excerpt']['data']      = '';
		}

		return $package;
	}

	public function splitFromContent( $post_id ) {
		$post = get_post( $post_id );
		if ( $post && false !== strpos( $post->post_content, self::SEPARATOR_START ) ) {
			$start_pos = strpos( $post->post_content, self::SEPARATOR_START );
			$end_pos   = strpos( $post->post_content, self::SEPARATOR_END, $start_pos );

			if ( false !== $end_pos ) {
				$content = substr( $post->post_content, 0, $start_pos );
				$excerpt = substr( $post->post_content, $start_pos + strlen( self::SEPARATOR_START ), $end_pos - $start_pos - strlen( self::SEPARATOR_START ) );

				if ( $excerpt ) {
					wp_update_post(
						[
							'ID'           => $post_id,
							'post_content' => $content,
							'post_excerpt' => $excerpt,
						]
					);
				}
			}
		}
	}
}

参考:wpmlpb-686。

WordPress.com 托管上的每种语言使用不同的域名

WordPress.com 将一个域名映射到一个网站;“每种语言使用不同的域名” URL 格式需要每个语言域名都能访问同一个 WordPress,而该托管服务不提供此功能。

您看到的情况

由于 WordPress.com 域名映射工作方式的限制,当网站托管在它们上面时,无法选择语言 URL 设置来为每种语言使用不同的域名。

解决方法

可以使用其他任何一种语言 URL 选项(不同语言使用不同目录或语言名称作为参数添加),而不是每种语言使用不同的域名。

如果必须要求每种语言使用不同的域名,则需要使用不同的主机。

参考:wpmltriage-2045。

导入的翻译和翻译编辑器

导入操作会写入已完成的翻译;它不会创建翻译任务,而编辑器是基于任务工作的。翻译在前端已完成,只是无法在高级或经典翻译编辑器中进行编辑。

您看到的情况

每当您使用 WP All Import 和 WPML All Import 附加组件导入内容时,您都会在前端完美地看到导入的文章翻译。但是,如果您尝试使用 WPML 的翻译编辑器更新它们,您将遇到问题:

这是因为当您导入多语言内容时,WPML 不会创建翻译任务,而翻译任务是字符串分割所必需的。

解决方法

要编辑或更新您导入的翻译,请切换到原生 WordPress 编辑器并使用手动翻译

参考:WPMLAI-168。