Исправление бага для тега rel=canonical в Joomla 3 для многоязычного сайта

При разработке веб-сайта на cms Joomla версии 3.2.1 мы создали сайт на 2 языках — русском и украинском. И обнаружилась проблема, когда на главной странице генерируется неправильный тег link rel=»canonical».

Для сайта по умолчанию принята языковая версия русскоязычная и выбрана опция «Удалять префикс языка по умолчанию», которая… та-да!!! — удаляет из URL префикс для основного языка.

joomla-canonical-problem1

К примеру, мы имели бы для внутренней страницы следующие адреса на 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-&gt;addHeadLink(htmlspecialchars($link), 'canonical');

и заменяем ее на

$doc-&gt;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, и расскажите свое видение решения таких проблем для многоязычных сайтов ниже в комментариях!