При разработке веб-сайта на cms Joomla версии 3.2.1 мы создали сайт на 2 языках — русском и украинском. И обнаружилась проблема, когда на главной странице генерируется неправильный тег link rel=»canonical».
Для сайта по умолчанию принята языковая версия русскоязычная и выбрана опция «Удалять префикс языка по умолчанию», которая… та-да!!! — удаляет из URL префикс для основного языка.
К примеру, мы имели бы для внутренней страницы следующие адреса на 2 языках:
http://site.com/ru/page1.html — русскоязычная верисия
http://site.com/ua/page1.html — украиноязычная версия
Так вот, удаление префикса языка по умолчанию как-раз и удаляет этот префикс /ru/.
Но вопреки ожиданиям, для главной страницы (как и остальных страниц сайта этого языка) генерируется некорректный тег <link rel=»canonical» … />
в адрес добавляется префикс языковой версии (причем, при просмотре кода в браузере Chrome, Firefox данный баг не был замечен, не понятно по какой причине, но, видимо, браузер как-то по своему это обработал и скрыл эту ошибку. А вот сканер контента html, или просмотр страницы «Как Googlebot» позволили выявить этот баг).
Решение проблемы: в файле site.com/plugins/system/sef/sef.php находим строку 53, она выглядит:
$doc->addHeadLink(htmlspecialchars($link), 'canonical');
и заменяем ее на
$doc->addHeadLink(htmlspecialchars(str_replace('ru/','',$link)), 'canonical');
Если заменить нужно только для главной, вы должны определить главную и написать условие — если главная, то убираем из тега часть «ru», если не главная, то выводим как есть. Код для этого примерно таков:
if ($app->getMenu()->getActive()->home) { $homepage=true; } // удаляем ru из тега canonical на главной - на остальных он остается if ($homepage == 1) { if ($uri !== $link) { $doc->addHeadLink(htmlspecialchars(str_replace('ru/','',$link)), 'canonical'); } } else { if ($uri !== $link) { $doc->addHeadLink(htmlspecialchars($link), 'canonical'); } }
Этой частью вы замените обычный вывод тега canonical:
if ($uri !== $link) { $doc->addHeadLink(htmlspecialchars($link), 'canonical'); }
(или вместо ru/ подставьте свой префикс языка по умолчанию). Все, теперь тег canonical безошибочно указывает для главной страницы на нее-же! Удачного создания сайтов с Joomla, и расскажите свое видение решения таких проблем для многоязычных сайтов ниже в комментариях!