Жесть вообще с этим канониКАЛом. Некоторое время назад прописал метатег похожим методом, как предложил
kysin
, только у меня каноникал можно прописать с помощью пользовательского поля в параметрах материала. Если прописан - берется он. Если не прописан - формируется урл:
$document = JFactory::getDocument();
if(!empty($this->item->jcfields[36]->value)):
$canoniclink = $this->item->jcfields[36]->value;
else:
$canoniclink = Uri::getInstance()->toString(['scheme', 'host', 'path']);
endif;
$document->addHeadLink(htmlspecialchars($canoniclink), 'canonical');
Всё вроде нормально было, пару раз проверил на разных страницах, метатег есть и прописан вроде нормально.
Сегодня случайно обнаружил, что в качестве каноникла подставляется размеченная ссылка, типа
сайт.ру?ютм_что_нибудь&иещечтото. Но быть такого не может, т.к. мой скрипт добавляет каноникал чистый, без тегов.
Начал ковыряться в исходнике, оказалось, что у меня на страницах 2 каноникла (между ними много всяких метатегов, поэтому не увидел, что есть второй метатег). Никакое гугленье не помогло, в итоге нотпадом++ запустил поиск "canonical" по всем файлам. Нашел.
Оказывается встроенный плагин SEF добавляет каноникал, если в настройках плагина прописан URL!
Пока не знаю, в какой момент это началось. Раз я писал скрипт с канониклом, значит этого метатега не было на сайте. Может быть в очередном обновлении что-то поменяли, хотя в патчноуте я такого не помню.
В любом случае, canonical, который формируется плагином, содержит текущий URL. Если кроме домена там что-то есть (например utm метки) - то оно и в тег попадет... В общем URL из плагина убрал (сам плагин включен), теперь подставляются только мои чистые канониклы. Проблема обнаружена на J4.4, на других версиях не проверял