我们有一个 WordPress MU 子目录网络设置:
我们希望为每个网页添加 hreflang 标签,并排除 locations 自定义帖子类型。
从这个问题中,我调整了子主题中的代码
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" />
它适用于:
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 时才能看到此内容。
在隐身窗口中,在 https://www.example.com/uk/ 我看到(仅):
<link rel="alternate" href="https://www.example.com/" hreflang="x-default" />
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
嘿史蒂夫,使用这个代码,它会很好用!!!
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 ''. 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 ''. 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 ''. 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 ''. PHP_EOL; } } } } add_action('wp_head', 'mm_add_hreflang_attribute', 1);效果很好。