Решение проблемы с неверными каноническими URL в WordPress когда структура сайта имеет расширение файлов постов.
Злополучный плагин AIOSEO, в девичестве All In SEO Pack крайне не корректно работает с каноническими URL.
Дело в том, что для поисковика URL вида http://site.com/foo и http://site.com/foo/ разные URL, а AIOSEO в качестве канонического URL ставит URL без слеша.
Наличие слеша в конце URL важно для SEO. Слеш в конце имени категории указывает поисковику, что это не какой-то отдельный файл, а раздел сайта. Следовательно поисковик понимает, что сайт имеет четкую структуру.
Причем ставится слеш в конце URL или нет зависит от темы, которая установлена. У меня на некоторых проектах слеши в конце отображаются вполне корректно и вмешательство в работу плагина AIOSEO не требуется.
AIOSEO со своими неверными каноническими URL для категорий портит нам всю картину.
Задача по корректированию каннонических URL для категорий делиться на 2 этапа:
- Удаляем код, который нам сделал AIOSEO
- Пишем свой код для вывода канонических URL
Удаляем код AIOSEO
Для этого используем все те же фильтры. Открываем файл functions.php и после всех директив вставляем следующий код:
//отключаем каннонический урл категорий
add_filter( 'aioseo_canonical_url', 'aioseo_filter_canonical_url' );
function aioseo_filter_canonical_url( $url ) {
if ( is_category() || is_tag() ) {
return '';
}
return $url;
}
В этом примере мы отключили вывод link rel="canonical" для категорий и тегов.
Если необходимо удали канонические URL с отдельных страниц вместо is_tag() пишем там is_page().
Пишем свой код для вывода канонических URL
В принципе есть несколько вариантов решения этой задачи.
- С помощью плагина. Например такого. Я его не проверял, гарантий не даю.
- С помощью штатных средств WordPress и функции wp_get_canonical_url(). Опять же не факт, что wp_get_canonical_url() выведет канонический URL со слешем в конце.
- С помощью дополнительных полей.
- С помощью глобальных переменных.
Вывод с помощью дополнительных полей
Странно, но этот способ мне не подошел, хотя я неплохо знаю как работать с дополнительными полями. Плагин ACF категорически не желал получать значение касдомного поля в header.php. Не знаю почему.
То есть получать то он его получал, но только в том случае если категория была пустая, без постов в ней.
Попробовал постучаться в сапорт ACF, но видимо, сапорт поглощен более интересными делами.
Вывод канонических URL с помощью глобальных переменных
Собственно нам никто не мешает получить полный URL к файлу с помощью глобальных переменных.
Для этого открываем в редакторе файл header.php и где-нибудь перед закрываюзщим тегом </head> пишем такую конструкцию:
<!-- канонический URL категории/ -->
<?php if (is_category() !=is_paged()){
echo '<link rel="canonical" href="https://' .$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'] .'"/>',PHP_EOL;
}
?>
<!-- /канонический URL категории -->
Оператор !=is_paged() нужен для того, чтобы канонические URL не выводились на стнаницах пагинации. Впрочем, если у вас страницы пагинации не закрыты от индексации этот оператор можно исключить. Тогда link rel='canonical' будет выводиться на всех страницах категорий, в том числе и станицах с пагинацией.
Не могу не упомянуть вот эту статью про канонические URL и AIOSEO. Там автор предлагает свою функцию вывода канонических URL взамен функционалу AIOSEO.
Статья довольно старая и у меня код, предлагаемый автором не заработал.
Возможно если код, предлагаемый автором, радикально допилить мы получим что-то более-менее работоспособное.
Да, и все манипуляции лучше проводить в дочерней теме WordPress, если мы не хотим, чтобы все исчезло после обновления темы.
Об авторе