如何为多语言WordPress实现hreflang标签

您已将整个WordPress网站翻译成六种语言。.po文件干净,.mo文件已编译,每个字符串在法语、德语和日语中都能完美呈现。然而,上线几周后,您检查Google Search Console却发现了一些令人费解的问题:您的法语页面在德语查询中排名靠前,您的西班牙-墨西哥页面被提供给西班牙的搜索者,并且您的两个语言版本在排名中悄然相互蚕食。内容本身没问题。问题在于Google不知道哪个版本属于哪个受众。
这正是hreflang WordPress标签旨在解决的问题。Hreflang是一个信号,它告诉搜索引擎应该将页面的哪个语言和地区版本提供给哪个用户。如果操作不当,您将面临重复内容稀释、语言错误的结果以及抓取预算浪费的问题。如果操作正确,每个翻译页面都能触达其目标受众。本指南将涵盖语法、语言和语言-地区代码之间的区别、强制性的x-default、返回标签的互惠性,以及在WordPress中实现它的三种实用方法。
hreflang的实际作用
Hreflang不翻译任何内容。它是一个关系图。当您拥有同一页面的多个语言版本时,hreflang注释会告诉Google“这个URL是英文版本,这个是德文版本,这个是面向墨西哥的西班牙语使用者。”Google会根据用户的语言设置和位置,使用这个图来在搜索结果中提供正确的版本。
该注释作为一组<link>元素存在于HTML的<head>中。每个元素都指定了目标页面及其服务的语言(以及可选的地区)。以下是一个针对美式英语、英式英语和墨西哥西班牙语页面,并带有默认回退的正确hreflang标签集:
<link rel="alternate" hreflang="en-US" href="https://example.com/en-us/pricing/" />
<link rel="alternate" hreflang="en-GB" href="https://example.com/en-gb/pricing/" />
<link rel="alternate" hreflang="es-MX" href="https://example.com/es-mx/pricing/" />
<link rel="alternate" hreflang="x-default" href="https://example.com/pricing/" />
该集合中的每个页面都应该输出相同的代码块,列出所有替代版本,包括其自身。最后一点让大多数人感到困惑,我们稍后会再讨论。
这对SEO为何重要
如果没有hreflang,Google会将您的翻译页面视为近似重复内容,竞相争取相同的关键词。结果就是稀释:排名信号分散在不同版本中,而不是集中。通过正确的hreflang,每个版本都继承了整个集合的权威,并出现在正确的搜索者面前。这是多语言网站可以进行的最具杠杆作用的SEO举措之一,它补充而非取代了您.po文件中的实际内容翻译。我们在一篇关于翻译PO文件如何影响Google排名的指南中深入探讨了内容方面。
语言代码与语言-地区代码
您应该使用en还是en-GB?请使用最简单且真实的语言代码。如果您的英文内容是通用的,并且您不维护单独的英式和美式版本,请单独使用en。只有当您确实为不同国家提供不同内容时,才添加地区子标签。
Hreflang值遵循language或language-region的格式。语言部分是ISO 639-1代码(en、es、de、pt)。可选的地区部分是ISO 3166-1 Alpha 2国家代码(US、GB、MX、BR)。因此:
en针对所有说英语的人,无论其国家如何。en-GB针对英国的英语使用者。es针对所有说西班牙语的人。es-MX专门针对墨西哥的西班牙语使用者。
一个关键细节:地区子标签是国家,而不是语言变体。es-MX并非表示“墨西哥西班牙语方言”,它表示“西班牙语,显示给墨西哥的用户”。Google仍然根据用户的位置提供它。如果您在翻译中维护地区方言,地区代码就是您路由它们的方式。我们在关于区域西班牙语和葡萄牙语变体的指南中深入探讨了这一语言学方面的问题。
一个常见的错误示例
这是一个我们经常看到的错误hreflang代码块:
<link rel="alternate" hreflang="en-uk" href="https://example.com/uk/" />
<link rel="alternate" hreflang="sp" href="https://example.com/es/" />
<link rel="alternate" hreflang="pt-PT_BR" href="https://example.com/pt/" />
三个错误。en-uk无效,因为英国的国家代码是GB,而不是UK。sp根本不是语言代码;西班牙语是es。而pt-PT_BR混合了两个地区,并使用下划线,这在hreflang中没有任何意义。搜索引擎会默默地忽略格式错误的值,因此您不会收到错误,也得不到任何好处,只是花费数小时调试,想知道为什么没有任何改变。
请注意,hreflang使用连字符(en-GB),而WordPress语言环境文件使用下划线(en_GB)。不要直接将您的.po文件名代码复制到hreflang标签中。
x-default和返回标签互惠性
两个规则导致的hreflang静默失败比其他任何问题都多:x-default的缺失和互惠性中断。
x-default值告诉Google,当没有其他语言与用户匹配时,应提供哪个页面。它是您的回退选项,通常是您的语言选择器或主要市场的首页。虽然根据规范并非严格强制,但在实践中您应该始终包含它。没有它,一个没有葡萄牙语版本的葡萄牙语访问者将随机获得一个页面,而不是一个预设的默认页面。
返回标签的互惠性是不可商议的。hreflang集合中的每个页面都必须指向所有其他页面,包括它自己。如果您的英文页面将德语列为备用语言,那么您的德语页面也必须将英文列为备用语言。如果德语页面省略了返回引用,Google将不信任整个关系并忽略这些注释。
<!-- On the German page, the set must still list ALL versions -->
<link rel="alternate" hreflang="de" href="https://example.com/de/about/" />
<link rel="alternate" hreflang="en" href="https://example.com/en/about/" />
<link rel="alternate" hreflang="x-default" href="https://example.com/about/" />
自引用(在查看德语页面时,de指向德语页面)是必需的,而非可选。一个包含五个语言版本的集合意味着这五个页面中的每一个都会输出所有五个<link>标签,外加x-default。
在WordPress中实现hreflang的三种方法
您有三种实用的选择,从完全手动控制到完全自动化。
方法1:通过wp_head手动实现
对于一小组静态页面,您可以通过主题的functions.php中的wp_head动作直接注入hreflang标签:
add_action( 'wp_head', function () {
if ( ! is_page( 'pricing' ) ) {
return;
}
$alternates = array(
'en-US' => 'https://example.com/en-us/pricing/',
'es-MX' => 'https://example.com/es-mx/pricing/',
'x-default' => 'https://example.com/pricing/',
);
foreach ( $alternates as $lang => $url ) {
printf(
'<link rel="alternate" hreflang="%s" href="%s" />' . "\n",
esc_attr( $lang ),
esc_url( $url )
);
}
} );
这赋予您精确的控制,但无法扩展。手动维护数百篇文章的互惠性是一个维护陷阱。
方法2:多语言插件
如果您运行Polylang、WPML或TranslatePress,hreflang会根据您的翻译关系自动生成。这对于大多数网站来说是正确的选择,因为插件已经知道哪个文章是哪个的翻译,因此互惠性和x-default都已为您处理。代价是这些插件增加的运行时开销,这是我们在手动与AI翻译方法比较中探讨的权衡。
方法3:带xhtml:link的XML站点地图
您可以不在每个页面的<head>中放置hreflang,而是在XML站点地图中使用xhtml:link命名空间声明这些关系。每个<url>条目都列出了所有其语言备用项:
<url>
<loc>https://example.com/en/about/</loc>
<xhtml:link rel="alternate" hreflang="en" href="https://example.com/en/about/" />
<xhtml:link rel="alternate" hreflang="de" href="https://example.com/de/about/" />
<xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/about/" />
</url>
这使得您的页面HTML保持精简,并将语言映射集中在一个可抓取的文件中,Google会愉快地读取它。大多数SEO插件都可以自动生成此内容。
hreflang是翻译的补充,而非替代
这是所有人都会忽略的一点:如果底层页面没有实际翻译,hreflang就毫无价值。该标签告诉Google“这是德语版本”,但如果德语URL仍然显示英文插件字符串、未翻译的结账标签或半成品.po文件,那么您只是自信地告诉Google向德国用户提供损坏的内容。
真正的多语言SEO分为两层。内容层是您的翻译后的.po、.pot、.json和.xliff文件,它们将所有主题和插件字符串驱动到目标语言。信号层是hreflang,它将每个完成的版本路由到其受众。这两层都必须稳固。在一个仅翻译了40%的网站上部署一个完美的hreflang集合,只会更快地带来更糟糕的用户体验。
这正是保持翻译层清洁最重要的环节。当您翻译界面文件时,像%s、%1$s和{name}这样的占位符必须保持完整,否则您的“翻译”德语页面将呈现字面上的%s标记,这对用户和搜索引擎来说都显得损坏。一个支持gettext并具有Syntax Locking功能的翻译流程会自动保护这些标记,因此您hreflang指向的每个备用页面都是真正可用于生产的。因为它在云端运行并具有Smart Batching功能,您可以将整个多区域网站通过它进行处理,而无需安装会增加这些页面运行时开销的翻译插件。
首先把内容做好,然后让hreflang发挥作用。两者结合起来才能整合排名信号,消除错误的语言结果,并将每个翻译页面呈现给能够阅读它的人。
准备好从源头修复错误的语言搜索结果了吗?免费试用SimplePoTranslate——无需信用卡。在免费套餐中翻译您的
.po、.pot和.json文件,然后将您的hreflang标签指向真正为每个市场准备就绪的页面。