Zen Cart 1.55a
in templates/YOUR_TEMPLATE/common/html_header.php
we have
<?php
// BOF hreflang for multilingual sites
if (!isset($lng) || (isset($lng) && !is_object($lng))) {
$lng = new language;
}
reset($lng->catalog_languages);
while (list($key, $value) = each($lng->catalog_languages)) {
if ($value['id'] == $_SESSION['languages_id']) continue;
echo '<link rel="alternate" href="' . ($this_is_home_page ? zen_href_link(FILENAME_DEFAULT, 'language=' . $key, $request_type) : $canonicalLink . '&language=' . $key) . '" hreflang="' . $key . '" />' . "\n";
}
// EOF hreflang for multilingual sites
?>
This produces a hreflang for each of the OTHER languages, but not that of this actual page.
ie if you offer english and spanish on your site, the english page generates:
<link rel="alternate" href="https://www.YOURSITE.com/somepage?language=es" hreflang="es">
From what I read here,
Concise
https://www.semrush.com/blog/7-common-hreflang-mistakes-and-how-to-fix-them/
Detailed
https://moz.com/blog/using-the-correct-hreflang-tag-a-new-generator-tool
this is incomplete. There should also be a link to the self-same page:
<link rel="alternate" href="https://www.YOURSITE.com/somepage?language=es" hreflang="es">
<link rel="alternate" href="https://www.YOURSITE.com/somepage?language=en" hreflang="en">
I looked into this after receiving warning emails from Google Search Console,and this was the reason.
So, this link requires commenting out:
<?php
// BOF hreflang for multilingual sites
if (!isset($lng) || (isset($lng) && !is_object($lng))) {
$lng = new language;
}
reset($lng->catalog_languages);
while (list($key, $value) = each($lng->catalog_languages)) {
//if ($value['id'] == $_SESSION['languages_id']) continue;
echo '<link rel="alternate" href="' . ($this_is_home_page ? zen_href_link(FILENAME_DEFAULT, 'language=' . $key, $request_type) : $canonicalLink . '&language=' . $key) . '" hreflang="' . $key . '" />' . "\n";
}
// EOF hreflang for multilingual sites
?>