在 WordPress 子目录多站点中自动添加 hreflang 标签
Adding hreflang tags automatically in WordPress subdirectory multisite
我们有一个 WordPress MU 子目录网络设置:
- www.example.com - 主要网站,美国,全球
- www.example.com/uk/ - 为英国访客显示
- www.example.com/au/ - 为澳大利亚游客展示。
我们要为每个网页添加 hreflang 标签,并排除 locations
自定义 post 类型。
从this question开始,我调整了子主题中的代码
functions.php
至:
function add_hreflang_attribute() {
$site_url = network_site_url(); // base URL
$alt_langs = array( '', 'au', 'uk' ); // two-letter language code
$page_path = substr(get_permalink(), strlen(home_url('/'))); // path of page after base URL
if (!( is_singular( 'locations' ) ) ) {
// loop through the alternative languages, and get the appropriate hreflang tag for each that exists
foreach ($alt_langs as $lang) {
$updated_url_lang_path = $site_url . $lang . '/' . $page_path;
$url_headers = @get_headers($updated_url_lang_path);
if($url_headers && strpos( $url_headers[0], '200')) {
if ($lang == 'uk') {
echo '<link rel="alternate" href="' . $updated_url_lang_path . '" hreflang="en-gb" />'. PHP_EOL;
} elseif ($lang == '') {
}
else {
echo '<link rel="alternate" href="' . $updated_url_lang_path . '" hreflang="en-' . $lang . '" />'. PHP_EOL;
}
}
}
// set primary as x-default
echo '<link rel="alternate" href="' . $site_url . $page_path . '" hreflang="x-default" />';
}
}
此代码适用于主网站的主页和示例页面:www.example.com/features/
;
<link rel="alternate" href="https://www.example.com/au/features/" hreflang="en-au" />
<link rel="alternate" href="https://www.example.com/uk/features/" hreflang="en-gb" />
<link rel="alternate" href="https://www.example.com/features/" hreflang="x-default" />
适用于:
- AU 站点的主页,
- AU 站点的功能页面:
https://www.example.com/au/features/
,
但在 www.example.com/uk/
上它只产生:
<link rel="alternate" href="https://www.example.com/au/" hreflang="en-au" />
<link rel="alternate" href="https://www.example.com/" hreflang="x-default" />
缺少:
<link rel="alternate" href="https://www.example.com/uk/" hreflang="en-gb" />
功能页面是一个简单的 WordPress 页面。
感谢帮助。
编辑
如果我添加 if ($lang == 'uk') {print_r(get_headers($updated_url_lang_path));}
,我会看到:
Array
(
[0] => HTTP/1.1 200 OK
[1] => Server: nginx
[2] => Date: Wed, 11 May 2022 22:08:04 GMT
[3] => Content-Type: text/html; charset=UTF-8
[4] => Content-Length: 88422
[5] => Connection: close
[6] => Vary: Accept-Encoding
[7] => Vary: Accept-Encoding
[8] => Accept-CH: Sec-CH-UA-Mobile
[9] => Link: <https://www.example.com/uk/wp-json/>; rel="https://api.w.org/"
[10] => Link: <https://www.example.com/uk/wp-json/wp/v2/pages/10>; rel="alternate"; type="application/json"
[11] => Link: <https://www.example.com/uk/>; rel=shortlink
[12] => X-Powered-By: WP Engine
[13] => X-Cacheable: SHORT
[14] => Vary: Accept-Encoding,Cookie
[15] => Cache-Control: max-age=600, must-revalidate
[16] => X-Cache: HIT: 8
[17] => X-Cache-Group: normal
[18] => Accept-Ranges: bytes
[19] => X-Orig-Cache-Control: no-cache
)
并正确添加以下内容:
<link rel="alternate" href="https://www.example.com/uk/" hreflang="en-gb" />
但是,我只有在登录 WordPress 时才能看到它。
隐身 window,在 https://www.example.com/uk/
我看到(仅):
<link rel="alternate" href="https://www.example.com/" hreflang="x-default" />
我将代码更改为:
function mm_add_hreflang_attribute() {
if (!( is_singular( 'locations' ) ) ) {
$sites = array(
array('', 'x-default'),
array('en-gb/', 'en-gb'),
array('en-au/', 'en-au'),
);
if ( is_post_type_archive('locations') ) {
foreach ( $sites as $site ) {
$site_url = network_site_url();
$page_path = 'locations/';
$geo_url = $site[0];
$hreflang = $site[1];
$url = $site_url . $geo_url . $page_path;
echo '<link rel="alternate" href="' . $url . '" hreflang="' . $hreflang . '" />'. PHP_EOL;
}
} else {
foreach ( $sites as $site ) {
$site_url = network_site_url();
$page_path = substr(get_permalink(), strlen(home_url('/')));
$geo_url = $site[0];
$hreflang = $site[1];
$url = $site_url . $geo_url . $page_path;
echo '<link rel="alternate" href="' . $url . '" hreflang="' . $hreflang . '" />'. PHP_EOL;
}
}
}
}
add_action('wp_head', 'mm_add_hreflang_attribute', 1);
效果很好。
嘿史蒂夫,使用这段代码,它会很好用!!!
function mm_add_hreflang_attribute() {
if (!( is_singular( 'locations' ) ) ) {
$sites = array(
array('', 'x-default'),
array('en-gb/', 'en-gb'),
array('en-au/', 'en-au'),
);
if ( is_post_type_archive('locations') ) {
foreach ( $sites as $site ) {
$site_url = network_site_url();
$page_path = 'locations/';
$geo_url = $site[0];
$hreflang = $site[1];
$url = $site_url . $geo_url . $page_path;
echo '<link rel="alternate" href="' . $url . '" hreflang="' . $hreflang . '" />'. PHP_EOL;
}
}
else
{
foreach ( $sites as $site ) {
$site_url = network_site_url();
$page_path = substr(get_permalink(), strlen(home_url('/')));
$geo_url = $site[0];
$hreflang = $site[1];
$url = $site_url . $geo_url . $page_path;
echo '<link rel="alternate" href="' . $url . '" hreflang="' . $hreflang . '" />'. PHP_EOL;
}
}
}
}
add_action('wp_head', 'mm_add_hreflang_attribute', 1);
我们有一个 WordPress MU 子目录网络设置:
- www.example.com - 主要网站,美国,全球
- www.example.com/uk/ - 为英国访客显示
- www.example.com/au/ - 为澳大利亚游客展示。
我们要为每个网页添加 hreflang 标签,并排除 locations
自定义 post 类型。
从this question开始,我调整了子主题中的代码
functions.php
至:
function add_hreflang_attribute() {
$site_url = network_site_url(); // base URL
$alt_langs = array( '', 'au', 'uk' ); // two-letter language code
$page_path = substr(get_permalink(), strlen(home_url('/'))); // path of page after base URL
if (!( is_singular( 'locations' ) ) ) {
// loop through the alternative languages, and get the appropriate hreflang tag for each that exists
foreach ($alt_langs as $lang) {
$updated_url_lang_path = $site_url . $lang . '/' . $page_path;
$url_headers = @get_headers($updated_url_lang_path);
if($url_headers && strpos( $url_headers[0], '200')) {
if ($lang == 'uk') {
echo '<link rel="alternate" href="' . $updated_url_lang_path . '" hreflang="en-gb" />'. PHP_EOL;
} elseif ($lang == '') {
}
else {
echo '<link rel="alternate" href="' . $updated_url_lang_path . '" hreflang="en-' . $lang . '" />'. PHP_EOL;
}
}
}
// set primary as x-default
echo '<link rel="alternate" href="' . $site_url . $page_path . '" hreflang="x-default" />';
}
}
此代码适用于主网站的主页和示例页面:www.example.com/features/
;
<link rel="alternate" href="https://www.example.com/au/features/" hreflang="en-au" />
<link rel="alternate" href="https://www.example.com/uk/features/" hreflang="en-gb" />
<link rel="alternate" href="https://www.example.com/features/" hreflang="x-default" />
适用于:
- AU 站点的主页,
- AU 站点的功能页面:
https://www.example.com/au/features/
,
但在 www.example.com/uk/
上它只产生:
<link rel="alternate" href="https://www.example.com/au/" hreflang="en-au" />
<link rel="alternate" href="https://www.example.com/" hreflang="x-default" />
缺少:
<link rel="alternate" href="https://www.example.com/uk/" hreflang="en-gb" />
功能页面是一个简单的 WordPress 页面。
感谢帮助。
编辑
如果我添加 if ($lang == 'uk') {print_r(get_headers($updated_url_lang_path));}
,我会看到:
Array
(
[0] => HTTP/1.1 200 OK
[1] => Server: nginx
[2] => Date: Wed, 11 May 2022 22:08:04 GMT
[3] => Content-Type: text/html; charset=UTF-8
[4] => Content-Length: 88422
[5] => Connection: close
[6] => Vary: Accept-Encoding
[7] => Vary: Accept-Encoding
[8] => Accept-CH: Sec-CH-UA-Mobile
[9] => Link: <https://www.example.com/uk/wp-json/>; rel="https://api.w.org/"
[10] => Link: <https://www.example.com/uk/wp-json/wp/v2/pages/10>; rel="alternate"; type="application/json"
[11] => Link: <https://www.example.com/uk/>; rel=shortlink
[12] => X-Powered-By: WP Engine
[13] => X-Cacheable: SHORT
[14] => Vary: Accept-Encoding,Cookie
[15] => Cache-Control: max-age=600, must-revalidate
[16] => X-Cache: HIT: 8
[17] => X-Cache-Group: normal
[18] => Accept-Ranges: bytes
[19] => X-Orig-Cache-Control: no-cache
)
并正确添加以下内容:
<link rel="alternate" href="https://www.example.com/uk/" hreflang="en-gb" />
但是,我只有在登录 WordPress 时才能看到它。
隐身 window,在 https://www.example.com/uk/
我看到(仅):
<link rel="alternate" href="https://www.example.com/" hreflang="x-default" />
我将代码更改为:
function mm_add_hreflang_attribute() {
if (!( is_singular( 'locations' ) ) ) {
$sites = array(
array('', 'x-default'),
array('en-gb/', 'en-gb'),
array('en-au/', 'en-au'),
);
if ( is_post_type_archive('locations') ) {
foreach ( $sites as $site ) {
$site_url = network_site_url();
$page_path = 'locations/';
$geo_url = $site[0];
$hreflang = $site[1];
$url = $site_url . $geo_url . $page_path;
echo '<link rel="alternate" href="' . $url . '" hreflang="' . $hreflang . '" />'. PHP_EOL;
}
} else {
foreach ( $sites as $site ) {
$site_url = network_site_url();
$page_path = substr(get_permalink(), strlen(home_url('/')));
$geo_url = $site[0];
$hreflang = $site[1];
$url = $site_url . $geo_url . $page_path;
echo '<link rel="alternate" href="' . $url . '" hreflang="' . $hreflang . '" />'. PHP_EOL;
}
}
}
}
add_action('wp_head', 'mm_add_hreflang_attribute', 1);
效果很好。
嘿史蒂夫,使用这段代码,它会很好用!!!
function mm_add_hreflang_attribute() {
if (!( is_singular( 'locations' ) ) ) {
$sites = array(
array('', 'x-default'),
array('en-gb/', 'en-gb'),
array('en-au/', 'en-au'),
);
if ( is_post_type_archive('locations') ) {
foreach ( $sites as $site ) {
$site_url = network_site_url();
$page_path = 'locations/';
$geo_url = $site[0];
$hreflang = $site[1];
$url = $site_url . $geo_url . $page_path;
echo '<link rel="alternate" href="' . $url . '" hreflang="' . $hreflang . '" />'. PHP_EOL;
}
}
else
{
foreach ( $sites as $site ) {
$site_url = network_site_url();
$page_path = substr(get_permalink(), strlen(home_url('/')));
$geo_url = $site[0];
$hreflang = $site[1];
$url = $site_url . $geo_url . $page_path;
echo '<link rel="alternate" href="' . $url . '" hreflang="' . $hreflang . '" />'. PHP_EOL;
}
}
}
}
add_action('wp_head', 'mm_add_hreflang_attribute', 1);