» » » Атрибут rel="canonical". Как вывести ссылки на канонические страницы
logotip

Атрибут rel="canonical". Как вывести ссылки на канонические страницы

Всем привет! Сегодня на seo-mayak.com мы будем разбирать атрибут rel="canonical". Рассмотрим его, так сказать, под разными углами, проведем некоторые сравнения и конечно немного поработаем с PHP.

За прошедших пару месяцев, я получил уйму писем с различными просьбами и предложениями. Если кому-то не ответил, прошу не судить строго. На всех меня все равно не хватит!

Подбирая тему для будущей статьи, я полистал почту и понял, что веб-мастеров стал сильно волновать тег canonical. Правильно его будет называть атрибутом, поэтому слово «тег», применительно к rel="canonical", я больше использовать не стану.

Так вот, после статьи Александра Борисова, в которой он описал проблему с canonical в плагине All in One SEO Pack, все ринулись искать какую-то информацию, касательно данного атрибута, а ее на самом деле не так много.

Есть конечно мануал Google или справка Яндекса, где довольно кратко описывается взаимодействие атрибута с поисковыми алгоритмами. Объясняется как роботы понимают rel="canonical" и как правильно его применять.

Почитав некоторые статьи по теме, я понял, что конкретных инструкций по самостоятельному внедрению rel="canonical" на страницы сайта, просто нет и веб-мастера почти поголовно используют плагины, которые всегда преподносят какие-то сюрпризы.

Вот и прыгает народ с плагина на плагин, так реально и не разобравшись в принципах работы rel="canonical". А принцип простой. Исходная страница должна оставить свой след на всех предполагаемых копиях, чтобы у поискового робота не было ни малейшего повода индексировать дубль страницы.

atribut rel canonical

В общем атрибут очень важный и не мешало бы знать, как им управлять. В конце статьи я приведу функцию, которая возьмет на себя должность администратора rel="canonical".

Но давайте обо всем по-порядку. Поехали!

Для чего нужен rel="canonical"

Наверное все знают, что такое дубли страниц и какой ущерб они могут нанести репутации сайта в глазах поискового робота.

Именно для борьбы с дублями страниц и был разработан атрибут rel="canonical". Им помечают ссылки, ведущие на исходные (канонические) страницы. Помеченная ссылка выводиться в область шапки сайта, между тегами <head></head>.

Робот, зайдя на определенный URL и наткнувшись на ссылку с canonical, сразу поймет является ли данная страница канонической или это просто дубль, который индексировать не надо. Рассмотрим такой пример.

Допустим какой-нибудь блогер решит поделится ссылкой на одну из моих статей, но URL в ссылке пропишет неправильно:

seo-mayak.com/seo-prodvizhenie/tonkosti-prodvizheniya/skvoznye-ssylki.html?abc

Робот проиндексирует данную ссылку, обязательно проследует по указанному URL и попадет на страницу, в исходном коде которой он наткнется на ссылку, помеченную rel="canonical":

rel canonical1

Тем самым rel="canonical" защитил мой блог от полного дубля страницы. Надеюсь новичкам теперь понятно зачем нужен данный атрибут. Идем дальше.

Проблема с rel="canonical" в плагине All in One SEO Pack

После статьи Борисова многие веб-мастера стали отказываться от плагина All in One SEO Pack в пользу Platinum Seo Pack. Лично я считаю All in One SEO Pack хорошим, функциональным плагином и отказываться от него из-за проблемы с rel="canonical" я бы не стал.

Platinum Seo Pack обновляется очень редко и не известно, что будет дальше. Разумно было бы вообще не возлагать на плагины функции настройки индексации сайта, а передать такие полномочия шаблону WordPress, а именно файлу functions.php, но об этом чуть позже.

Как известно, при желании можно решить любую задачу. Проблема плагина All in One SEO Pack заключается следующих неправильных URL:

seo-mayak.com/seo-prodvizhenie/tonkosti-prodvizheniya/skvoznye-ssylki.html/1234

Это ничто иное, как ссылка на несуществующую страницу №1234, статьи «Сквозные ссылки». А если пройти по указанному URL и заглянуть в исходный код страницы, то в зоне All in One SEO Pack, атрибутом rel="canonical" будет помечена такая ссылка:

rel canonical2

Как видите, ссылка не является канонической и ведет на тот же неправильный URL. Если робот найдет такие неправильные ссылки на других ресурсах мирового интернета, то угроза полного дубля страницы станет действительно реальна. Мало того, плагин выводит ссылку на следующую или предыдущую страницу, в таком же, неподобающем виде:

rel canonical3.3

Такие ссылки помечаются атрибутами:

rel="prev" — предыдущая страница
rel="next" — следующая страница

С данными ссылками мы тоже чуть позже разберемся.

Ну а пока займемся поиском решения проблемы с атрибутом rel="canonical" в плагине All in One SEO Pack. Как всегда на выбор есть несколько вариантов:

Способ №1. Отказаться от использования All in One SEO Pack в пользу другого SEO плагина (не рекомендуется).

Способ №2. Снять галочку в пункте «Канонические URL’ы:» и положится на функционал WordPress (не рекомендуется).

Способ №3. Исправить ошибку в плагине All in One SEO Pack (рекомендуется)

Способ №4. Снять галочку в пункте «Канонические URL’ы:» и расширить функционал WordPress (настоятельно рекомендуется).

Первый способ по вышеописыннам причинам я рассматривать не буду и начну сразу со второго.

Функция rel_canonical()

Итак, почему я не рекомендую полагаться на функционал WordPress? На самом деле все просто. В CMS WordPress за вывод ссылки на каноническую страницу отвечает функция rel_canonical(), которую можно найти по адресу wp-includes/link-template.php. Вот она:

function rel_canonical() {
	if ( !is_singular() )
		return;
	global $wp_the_query;
	if ( !$id = $wp_the_query->get_queried_object_id() )
		return;
	$link = get_permalink( $id );
	if ( $page = get_query_var('cpage') )
		$link = get_comments_pagenum_link( $page );
	echo "<link rel='canonical' href='$link' />\n";
} 

Работает данная функция без нареканий, но есть одно НО!

Дело в том, что функция rel_canonical() срабатывает только при активации другой функции is_singular(), которая объединяет в себе еще три функции:

is_single() — проверяет является ли открываемая страница страницей с записью (single).
is_page() — проверяет является ли открываемая страница статической страницей (page).
is_attachment() — проверяет является ли открываемая страница страницей вложения (attachment).

О чем это говорит? Это говорит от том, что при вызове: главной страницы, страниц с категориями, архивов, страниц меток, авторов, а также любых страниц пагинации функция rel_canonical() срабатывать не будет.

Чем это грозит? А грозит это все теме же дублями. Например, кто-то, на каком-нибудь ресурсе, оставит такую ссылку:

seo-mayak.com/?abc

Робот ее проиндексирует, осуществит переход на мой блог, а в исходном коде нет ссылки на каноническую страницу и следовательно роботу ничего не останется, как проиндексировать дубль главной страницы, а потом «нагнуть» мои статьи в поисковой выдаче. Такие дела!

Функция хорошая и забегая вперед скажу, что она нам еще пригодится, но полагаться только на rel_canonical() не стоит.

Ошибка в плагине All in One SEO Pack

Вообще удивляет, почему до меня еще никто не озадачился исправлением ошибки в плагине All in One SEO Pack, ведь для разработчиков плагина это дело плевое. Мне же пришлось потратить не мало времени, чтобы разобраться в функциях и найти решение. А решение оказалось очень простыми и Вы в этом сейчас сами убедитесь.

В текстовом редакторе Notepad++ открываем файл aioseop_class.php, что находится по адресу wp-content/plugins/all-in-one-seo-pack/aioseop_class.php и ищем такую строку:

$link = get_permalink( $post->ID );

На момент версии All in One SEO Pack 2.2.4, строка №2269. Меняем функцию get_permalink() на уже знакомую нам функцию rel_canonical(). Должно получиться так:

$link = rel_canonical();

И все! Теперь ссылка на каноническую страницу будет выводится правильно. Можете провести свою тщательную проверку и отписаться в комментариях.

А вам интересно, почему разработчики плагина так просчитались с функцией get_permalink()? Вот тут в чем дело. Изначально, программисты лепившие плагин не учли, что запись в WordPress может быть разделена на n-количество страниц. А дальше начинается самое интересное.

Если функция get_permalink() принимает параметр $post->ID, то возвращает ссылку на текущий пост в цикле, находя его по ID.

Так вот друзья программисты, если запись разделена на несколько страниц и если ID записи запрашивается через свойство объекта $post->ID (объект->свойство объекта), то будет получен URL текущей страницы в цикле.

Допустим, что в цикле на данный момент находится страница №2033, моей статьи «Микроразметка Schema.org», которая имеет такой URL:

seo-mayak.com/seo-prodvizhenie/poiskovye-sistemy/makrorazmetka-schema-org.html/2033

Несчастная функция get_permalink() просто не знает, что ей делать. Ведь она не получала никаких директив, которые бы указывали ей на то, что надо возвращать ссылку на первую страницу записи. Вот она и возвращает ссылку на несуществующую страницу, которая была запрошена на текущий момент.

А вот функция rel_canonical() прекрасно знает, как ей поступать в такой ситуации, потому что она получает ID записи с помощью функции get_queried_object_id(), которая в свою очередь получает ID записи вне цикла WordPress, через глобальную переменную $wp_the_query. Такие дела!.

В будущем я обязательно более подробно остановлюсь на теме разбиения постов на страницы, так что подписываетесь на обновления блога, будет интересно.

Настал черед разобраться с ссылками на следующую и предыдущую страницы, помеченные атрибутами prev и next.

Ссылки с атрибутами prev и next

Вопрос в том нужны ли вообще такие ссылки? Какую смысловую нагрузку они несут с точки зрения SEO? А смысл такой. Опять же, если запись разделена на несколько страниц, то использование ссылок с атрибутами prev и next вполне оправдано, так как они помогают поисковому роботу связывать страницы записи в одно целое.

Но зачем связывать страницы пагинации, например у категорий или у архивов, ведь в 90% случаев постраничная навигация закрывается от индексации. Поэтому, если Вы не пишите длинных постов, которые надо делить на страницы, то можете смело удалять ссылки на следующую и предыдущую страницы.

И вот как это делается. Открываем файл functions.php, что находиться в шаблоне и после тега <?php вставляем такую функцию:

function mayak_remove_prev_link( $data ) {
return false;
}
add_filter( 'aioseop_prev_link', 'mayak_remove_prev_link' );
add_filter( 'aioseop_next_link', 'mayak_remove_prev_link' );

Тоже самое можно сделать другим способом. О «убийце хуков» remove_action() я Вас уже писал в статье, посвященной функции wp_head(), советую почитать. Идем дальше.

Одновременное использование rel="canonical" и мета-тега robots

Еще хочу сказать несколько слов о целесообразности одновременного использования атрибута canonical и мета-тега robots.

Рассмотрим такой пример. Робот, читая исходный код, находит ссылку с атрибутом canonical. Робот понял, что эта страница является канонической, т.е, ссылка ведет на тот же URL.

Но чуть ниже он натыкается на мета тег robots, с запрещающими директивами:

<meta name="robots" content="noindex, nofollow">

Как поступит робот в такой ситуации?

Здесь важно понимать, что атрибут rel="canonical" носит скорее рекомендательный характер и безусловно уступает в авторитете мета-тегу robots. Если робот встретит в мета-тег robots с вышеописанными директивами, то он даже не станет индексировать ссылку с атрибутом canonical, впрочем как и все остальные элементы на странице и следовательно переходы по ссылкам робот также не будет осуществлять.

Вывод: Использовать canonical на одной странице вместе с мета-тегом robots не целесообразно. Хотя от присутствия ссылки с canonical хуже тоже не будет. Атрибут может служить в виде страховочного варианта, на случай, если по какой-либо причине мета-тег robots не будет выведен.

Как правильно вывести ссылки на канонические страницы WordPress

Итак, нам предстоит дополнить функционал WordPress и заставить его выводить ссылку с rel="canonical" на всех страницах сайта.

Я немного поработал над функцией, которая возьмет на себя роль администратора canonical и будет выводить ссылки на канонические страницы в подобающем виде и там, где они и должны быть.

Внимание! Прежде, чем активировать функцию, обязательно снимите галочку в плагине All in One SEO Pack, в пункте «Канонические URL’ы:»

Открываем файл functions.php, что находиться в папке с темой и в самое начало, после знака <?php, вставляем такую функцию:

/*** Функция вывода rel="canonical" ***/ 
remove_action('wp_head', 'rel_canonical');
function mayak_wp_canonical(){
if ( !is_singular() )
		return;
	global $wp_the_query;
	if ( !$id = $wp_the_query->get_queried_object_id() )
		return;
	$link = get_permalink( $id );
	if ( $page = get_query_var('cpage') )
		$link = get_comments_pagenum_link( $page );
	echo "<link rel='canonical' href='$link' />\n";
}
add_action('wp_head', 'mayak_wp_canonical',3);
function mayak_canonical(){
		if (is_home() ) {
			$mayak_chief_link = get_option('home');
			$mayak_home_link = mayak_link_paged($mayak_chief_link);
			$mayak_home_link = trailingslashit($mayak_home_link);
			{
		echo "".'<link rel="canonical" href="'.$mayak_home_link.'" />'."\n"; 
	}
} else if (is_category()) {
			$mayak_cat_link = get_category_link(get_query_var('cat'));
			$mayak_category_link = mayak_link_paged($mayak_cat_link);
			{
		echo "".'<link rel="canonical" href="'.$mayak_category_link.'" />'."\n"; 
	}
} else if (function_exists('is_tag') && is_tag()){
			$tag = get_term_by('slug',get_query_var('tag'),'post_tag');
		if (!empty($tag->term_id)) {
	        $tag_link = get_tag_link($tag->term_id);
	        } 
			$mayak_tag_link = mayak_link_paged($tag_link);
			$mayak_tag_link = trailingslashit($mayak_tag_link);
		   {
		echo "".'<link rel="canonical" href="'.$mayak_tag_link.'" />'."\n"; 
	}
} else if (is_author()){
			global $cache_userdata;
	        $userid = get_query_var('author');
	        $mayak_auth_link = get_author_link(false, $userid, $cache_userdata[$userid]->user_nicename);
			$mayak_author_link = mayak_link_paged($mayak_auth_link);
        {
		echo "".'<link rel="canonical" href="'.$mayak_author_link.'" />'."\n"; 
	}
} 
else if (is_date()){
if (get_query_var('m')) {
		        $m = preg_replace('/[^0-9]/', '', get_query_var('m'));
		        switch (strlen($m)) {
		            case 0: 
		                $mayak_date_link = get_year_link($m);
						$mayak_date_link = mayak_link_paged($mayak_date_link);
		                break;
		            case 1: 
		                $mayak_date_link = get_month_link(substr($m, 0, 4), substr($m, 4, 2));
						$mayak_date_link = mayak_link_paged($mayak_date_link);
		                break;
		            case 2: 
		                $mayak_date_link = get_day_link(substr($m, 0, 4), substr($m, 4, 2),
		                                     substr($m, 6, 2));
						$mayak_date_link = mayak_link_paged($mayak_date_link);					 
		                break;
		            default:
		                $mayak_date_link = '';
		        }
				}
				if (is_day()) {
		        $mayak_date_link = get_day_link(get_query_var('year'),	get_query_var('monthnum'), get_query_var('day'));
				$mayak_date_link = mayak_link_paged($mayak_date_link);					 
		    } else if (is_month()) {
		        $mayak_date_link = get_month_link(get_query_var('year'), get_query_var('monthnum'));
				$mayak_date_link = mayak_link_paged($mayak_date_link);					   
		    } else if (is_year()) {
		        $mayak_date_link = get_year_link(get_query_var('year'));
				$mayak_date_link = mayak_link_paged($mayak_date_link);
		    }
		{
		echo "".'<link rel="canonical" href="'.$mayak_date_link.'" />'."\n"; 
		}
	}
}
function mayak_link_paged($link) {
			$mayak_page = get_query_var('paged');
			$mayak_check = function_exists('user_trailingslashit');
	    if ($mayak_page && $mayak_page > 1) {
	        $link = trailingslashit($link) ."page/". "$mayak_page";
	        if ($mayak_check) {
	            $link = user_trailingslashit($link, 'paged');
	        } else {
	            $link .= '/';
	        }
		}
			return $link;
	}
add_action('wp_head', 'mayak_canonical');

/*** Конец функции вывода rel="canonical" ***/

Теперь никакие плагины не смогут повлиять на корректность вывода атрибута. Можете провести свои тесты, на предмет наличия rel="canonical" на тестируемых страницах и отписаться в комментариях.

До встречи!

С уважением, Виталий Кириллов

(предыдущая статья)
(следующая статья)

Комментарии: 188

  1. Денис Тумилович:

    Я решил отказаться от all in one seo pack )))

    Ответить
  2. Андрей:

    я мало чего понял, но понял что это нужно и круто, поэтому последую за маяком 🙂 Единственно только вопрос такой, у меня кроме all in one seo pack на блоге стоит еще и плагин WordPress SEO by Yoast, оба активны. Не помешают нововведения работе блога?

    Ответить
    • Виталий Кириллов:

      Андрей, одного плагина all in one seo pack вполне достаточно, просто снимите галочку в пункте «Канонические URL» и вставьте мою функцию в файл functions.php, что находится в папке с темой.

      Ответить
      • Андрей:

        я знаю, что его хватает, но во втором есть такие фишки удобные, которые помогают еще до опубликования статьи проверить релевантность запросу. Не буду его удалять, попробую с двумя. Если что коряво пойдет отпишусь 🙂

        Ответить
        • Федор:

          Зачем так грузить свой блог.
          Для интереса измерьте нагрузку плагинами.
          Если Сео все в одном процентов 30 забирает то SEO by Yoas все 60.
          Когда посещаемость до сотни то не страшно а когда под штучку каждый плагин нужно тестировать и проверять.
          Виталий спасибо за функцию.
          Сейчас работаю над статьей по подобной теме, обязательно упомяну вас.

          Ответить
          • Виталий Кириллов:

            Пожалуйста Федор! Рад Вас видеть на блоге!

            Ответить
  3. Сергей:

    Интересно, а как будет с постраничной навигацией комментариев. Некоторые этот тег canonical просто вырезают. А другие просто оставляют так, как в AIOSP. Все же хотелось бы чтобы одновременно не было дублей на другие страницы и одновременно, чтобы страницы типа comment-page2 имели свой тег на эту же страницу, а не на основную страницу с постом. В общем, тут с комментариями немного сложнее, поэтому приходиться выбирать что-то одно.

    Ответить
    • Виталий Кириллов:

      По логике вещей, во избежании возникновения дублей, в исходном коде страниц типа comment-page2, canonical должна быть помечена ссылка, ведущая на основную страницу с постом.

      Ответить
      • Сергей:

        Тогда страница в индекс может не попасть.(((
        Может в дальнейшем разработчики wordpress исправят этот баг с неправильной прописью ссылок на несуществующие страницы.

        Ответить
  4. Евгений:

    Виталий, после вставки функции в файл functions.php, сайт перестал работать. Все сделал как положено, сохранил изменения в файле, перехожу на сайт высвечивается урл в адресной строке и чистый лист. Убрал функцию, сохранил изменения, никакой реакции. Открывается только этот файл. что делать?

    Ответить
    • Виталий Кириллов:

      Евгений, я не могу сказать точно, где ошибка, но на белой странице обычно указывается путь до файла и номер строки, где обнаружена фатальная ошибка. В любом случаи, если Вы не очень в php, то перед редактирование файла надо делать его резервную копию. Если не исправите, можно будет сделать откат файлов на сервере.

      Ответить
  5. Евгений:

    Виталий сайт восстановил – вчера на хостинге делал бекап, сейчас все работает.

    Ответить
  6. Евгений:

    Виталий, может быть я неправильно внес функцию в файл? Я скопировал ее с вашего сайта в блокнот, а оттуда уже вставил через редактор в тему. правильно ли я поступил?

    Ответить
    • Виталий Кириллов:

      Евгений, скорее всего вы не так вставили функцию. Для редактирования файлов советую пользоваться ftp клиентом Notapad++.

      Ответить
  7. Андрей:

    Виталий, Ваша статья меня сподвигла проделать анализ моего блога на пердмет внутренних косяков и вот что я обнаружил с помощью проги netspeak spider. страницы lider-ponevole.ru/page/(2; 3; 4; 5; 6; 7) цифры в скобках это окончание урла страниц. То есть шесть непонятных страниц, скажите, это и есть дубли от которых надо избавляться?

    Ответить
    • Виталий Кириллов:

      Андрей, это URL постраничной навигации сайта. Просто добавьте мета-тег robots на страницы пагинации.

      Ответить
  8. Андрей:

    Виталий, что такое страницы пагинации?

    Ответить
    • Виталий Кириллов:

      Пагинация (от лат. pagina — страница) — разбиение информации на страницы.

      Ответить
  9. Андрей:

    Виталий, я сделал полностью как написано у вас в статье мета-тег robots, т.е прописал в файле functions.php функцию
    function mayak_meta_robots () {
    if (is_archive() or is_category() or is_feed () or is_author() or is_date() or is_day() or is_month() or is_year() or is_tag() or is_tax() or is_attachment() or is_paged() or is_search())
    {
    echo «».».»\n»;
    }
    }
    add_action(‘wp_head’, ‘mayak_meta_robots’);

    в файле robot.txt написал так же как у вас
    User-agent: *
    Allow: /wp-content/uploads
    Disallow: /wp-
    Host:
    Sitemap: http://
    Результат озвученная мной проблема исчезла, за что вам огромный респект и уважуха :)Единственное что смущает, раньше у меня в индексе было больше 100 страниц, а теперь осталось 67 🙂 это нормально, мы этого добивались? 🙂

    Ответить
    • Виталий Кириллов:

      Андрей, а сколько у Вас всего опубликованных записей и страниц?

      Ответить
      • Андрей:

        В админке написано 63 записи, 3 страницы и 7 рубрик

        Ответить
        • Виталий Кириллов:

          В идеале у Вас должно быть проиндексировано 74 страницы, но такой чистоты добиться сложно, поэтому с индексацией у Вас все в порядке.

          Ответить
  10. Андрей:

    Виталий, в моём плагине all in one seo pack не оказалось файла aioseop_class.php вместо него стоит файл aioseop.class.php (разница в нижнем подчёркивании) и в этом файле отсутствует строка $link = get_permalink( $post->ID ); вы с таким сталкивались? Может подскажете как мне сделать как у вас?

    Ответить
    • Виталий Кириллов:

      Андрей, у вас какая версия плагина установлена?

      Ответить
      • Андрей:

        Версия 1.6.13.2

        Ответить
        • Виталий Кириллов:

          Андрей, плагины надо обновлять.

          Ответить
          • Андрей:

            Виталий, в общем я довыделывался… гляньте пожалуйста на мой блог. На главной вроде всё нормально, но стоит кликнуть по заголовку любого поста, то исчезает сайдбар и футер. Откат файлов почему-то не помог, отключил все плагины, не помогло, не подскажете где причину можно поискать?

            Ответить
          • Андрей:

            и комменты тоже не выводятся…

            Ответить
            • Виталий Кириллов:

              Андрей, напишите мне через форму обратной связи, я попробую помочь.

              Ответить
  11. Гагик:

    Здравствуйте, Виталий!
    Спасибо за статью и предложенное решение проблемы.
    Я так понимаю, применение предложенного Вами способа 4 делает бессмысленным способ 3.
    P.S.
    Похоже, Александр Борисов выявляет проблему, а рациональное решение предлагаете Вы )). Насколько я помню, так было и с проблемой с «replytocom».

    С уважением, Гагик.

    Ответить
    • Виталий Кириллов:

      Здравствуйте Гагик! Конечно, после активации функции mayak_canonical() исправлять ошибку в плагине All in One SEO Pack, уже не имеет никакого смысла.
      Получается так, что читатели сами меня информируют о насущных темах, которые их волнуют и по поводу статьи Борисова было очень много письм, поэтому я и решил написать пост.

      Ответить
      • Гагик:

        Спасибо за ответ, Виталий.
        С нетерпением жду новых статей.
        С уважением, Гагик.

        Ответить
  12. Sasha:

    Спасибо за такой информативный (как и всегда, в общем-то, пост)! Представляю,с колько работы пришлось проделать. Но наверняка не зря. Я пошла по легкому пути — изменила плагин, хотя Ол-ин-Сео Пак мне больше нравился. Но совершенно нет времени во все эти тонкости вникать). Вообще в идеале надо сначала шаблон менять, а потом уже с плагинами разбираться. И, конечно, буду ваши инструкции использовать.

    Ответить
  13. AndreyShaD:

    Добавил в закладки. Как будет время, поправлю.

    Ответить
  14. Валерий:

    Спасибо то, что нужно!

    Ответить
  15. Валерий:

    Еще такой вопрос: как избавиться от исходящей ссылки данного плагина?

    Ответить
    • Виталий Кириллов:

      Валерий, может я чего-то не знаю, о какой ссылке идет речь?

      Ответить
  16. Валерий:

    Имею ввиду плагин All in One SEO Pack выдает внешнюю ссылку если верить RDS bar. И еще один вопрос у меня вышла новая статья (есть в поиске уже) но блоге ее нет может проблема с плагином кеша? стоит настройка 24часа если я правильно понял кэш обновится через 24часа от последнего очищения и статья появится или нет?

    Ответить
    • Виталий Кириллов:

      Валерий, попробуйте просто обновить страницу и возможно статья появится. Вообще плагин должен быть настроен так, чтобы при добавлении новых текстов кеш обновлялся автоматически.
      Вы ссылку в каком месте сайта обнаружили?

      Ответить
  17. Александр Силиванов:

    Приветствую, Виталий!
    Дошли руки и до канонических ЮРЛов. Только вот ни правка в файле плагина, ни установка кодов в functions.php пока что ни к чему не привели. Все остается по-прежнему. И link rel=’prev’
    И за link rel=»canonical» выдается та ссылка, по которой я проник на статью (к ЮРЛу я после слэша добавлял некое число, вставлял в адресную строку браузера).
    Пока вернул все обратно, включая галочку в пункте Канонические ЮРЛы в настройках плагина.
    Коды вставлял в самое начало functions

    Ответить
    • Виталий Кириллов:

      Здравствуйте Александр!
      Не может такого быть, что-то Вы не так сделали, возможно кеш надо сбросить.

      Ответить
      • Александр Силиванов:

        С кешем — возможно. Правда, я в разных браузерах смотрел. Буду пробовать снова. Правда, чуть позже.

        Ответить
  18. Татьяна:

    Здравствуйте. Спасибо за код. Использую связку: сео-титл-тэг и вашу модернизацию ВП. Как в коде для functions.php оставить каноникал только для главной, категорий и страниц тэгов?

    Ответить
    • Виталий Кириллов:

      Здравствуйте Татьяна!
      Получится такая функция:

      function mayak_canonical(){
      		if (is_home() ) {
      			$mayak_chief_link = get_option('home');
      			$mayak_home_link = mayak_link_paged($mayak_chief_link);
      			$mayak_home_link = trailingslashit($mayak_home_link);
      			{
      		echo "".'<link rel="canonical" href="'.$mayak_home_link.'" />'."\n"; 
      	}
      } else if (is_category()) {
      			$mayak_cat_link = get_category_link(get_query_var('cat'));
      			$mayak_category_link = mayak_link_paged($mayak_cat_link);
      			{
      		echo "".'<link rel="canonical" href="'.$mayak_category_link.'" />'."\n"; 
      	}
      } else if (function_exists('is_tag') && is_tag()){
      			$tag = get_term_by('slug',get_query_var('tag'),'post_tag');
      		if (!empty($tag->term_id)) {
      	        $tag_link = get_tag_link($tag->term_id);
      	        } 
      			$mayak_tag_link = mayak_link_paged($tag_link);
      			$mayak_tag_link = trailingslashit($mayak_tag_link);
      		   {
      		echo "".'<link rel="canonical" href="'.$mayak_tag_link.'" />'."\n"; 
      	    }
          } 
      }
      function mayak_link_paged($link) {
      			$mayak_page = get_query_var('paged');
      			$mayak_check = function_exists('user_trailingslashit');
      	    if ($mayak_page && $mayak_page > 1) {
      	        $link = trailingslashit($link) ."page/". "$mayak_page";
      	        if ($mayak_check) {
      	            $link = user_trailingslashit($link, 'paged');
      	        } else {
      	            $link .= '/';
      	        }
      		}
      			return $link;
      	}
      add_action('wp_head', 'mayak_canonical');
      
      Ответить
  19. Алексей:

    Здравствуйте. Спасибо за вариант со вставкой в functions.php. Я собственно заморочился с этим только потому, что в новой версии AISP 2.2.5 на WP 4.1 я заметил занятную ошибку, которую описал здесь wordpress.org/support/topic/critical-bug-all-in-one-seo-pack-225-226

    Попробовал отключить в сеопаке добавление canonical и вставил ваш код, все вроде как отлично, но главная равно как и вся ее пагинация отображатеся вот так <link rel='canonical' href='http://example.com/' /> как сделать чтобы например example.com.ru/page/2/ отображалось как <link rel='canonical' href='http://example.com/page/2/' /> ? Подскажите пожалуйста )
    PS в рубриках же все отлично смотрю.

    Ответить
    • Виталий Кириллов:

      Здравствуйте Алексей! Если бы Вы заглянули в исходный код моего блога, то наверное догадались бы, что дело тут не в плагине. У меня стоит самая свежая версия All in One SEO Pack и с canonical на страницах пагинации все в порядке. Скажите, как образом у вас выводится постраничная навигация? У меня подозрения, что вы используете плагин для этих целей, который возможно и создает данную проблему..

      Ответить
      • Алексей:

        Виталий, спасибо за быстрый ответ. Пагинация реализована в самом шаблоне, также у меня тема формирует статическую страницу со своим шаблоном, которую я уже выбрал в качестве главной в опциях WP. Проверял у коллег, у них тоже все нормально с этими версиями. Вот ссылка s4galaxy.ru/page/2/ быть может мне вообще тогда стоит убрать этот тег с главных? Ваш вариант конечно в разы лучше, чем тот, что я описал на форуме WP, там вообще кашмар, но терять из индекса 240+ страниц тоже не хочется 🙂

        Ответить
        • Виталий Кириллов:

          Алексей, реализуйте постраничную навигацию, по моей инструкции, тогда все будет в порядке.
          Успехов!

          Ответить
  20. Александр Силиванов:

    Здравствуйте, Виталий! У меня получилось следующее.

    Правка кода в файле aioseop_class.php привела к тому, что при любых манипуляциях с добавлением некоей несуществующей страницы типа site/?243 в коде появляется ссылка на каноническую страницу (в данном случае — на главную).
    При добавлении к адресу записи номера ее (тоже не существующей) страницы — типа site/category/article/111 — тоже появляется link rel=»canonical» со ссылкой на каноническую страницу.

    Одновременно выводилась ссылка с атрибутом prev — на якобы предыдущую страницу этой самой записи. Ссылки с атрибутом next не было.

    Тогда я добавил в functions.php Ваш код, эту ссылку устраняющий. Сработало — ссылка с атрибутом prev исчезла.

    А вот второй код — функция вывода rel=»canonical» — почему-то работать у меня не пожелала. То ли я где-то ошибался, то ли в теме что-то мешает.

    Но в принципе, вроде бы, вопрос решен. Только при очередном обновлении All in One Seo Pack, как я понимаю, изменения в его файле исчезнут

    Ответить
    • Виталий Кириллов:

      Здравствуйте Александр! Скорее всего все же где-то ошибка, функция должна работать, шаблон тут не причем.

      Ответить
  21. Александр Силиванов:

    Добрый день, Виталий!
    Разбираться с тем, почему не работает код, пока руки не доходят. Пока оставляю все по-прежнему — отредактированный файл aioseop_class.php + Ваш код в файле functions.php, устраняющий ссылки на предыдущую и последующую страницы. Обновил только что плагин — сразу отредактировал файл.
    Ссылка на каноническую страницу выводится замечательно.

    Правда, Яндекс неведомо с какой дури взял да и проиндексировал сегодня две таких «страницы» — типа site/category/article/111. Хотя при переходе на них из Вебмастера, при просмотре кода виден link rel=»canonical» со ссылкой на каноническую страницу.

    Это, конечно, результат моих проверок работы кода и результата редактирования файла в плагине. Да и по статьям, по цифрам я это вижу.

    Вопрос такой — ждать, пока «само рассосется», или принимать меры? Функции «Удалить ЮРЛ» в Вебмастере Яндекса, в отличие от ГУГЛа, все равно же нет.

    Ответить
  22. Александр Силиванов:

    Не совсем точно выразился. Функция-то такая есть. Но, прежде чем удалять ЮРЛ из индекса, надо либо удалить статью, чтобы выдавалась ошибка 404, либо закрыть ее в robots.txt или мета-тегом robots

    Ответить
    • Виталий Кириллов:

      Александр, ошибки (глюки) у роботов тоже бывают. Проверьте, возможно вы где-нибудь оставили такую ссылку в качестве примера, пусть даже в текстовом варианте, но со своим доменом. Думаю, если такой страницы нет, то и дубля тоже не будет.

      Ответить
      • Александр Силиванов:

        Нет, подобной ссылки я не оставлял нигде. Можно, конечно, попробовать прописать в Вебмастере эти ЮРЛы на удаление. В их коде есть атрибут rel=»canonical». Следовательно, и для робота подобных страниц в этих записях не существует.

        Ответить
        • Виталий Кириллов:

          По-моему немного надо выждать.

          Ответить
  23. Семен:

    Виталий, скажите пожалуйста в последней версии All One Seo Pack данная проблема актуальна, требуются ли каки-либо из вышеописанных фиксов ?

    Ответить
    • Виталий Кириллов:

      Семен, насколько мне известно, разработчики All in One SEO Pack пока не удосужились исправить ошибку описанную в статье. Установите мою функцию и все будет в порядке.

      Ответить
      • Семен:

        Виталий, спасибо за ответ ! Последовал Вашему совету и установил функцию на свой блог, требуется Время для тестирования и подведения результатов работы функции, по возможности отпишусь !

        Ответить
      • Семен:

        А ёщё вопрос Виталий, как по Вашему мнению целесообразно ли устанвливать Вашу функцию плюс пдагин all one seo pack при условии, что галочка canonical будет снята на интернет магазин, построеннный на базе WordPress ???

        Ответить
        • Виталий Кириллов:

          Семен, функция служит дополнением к CSM WordPress и следовательно будет работать при любом шаблоне, будь то интернет магазин или другой функционал. Но в любом случаи надо все протестировать.

          Ответить
  24. Роман:

    Виталий, как оставить canonical только для первых страниц категорий (я оставил canonical только для категорий)

    Чтобы для domen/category/rubrika/page/2/, domen/category/rubrika/page/3/ и т.д. выводился rel canonical первой страницы domen/category/rubrika

    Ответить
    • Виталий Кириллов:

      Роман, извините, но я не могу переделывать код под желания каждого.

      Ответить
  25. Николай:

    Я хочу вам сказать, на счет All in One SEO Pack, а именно о генерации канонических урлов. В плагине все правильно организовано, там вшит аналог штатного rel_canonical(). Прикол в том, что штатный rel_canonical() работает только для sigle-post и page, а плагиновская функция — для всего на свете.

    Во-первых в функцию передается параметр function aiosp_mrt_get_url( $query ) { — $query это объект $wp_query. Во-вторых цикл никто не инициализовывает, поэтому в функцию get_permalink() передается id — записи $link = get_permalink( $post->ID ); Как он определяет, запись ли это? Там условие стоит } elseif ( ( $query->is_single || $query->is_page ) && $haspost ) {. Думаю комментировать не нужно это.

    Всем этим, я хотел сказать, что зря вы на плагин наезжаете. Плагин хороший и удобный (хотя я бы переделал некоторые моменты, как генерация тайтла отдельной записи — всегда по шаблону прикручивается 2-ая, статичная часть тайтла, а для торговли статьями нужен фиксированный тайтл).

    Я взял у вас функцию генерации канонических, но очень глобально ее переделал, так как у меня есть и произвольные типы записей и таксономии для них, а она у вас не генерит какнонические для таких страниц. К тому же, убрал строку
    $mayak_home_link = trailingslashit($mayak_home_link); — она добавляет ненужный слэш в конце канонической ссылки страниц пагинации главной страницы (при определенной настройки ЧПУ). Всегда происходит редирект на без слэша.

    А вообще спасибо за статью, с ее помощью дописал собственный функционал генерации сео-приблуд для wordpress.

    Ответить
    • Виталий Кириллов:

      Николай, во первых здравствуйте!
      На счет инициализации цикла согласен! Ведь я еще не «волшебник», а только учусь! НО!Я рад что моя функция помогла Вам решить, до этого видимо нерешаемые задачи.

      Ответить
    • Сергей:

      Николай спасибо тебе, долго я искал, как убрать этот слеш на конце урлов.

      Ответить
    • Сергей:

      Виталий, спасибо за статью! Подскажи пожалуйста, у меня rek=’canonical’ в статьях отображается с одинарными кавычками. Как сделать, что бы были двойные кавычки и в самом rel=»canonical» и в ссылке.

      Ответить
      • Виталий Кириллов:

        Сергей, а зачем Вам менять кавычки?)

        Ответить
        • Сергей:

          Виталий у меня на всех страницах rel=»canonical» выводится в двойных кавычках, а в самих статьях в одинарных, я сторонник того что бы теги, метаданные были одинаково оформлены, вот и всё.

          Ответить
          • Виталий Кириллов:

            Сергей, а чем у вас выводиться canonical? Вообще, с технической точки зрения и с точки зрения SEO, разницы между одинарными и двойными кавычками нет.

            Ответить
  26. Галия:

    Виталий, вот в статье «Правильная настройка плагина All in One Seo Pack»
    http://seo-mayak.com/sozdanie-bloga/plaginy-wordpress/nastrojka-plagina-all-in-one-seo-pack.html
    вы пишите, что «галочку» на канонические URL надо оставить.
    А здесь все наоборот.
    Или я неправильно поняла?

    Ответить
  27. Галия:

    Я кажется, теперь разобралась, поискав и почитав информацию про то, что такое Канонический url.
    Теперь понятно: в AiOSeo мы должны выбрать в качестве канонической стр. ту, которую мы считаем нужной, а для php-файла уже идут добавки к плагину, которые вы доработали.
    Теперь я правильно поняла, да?

    Ответить
  28. Галия:

    Жаль, что нельзя редактировать свои комментарии.
    Еще раз перечитала вашу замечательную статью и решила для себя, что мне пока достаточно использовать
    Способ №3. Исправить ошибку в плагине All in One SEO Pack (рекомендуется)
    ————
    что я и сделала.
    спасибо вам.

    Ответить
    • Егор:

      Не забудьте обновить изменения после обновления плагина. А почему не в functions.php?

      Ответить
      • Виталий Кириллов:

        Егор, вы не внимательно читали статью. Обновлять изменения надо только, если эти изменения были произведены в файле плагина.

        Ответить
        • Егор:

          Я про плагин имел ввиду. Ну и если тема не дочерняя, то лучше все изменения комментировать.

          Ответить
  29. Егор:

    Здравствуйте, спасибо за отлчную функцию.
    У меня вопрос немного не по теме, вы не знаете как убрать двойной тайтл? Вот привожу с главной. Дело не в плагине. Не могу понять где может генерить двойной тайтл?

    <title>ААвто-Мастер | Кузовные работы / ШиномонтажААвто-Мастер | Кузовные работы / Шиномонтаж</title>

    Ответить
    • Виталий Кириллов:

      Здравствуйте Егор, бывает что разработчики шаблонов прописывают свои функции для вывода title. Ищите в файле functions.php функцию, где есть упоминания о функции wp_title и удалите эту функцию целиком, тогда проблема отпадет.

      Ответить
      • Егор:

        Виталий, спасибо большое за такой быстрый ответ на мой вопрос. Ваш ответ на комментарий застал меня за удалением функции вывода тайтла из файла functions.php. Проблема решена. А так подумал, конечно, скорее всего в functions.php вывод реализован, вот и дублируется. Кстати, не в первой теме замечаю это недоразумение. Есть подозрение, что эта функция является обязательной, для размещения темы в репозитории WP. Потом проверю плагином THEME CHECK. Еще раз спасибо!

        Ответить
  30. Дмитрий:

    Не нравится мне то, что из-за этого canonical в индексе только первая страница рубрик (у меня рубрики открыты для индексации). Можно ли как-то сделать так, чтобы все страницы рубрик не отсылали к первой, ведь они все разные.

    Ответить
    • Дмитрий:

      Выражусь точнее. Как запретить пагинацию канонических URL для статей и страниц, но не запрещать для рубрик и страниц вида /page/номер страницы/.
      У вас это сделано (судя по исходному коду страницы). Но у меня сео пак либо разрешает все либо запрещает все.

      Ответить
      • Виталий Кириллов:

        Дмитрий, установите мою функцию и снимете галочку в настройках плагина All in One SEO pack, в разделе «Канонические URL».

        Ответить
        • Дмитрий:

          Все прекрасно заработало. Спасибо.
          Разработчики сео пака хоть и решили проблемы с этим тегом, но не сделали гибкой настройки.
          Без этого получается, что яндекс выкидывает из индекса все страницы рубрик кроме первой, а в вебмастере ошибки начинает рисовать (якобы документ запрещен в роботсе)

          Ответить
  31. Виталий:

    Спасибо, действительно есть такая проблема и я даже написал о ней разработчику all in one seo. Разумеется, он проигнорил)

    Если мы заменяем $link = get_permalink( $post->ID ) на $link = rel_canonical(), то, казалось бы, все отлично, только дело в том, что пропадают канонические урлы на страницах вида site.ru/statia/comment-page-2/ — в коде в качестве канонического урла именно site.ru/statia/comment-page-2/, поэтому такие страницы нередко попадают в индекс. Если мы не заменяем функцию и при этом в настройках включаем aios функцию «Запретить пагинацию для канонических URL», тогда в урлах вида site.ru/statia/comment-page-2/ в качестве канонической страницы устанавливается site.ru/statia/, то есть основная страница. В коде страница вида site.ru/statia/123/ — тоже в качестве канонической страницы устанавливается site.ru/statia/, но при этом будут дополнительные ссылки вида и т.д. Я так понимаю, что эту функцию можно смело удалять с помощью удаления данных строчек?

    if ( !empty( $prev ) ) $meta_string .= «\n»;
    if ( !empty( $next ) ) $meta_string .= «\n»;

    Ответить
    • Виталий Кириллов:

      Виталий, если я Вас правильно понял, Вы хотите удалить линки на следующую и предыдущую страницы, генерируемые самим WordPress? Если это так, то сделать это можно следующим образом:

      remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0 );
      Ответить
      • Виталий:

        Да, именно это имел ввиду, просто не дописал. Я удалил указанные две строчки:

        if ( !empty( $prev ) ) $meta_string .= «\n»;
        if ( !empty( $next ) ) $meta_string .= «\n»;

        Не думаю, что это повлияет на работу плагина, только при обновлении они могут вернуться, так?

        Ответить
        • Виталий Кириллов:

          Да Виталий после обновления, они вернутся.

          Ответить
          • Виталий:

            Хорошо, попробую воспользоваться советом выше. Отпишусь позже.

            Ответить
            • Виталий:

              Отписываюсь — код remove_action( ‘wp_head’, ‘adjacent_posts_rel_link_wp_head’, 10, 0 ); не сработал, добавил в functions.php, ссылка в коде осталась. Версия плагина — последняя. В принципе, удалить руками указанные мною две строчки — не проблема, просто можно забыть это сделать, только вот робот таких ошибок не забывает. В общем, неудобно.

              Ответить
  32. Артем Юдинцев:

    Благодарю! Еще один способ отказаться от использования ASP и перейти на SEO ULTIMATE. В последнем есть возможность управлять индексацией отдельных категорий и тегов, что немаловажно для меня. А вот с каноническими урлами там беда — использую ваш способ!

    Ответить
  33. Артем Юдинцев:

    Пришлось переделать Ваш код немного под себя.
    $mayak_home_link = trailingslashit($mayak_home_link);
    $string = $mayak_home_link;
    $pattern = '/(.+?)\/(page)\/(\d+)/i';
    $replacement = '$1';
    $repl = preg_replace($pattern, $replacement, $string);
    {
    echo "".'<link rel="canonical" href="'.$repl.'" />'."\n"."".'<meta name="googlebot" content="noindex,follow"/>
    <meta name="yandex" content="noindex,follow"/>'."\n";
    }

    Сссылка вида не есть хороший вариант. Я считаю что такая ссылка должна быть без /page/…/, однако чтоб не терять вес, лучше ставить на таких noindex,follow. Тогда уж дублей не создастся точно.
    Или я не прав ?

    Ответить
  34. Alex:

    Подскажите как быть если на страницах архивов в вордпресс в каноникале не правильно отображается дата. Т.е. имеем канинокал: ?m=201510 а НАДО: ?m=201410. И на всех страницах архивов прописан один и тот же каноникал ?m=201510

    Ответить
  35. Андрей:

    Все так просто оказалось, поправил плагин, все хорошо стало. Это кстати я растолковал проблему Александру Борисову правда он меня не упомянул в своей статье что как то немного обидно хотя и писал что упомянет…

    Ответить
  36. Сергей:

    Здравствуйте.
    Совместно с плагином СЕО ультимайт стоял плагин Robots Meta. После вышеописанных манипуляций его можно отключить?

    Ответить
    • Виталий Кириллов:

      Здравствуйте Сергей! Насколько я понимаю плагин Robots Meta выводит мета-тег robots. Думаю прежде чем отключать данный плагин советую ознакомится с этим материалом.

      Ответить
      • Сергей:

        Спасибо за удивительно быстрый ответ!
        Статью прочитал, функцию указанную внизу статьи вставил, галки в Настройках индексирования All in One SEO Pack убрал. Насколько я понял, теперь Robots Meta точно не нужен?

        Ответить
        • Виталий Кириллов:

          Да, можно отключить.

          Ответить
          • Сергей:

            И спасибо за предыдущую ссылку. Заодно прочитал про «сопли» гугла, посмотрел у себя, увидел в RDS на своем сайте «Индекс G:186 (5%)» и ужаснулся. А то все думал, почему гугл мой сайт стороной обходит…

            Ответить
            • Андрей:

              блин, как бы еще понять о чем вы разговариваете! :))

              Ответить
              • Сергей:

                Это я все в кучу понаписал, что интересного нашел, блуждая по Вашему сайту )))

                Ответить
  37. Елена:

    Виталий, сейчас в обновлённом плагине появилась настройка «Запретить пагинацию для канонических URL» с таким описанием: Эта опция установит канонический URL на первой странице для всего контента (страниц) пагинации. Это случайно не решает все те проблемы, о которых Вы пишите?
    А это из документации по этой настройке (перевод браузера): «Эта опция была добавлена для тех пользователей, которые хотят, чтобы удалить нумерацию страниц из канонического URL-адреса. Обычно канонический URL-Адрес для разбивки на страницы или поста будет отображаться на mydomain.com/page/2/. Эта опция удаляет /Страница/2/ от канонического URL.
    Или это ни о чём? Подскажите пожалуйста, а то прочитав то, что Вы предлагаете, голова кругом, как всё это проделать и чего-нибудь не напортачить.

    Ответить
    • Виталий Кириллов:

      Здравствуйте Елена! Да, обновление в плагине действительно решает проблему с каноническими URL о которой я писал в статье. Видимо все-таки достучался до разработчиков). Но я все равно оставил свою функцию, теперь изменения в плагине меня уже не интересуют.

      Ответить
      • Елена:

        Виталий, спасибо огромное, что ответили. Гора с плеч! Может быть Вы подскажете ещё один момент? С помощью All in One SEO Pack мы под статьёй вводим заголовок, описание и ключевики. Под каждым из этих разделов выводится количество знаков и соответственно загорается предупреждение, если это количество превышено и поясняется, что поисковики видят не более 60 знаков (в моём случае проблема с заголовком). Так вот, даже если я ещё не вписала свой заголовок, то там уже горит красный квадратик с цифрой 62 (и бледным цветом заголовок прописан автоматически). Когда же я пытаюсь вписать его сама, то соответственно цифра увеличивается с каждым знаком. В самом заголовке всего 13 знаков.
        Вордпресс обновлён до последней версии, плагин тоже. Сайт ещё молодой, созданы только необходимые страницы и одна запись. Может быть удалить плагин и загрузить по-новой? Подскажите, пожалуйста

        Ответить
        • Виталий Кириллов:

          Елена, страшного ничего нет, просто вписывайте в title не больше 60 символов и все.

          Ответить
          • Елена:

            Виталий, спасибо Вам за помощь, теперь постараюсь расслабиться и заняться тем, чем нужно.

            Ответить
      • Виталий:

        Автор плагина не убрал из кода , то есть страницу, которую бот по-прежнему может прочитать. Правда, если я правильно понимаю, попав на страницу site.ru/stranica/3/, он все равно увидит в качестве канонической site.ru/stranica/. Неужели нельзя сразу нормально разобраться с проблемой?

        Ответить
        • Виталий Кириллов:

          По Вашему нормально это как?

          Ответить
  38. Алексей:

    Давно не обновлял плагин All in One, обновил.
    Всё нормально, но обнаружил, что каноническая на главной теперь пишется со слешем на конце http://site.ru/, а раньше было без слеша, у меня вообще идёт переадресация на главную без слеша.
    Вроде бы мелочь, но почему так и как исправить не могу найти

    Ответить
    • Виталий Кириллов:

      А что в этом страшного? Ну и пусть будет слеш на конце, это ни на что не влияет.

      Ответить
  39. Алексей:

    Здравствуйте! попробовал на своем сайте добавить /?abc к урлу В коде страницы rel_canonical() выдает без /?abc Попробовал удалить плагин All in One SEO Pack и посмотреть В коде страницы rel_canonical() выдает без /?abc Почему так получается? Это результат обновления вордпресса до последней версии или обновленный плагин? в таком случае почему без него в коде страницы rel_canonical() выдает без /?abc

    Ответить
    • Виталий Кириллов:

      Здравствуйте Алексей! Это результат обновления плагина, писал об этом в комменте выше.

      Ответить
  40. Елена:

    Виталий, напишите пожалуйста Ваше мнение. Решит ли все проблемы плагин Yoast SEO для WordPress? А то, как видно из комментариев, с плагином All in One SEO Pack много проблем. Некоторые блогеры считают его (Yoast) лучшим и очень рекомендуют, особенно на молодых сайтах?
    Спасибо.

    Ответить
    • Виталий Кириллов:

      Здравствуйте Елена!
      Плагин Yoast SEO используют многие, хороший плагин. Но и All in One SEO Pack тоже неплохой продукт. Я использую All in One SEO Pack довольно давно, были конечно проблемы, на сейчас все они устранены. Само главное его правильно настроить. В любом случаи Вам решать, какой продукт выбрать.

      Ответить
  41. Елена:

    Виталий, спасибо, что отвечаете на все вопросы. Я Вам очень благодарна за это.

    Ответить
  42. Олег:

    По поводу ошибочного проставления адреса страницы. Могут (как в моём случае) специально (используя метод негативного SEO) проставлять неверные ссылки на страницы сайта. Причём добавляют не через знак «?», а через знак «&» набор символов. И тогда, атрибут rel=»canonical» не помогает, отдаёт ошибку 404. Кстати Ваша страница сайта при таком запросе, тоже выдаёт ошибку 404, можете проверить seo-mayak.com/seo-prodvizhenie/tonkosti-prodvizheniya/skvoznye-ssylki.html&sa=U&ved=0ahUKEwiio_PEwLjJAhUJz3IKHVMpAjEQFgghMAI&usg=AFQjCNFRbxvmZL9GmUuIpfyrppR2FuJEGg
    Вроде бы то, что выдаёт ошибку 404 неплохо. Но неизвестно, как эту ошибку буду учитывать браузеры-поисковики, не понизится ли в последствии рейтинг основной страницы (из-за недоступности 404)

    Ответить
    • Виталий Кириллов:

      Бывает, что поисковики непонятно где индексирует битые ссылки, о которых вы упомянули в своем комментарии. В любом случаи такие урлы не имеют никакого отношение к основной странице и я не думаю, что современные аналитические технологии поисковых систем не смогут разобраться в такой ситуации.

      Ответить
  43. Егор:

    Здравствуйте, а сейчас данная функция актуальна? Плагин обновился уже раз 10-15 за это время.

    Ответить
    • Виталий Кириллов:

      Здравствуйте Егор! В одном из вышедших обновлений была добавлена опция «Запретить пагинацию для канонических URL», которая решает описанную в статье проблему. Но! Функция актуальна в любом случаи, более того, в ближайшем будущем я ее дополню. В функцию будет включен вывод атрибута canonical для так называемых пользовательских типов записей, о которых я в данное время готовлю пост.

      Ответить
      • Сергей:

        Извиняюсь, если вопрос глупый))
        Можно ли обновлять плагин, если была проведена доработка по Вашей статье?

        Ответить
        • Виталий Кириллов:

          Сергей, Вы имеете в виду мою функцию или доработку кода в самом плагине?

          Ответить
  44. Сергей:

    Ну с функцией-то думаю ничего не случится, а вот здесь все слетит?

    В текстовом редакторе Notepad++ открываем файл aioseop_class.php, что находится по адресу wp-content/plugins/all-in-one-seo-pack/aioseop_class.php и ищем такую строку:

    $link = get_permalink( $post->ID );

    На момент версии All in One SEO Pack 2.2.4, строка №2269. Меняем функцию get_permalink() на уже знакомую нам функцию rel_canonical(). Должно получиться так:

    $link = rel_canonical();

    Ответить
    • Виталий Кириллов:

      Да Сергей, все верно, слетит. Но советую все же обновить плагин, так как код больше править не надо, а надо просто активировать в настройках плагина новую опцию «Запретить пагинацию для канонических URL».

      Ответить
      • Сергей:

        С этим ясно, спасибо.
        Еще один вопрос: я вставил функцию из Вашей статьи «Мета-тег robots. Правильная настройка индексации сайта»

        Для этого открываем файл functions.php и в самое начало, после php тега <?php, вставляем такую функцию:
        function mayak_meta_robots () {
        if (is_archive() or is_category() or is_feed () or is_author() or is_date() or is_day() or is_month() or is_year() or is_tag() or is_tax() or is_attachment() or is_paged() or is_search())
        {
        echo "".'’.»\n»;
        }
        }
        add_action(‘wp_head’, ‘mayak_meta_robots’);
        Ее по-прежнему можно оставить, и никаких галок в настройках индексирования плагина после его обновления проставлять по-прежнему не надо?
        Спасибо.

        Ответить
        • Виталий Кириллов:

          Здесь ничего менять не надо, никакие обновления на функцию не влияют.

          Ответить
  45. Гость:

    Как сделать каноническую ссылку только для главной? Можете дать код для файла functions.php ?

    Ответить
    • Виталий Кириллов:
      function mayak_canonical(){
      		if (is_home() ) {
      			$mayak_chief_link = get_option('home');
      			$mayak_home_link = mayak_link_paged($mayak_chief_link);
      			$mayak_home_link = trailingslashit($mayak_home_link);
      			{
      		echo "".'<link rel="canonical" href="'.$mayak_home_link.'" />'."\n"; 
      	}
          }
      }
      add_action('wp_head', 'mayak_canonical');
      
      Ответить
  46. Николай:

    Все понятно. Спасибо. Но ведь после каждого обновления плагина нужно править файл плагина и functions.php. Но ведь можно забыть.

    Ответить
    • Виталий Кириллов:

      Николай если вставить функцию, тогда никакой зависимости от обновлений не будет. А править файл плагина уже не надо, в плагине исправлена ошибка, об этом я писал в комментариях выше.

      Ответить
      • Николай:

        Но ведь при обновлении темы functions.php тоже изменится.

        Ответить
        • Виталий Кириллов:

          Все верно! Я не пойму в чем трудность, ведь в плагине All in One SEO Pack проблема с canonical давно решена и если вы опасаетесь вставлять функцию, тогда просто активируйте в плагине соответствующие опции.

          Ответить
          • Сергей:

            Присоединюсь в вопросу. А можно при вставленной функции активировать опцию и в плагине, или нужно чтобы было или то, или другое? А то вдруг опять какие изменения в плагине будут, и чтобы больше не обращаться к этому вопросу.

            Ответить
            • Виталий Кириллов:

              Сергей, если использовать оба варианта, то в коде будет два атрибута canonical, что конечно нежелательно. Вы уж выберите один из вариантов.

              Ответить
  47. Сергей:

    Классно у Вас реализовано плавающее содержание статьи справа от текста))) Можете поделиться секретом, как можно такое сделать на своем сайте? ))

    Ответить
  48. Геннадий:

    Респектище Автору!Будучи полным чайником в SЕО технологиях смог понять и разобраться, что от куда и куда с «Канонические URL’ы». Остался несколько вопросов :Ссылаясь на вопрос Татьяны»Здравствуйте. Спасибо за код. Использую связку: сео-титл-тэг и вашу модернизацию ВП. Как в коде для functions.php оставить каноникал только для главной, категорий и страниц тэгов?»Нужно ли мне вставлять Ваш движок ещё куда-то кроме файл functions.php?Должна ли строка»Пользовательский канонический URL» в описании каждого товара оставаться не заполненной?За ранее спасибо,Виталий.

    Ответить
    • Виталий Кириллов:

      Здравствуйте Геннадий!
      1. Функцию надо вставлять только в один файл functions.php.
      2. А как же архивы? Не думаю что надо рвать функцию
      3. Поле «Пользовательский канонический URL» заполнять не надо.

      Ответить
  49. Геннадий:

    Ещё раз спасибо Виталий!

    Ответить
  50. emeljanenko:

    Скорее всего у меня на сайте это от плагина All in One SEO Pack , я его удалил и поставил Yoast SEO.
    Но страницы почему то не уходят.

    Ответить
  51. Ксенья Юрьевна:

    Огромное спасибо Виталий за такую функцию, а то у меня в Яндексе уже 5 нормальных статей с rel-«canonical», а потом еще больше нарастет.Удалила все большие плагины SEO и поставила этот — Sewn In Simple SEO, маленький и легкий, без лишних функций. Надеюсь, что ваш код будет кстати, у меня и ваш запретительный метатег стоит, как раз над ним и встала новая функция.

    Ответить
  52. Ксенья юрьевна:

    Виталий, по вашему опыту, через сколько времени может исчезнуть rel=»canonical» в коде сайта. Я установила ваш код в файл функций примерно неделю назад, но пока все без изменений.

    Ответить
    • Виталий Кириллов:

      У Вас вроде все работает.

      Ответить
  53. Снежана:

    Прекрасная статья, спасибо.

    Ответить
  54. Ксенья Юрьевна:

    Виталий, я написала в поддержку Яндекса по вопросу link rel= «canonical». Есть некоторые изменения, я то их не заметила. Сейчас в коде, рядом с этим атрибутом, пишется адрес статьи и индексируется. Меня отправили по этой ссылке, я прочла и успокоилась. yandex.ru/support/webmaster/controlling-robot/html.xml#canonical.

    Ответить
  55. Николай:

    Почему у меня не появляется canonical категория магазина на воокумерц? вставил код как вы сказали в категориях магазина ничего нет, в товаре есть, как код допилить?

    Ответить
  56. Сергей:

    Виталий приветствую! Писал тебе, через форму обратной связи, но почему то ответа так и не дождался. Подскажи пожалуйста, пользуюсь твоим кодом rel=»canonical», хочу использовать пагинацию комментариев, но ссылки имеют вид ваш.сайт/comment-page-1/#comments, как сделать, что бы канонической на всех страницах пагинации комментариев была основная ваш.сайт/укеуекуе/ а не comment-page-1/#comments?

    Ответить
    • Виталий Кириллов:

      Здравствуйте Сергей, К сожалению у меня нет готового решения! Если как-нибудь столкнусь, напишу в комменте.

      Ответить
      • Сергей:

        Жаль, но всё равно спасибо за ответ, буду ждать, может будет решение.

        Ответить
  57. Николай:

    Виталий!
    У меня в коде два
    <link rel="canonical"
    Подскажите, что сделать?

    Ответить
    • Виталий Кириллов:

      Николай, видимо у Вас canonical еще плагином выводиться. Смотрите настройки плагина.

      Ответить
      • Николай:

        Мне, что в All in One SEO Pack убрать птичку в canonical URLs или нет?

        Ответить
        • Виталий Кириллов:

          Да, уберите галочку с данного пункта.

          Ответить
  58. Евгений:

    Виталий привет! Если я не использую плагин All in One SeoPack, будет ли актуальна твоя функция, в конце статьи, для защиты от дублей?

    Ответить
    • Виталий Кириллов:

      Функция актуальна, я сам ее использую, но другие SEO плагины также могут выводить canonical, поэтому надо учитывать это и не допускать дублирование атрибута.

      Ответить
  59. Иван:

    Добрый день.
    Сделал все как описано в Вашей статье, но теперь на странице мойсайт.ру/page/3 и т.п. каноническая ссылка выводится на саму себя, т.е. страницу пагинации, а не на первую. И вставив указанный выше код я не избавился от rel=’prev’ и rel=’next’. И я не знаю куда копать)

    Ответить
    • Виталий Кириллов:

      В случаи с постраничной навигацией, считаю такой подход правильным, ведь это любая страница пагинации — это уникальная страница. Возможно prev и next у Вас выводится самим WordPress, тогда ответ здесь.

      Ответить
  60. Марина:

    Спасибо за 4 способ, я его еще доработала, чтобы тег добавлялся для категории продукции в woocommerce, теперь на всех страницах есть canonical.
    кому нужно:

    else if (is_product_category()) {
                $mayak_pr_cat_link = get_term_link(get_query_var('term'), 'product_cat');
                $mayak_pr_category_link = mayak_link_paged($mayak_pr_cat_link);
                {
            echo "".''."\n";
        }
    }

    я вставила код после is_category()

    Ответить
    • Виталий Кириллов:

      Спасибо Марина за дополнение. Я сам не пользуюсь woocommerce, но уверен, что многим ваш код пригодится.

      Ответить
  61. Ксенья Юрьевна:

    Все забеспокоились, потому, что Яндекс вебмастер стал выводить в «исключенных страницах» не канонические урлы. На моем сайте про дачу,количество таких адресов быстро выросло до 150 — практически весь сайт. Установила простенький SEO плагин, который ни на что не влияет, только заполняем строки с заголовком статьи и описанием.
    А главное скопировала ваш код и вставила его в файл функций. Примерно через полтора месяца уже есть положительный результат. В неканонических урлах появилось перенаправление, и они потихоньку в индексе уменьшаются. Так что обоснованное спасибо, Виталий, за вашу статью.

    Ответить
  62. Али Касимов:

    Добрый день! У меня есть форум, который создано с плагин mingle forum. Все нормально, но одна проблема есть (((. Страницы форума не индексируется. Я искал решение и нашел такие рекомендации. Многие советуют, убрать канонические ссылки. Но я не могу найти этих ссылки. Как можно решить данную проблему?

    Ответить
    • Виталий Кириллов:

      Здравствуйте! Атрибута canonical в исходном коде я не нашел, но вот такой линк shortlink точно лишний, так как всегда ведет на главную страницу форума:

      <link rel='shortlink' href='http://forum.adolat.uz/' />

      Как избавиться от данного линка читайте здесь.

      Ответить
      • Али Касимов:

        Спасибо за ответы! Но у меня вопросик еще, тогда я должна вставить только этой код?
        remove_action( ‘wp_head’, ‘wp_shortlink_wp_head’, 10, 0 );

        Ответить
        • Виталий Кириллов:

          Вообще я в статье советовал подчистить область head от лишних линков, у вас там и версия WordPress выводится. Сами смотрите, что вам надо, а что нет.

          Ответить
          • Али Касимов:

            Ага ладно, я вставил коды, теперь жду. Спасибо вам большое!

            Ответить
  63. Владимир:

    Скажите- статья по сей день актуальна с сегодняшним вордпресом ?
    Проблема в том что яндекс выкинул большое количество страниц с «документ является неканоническим» .

    Ответить
    • Виталий Кириллов:

      Если Вы про функцию, то да, она актуальна.

      Ответить
  64. Дмитрий:

    Здравствуйте, у меня на сайте есть форум powercoup.by/forum.html и он проиндексирован роботами, но другие страницы форума не попали в индекс, подскажите как быть в этом случае?
    роботы ругаются что этот документ является неканоническим.
    пример:
    powercoup.by/forum.html?view=forum&id=15
    powercoup.by/forum.html?view=forum&id=16

    Ответить
    • Виталий Кириллов:

      Дмитрий здравствуйте! Атрибут canonical в исходном кода данных URL указывает на главную страницу форума, а должен вести на туже страницу. Думаю проблема в функционале вывода canonical. Готового решения у меня нет, гуглите, может что отыщите.

      Ответить
  65. Dzmitry Roshchyn:

    Приветствую! Полезная статья! Добавил на один из сайтов код для вывода canonical, но есть вроде небольшой баг, возможно это особенности моей темы! На страницах меток в исходном коде канонический адрес прописывается со слэшем, а в строке браузера без него. Проверяя спайдером находит дубли, благо метки закрыты от индексации. Хук пока я порезал, до выяснения причины. В чем может быть дело?

    Ответить
    • Виталий Кириллов:

      Здравствуйте! Уберите строчку с вызовом функции trailingslashit(), она добавляет слеш в конец URL.

      Ответить
  66. Александр Силиванов:

    Здравствуйте, Виталий!
    Вношу изменения в тему Вордпресс (на тестовом поддомене). Никак не встает Ваша функция для вывода атрибута canonical. Просто отказывается работать блог, и все!
    Но в итоге обнаружил следующее. Если в настройках плагина All in One SEO Pack (самая свежая версия 2.3.4.2) поставить галочки «Канонические URL» и «Запретить пагинацию для канонических URL», то в итоге получаем в коде атрибут rel=»canonical» со ссылкой на каноническую страницу.
    При этом вносить изменения в файл aioseop_class.php не требуется.
    Правда, функцию удаления ссылок с атрибутами prev и next нужно оставлять, иначе выводит ссылку на prev.

    Ответить
    • Виталий Кириллов:

      Здравствуйте Александр! Да, проблему закрыли, я об этом уже писал в комментариях выше, но функция рабочая в любом случаи. Значит у Вас в шаблоне дело.

      Ответить
      • Александр Силиванов:

        Возможно, и в шаблоне. У меня в действующей теме блога именно эта функция работать отказалась. Так что ли тема, или «сглаз» ?-)

        Ответить
  67. copy:

    Добрый день! Поставил на сайт плагин форума (Asgaros) — в нем страницы без ЧПУ, добавил в All in One SEO Pack в исключенные страницы /forum, но форум не индексируется, в Яндексе пишется, что «документы являются неканоническими».Не подскажете, как это исправить?

    Ответить
    • Виталий Кириллов:

      Здравствуйте! Все верно, выше в комментариях я уже писал, что на всех страницах форума почему-то стоит атрибут canonical с ссылкой на главную страницу форума. Поэтому другие страницы, кроме главной, робот считает неканоническими.

      Ответить
  68. Булат:

    Выполнил 3 способ, т.е. исправил ошибку в плагине.
    Результата нет, для каких-то страниц конечно работает, но не для всех.
    Как быть в таком случае?

    Ответить
    • Виталий Кириллов:

      Булат, в плагине проблема уже давно решена и нет смысла редактировать код. В комментариях я уже об этом писал, поправить статью руки не доходят.

      Ответить
  69. Андрей Д:

    Добрый день. Не пойму, в чем проблема, вставляю вашу функцию через ноутпад. галочку снял в сео паке. Выдает ошибку: Parse error: syntax error, unexpected ‘>’ in Z:\home\localhost\www\…functions.php on line 44 . В чем может быть проблема? Может, вы сталкивались?

    Ответить
    • Виталий Кириллов:

      Здравствуйте! Это ошибка синтаксиса php, или вы не туда вставили или код не полностью скопировали.

      Ответить
      • Андрей:

        Да нет, у вас действительно ошибка. Лишняя > в строке 43:
        «$mayak_author_link = >mayak_link_paged($mayak_auth_link);»

        Ответить
        • Виталий Кириллов:

          Спасибо Андрей! Непонятно, как там этот знак появился, видимо случайно. Уже поправил.

          Ответить
  70. Люси:

    Добрый день, Виталий! У меня стоит плагин Platinum SEO Plugin Options
    Но возникла куча дублей, типа site.ru/category/post-name/444/
    site.ru/category/post-name/59/
    и т.д.
    Подскажите пожалуйста, как мне от них избавиться? Чтобы было проиндексировано site.ru/category/post-name/ без страниц /444/
    Заранее спасибо за помощь. С уважением, Людмила.

    Ответить
    • Виталий Кириллов:

      Здравствуйте Люси! Атрибут canonical на данных страницах присутствует?

      Ответить
      • Люси:

        Здравствуйте! Спасибо за отклик! Я уже исправила! По Вашей рекомендации удалила не верный rel canonical от wordpress.
        зате удалила Platinum SEO Plugin Options. установила Yoast SEO. в Yoast SEO поставила галочку в пункте Redirect ugly URLs to clean permalinks и проблема решена! rel canonical верный и при добавлении к урлу гадости типа /444/ сразу перенаправляет на верный канонический адрес.
        Удачи!

        Ответить
  71. Виктор:

    if (is_category()) {
    $mayak_cat_link = get_category_link(get_query_var(‘cat’));
    $mayak_category_link = mayak_link_paged($mayak_cat_link);
    {
    echo «».».»\n»;
    }
    }

    А зачем вторые фигурные скобки, почему echo в них обернуто? Смысл в них какой?

    Ответить
  72. Виктор:

    А вот это что такое?
    $mayak_date_link = get_month_link(substr($m, 0, 4), substr($m, 4, 2));
    $mayak_date_link = mayak_link_paged($mayak_date_link);

    Почему не написать одним оператором тоже самое?

    Ответить
    • Ярослав:

      Ты что не видишь это галимая реклама, а ещё он хочет доказать всему миру, что код сделал именно он.

      Ответить
      • Виталий Кириллов:

        Я удивляюсь людской сущности.
        Один хочет набрать очков, ища ошибки в работающей функции. Конечно некоторые моменты можно упростить, но это не значит, что функция корявая.
        Второй видимо сам вообще в php ничего не смыслит, раз считает, что функции с неба берутся и я пытаюсь что-то кому-то доказать.
        Что же Вы сами такую функцию не разработали, а пошли искать в сеть?

        Ответить
  73. Антон:

    Здравствуйте, Виталий!
    Спасибо за функцию.
    Вы не подскажите как можно сделать уникальный description каждой страницы при пагинации, хотя бы добавить как в title добавляется «Страница — 2,3» при работающем Seo Pack? Как я понял All in one seo pack где-то на уровне функции перехватывает описание рубрик/меток и публикует в своём контейнере описания. Вот в него бы как-то и поместить.

    Буду благодарен за ответ!

    Ответить
  74. Владимир:

    Виталий, добрый день!
    Подскажите, пожалуйста, как можно сформулировать запись генерации канонического url в исходном коде, чтобы каноническими автоматически указывались страницы по протоколу https, включая внутренние страницы?
    Например, если заходишь на страницу сайта по протоколу http, то в исходном коде канонической указывается соответствующая страница, но по протоколу https. Ну и поисковики также сразу же видели, какой протокол приоритетный.
    Что-то типа такого: <?if($REQUEST_URI$=$ENTRY_URL$)?><?else?><link rel="canonical" data-link="$ENTRY_URL$"/><?endif?>, наверное.
    Возможно ли это?
    Заранее благодарен за ответ!
    С уважением,
    Владимир

    Ответить

Оставить комментарий

Внимание комментатор! Прежде чем вставить: HTML, JavaScript или PHP код в свой комментарий, преобразуй его в html сущность!

Subscribe without commenting

» Подписаться на комментарии по RSS