Всем привет! Сегодня на seo-mayak.com мы будем разбирать атрибут rel="canonical". Рассмотрим его, так сказать, под разными углами, проведем некоторые сравнения и конечно немного поработаем с PHP.
За прошедших пару месяцев, я получил уйму писем с различными просьбами и предложениями. Если кому-то не ответил, прошу не судить строго. На всех меня все равно не хватит!
Подбирая тему для будущей статьи, я полистал почту и понял, что веб-мастеров стал сильно волновать тег canonical. Правильно его будет называть атрибутом, поэтому слово «тег», применительно к rel="canonical", я больше использовать не стану.
Так вот, после статьи Александра Борисова, в которой он описал проблему с canonical в плагине All in One SEO Pack, все ринулись искать какую-то информацию, касательно данного атрибута, а ее на самом деле не так много.
Есть конечно мануал Google или справка Яндекса, где довольно кратко описывается взаимодействие атрибута с поисковыми алгоритмами. Объясняется как роботы понимают rel="canonical" и как правильно его применять.
Почитав некоторые статьи по теме, я понял, что конкретных инструкций по самостоятельному внедрению rel="canonical" на страницы сайта, просто нет и веб-мастера почти поголовно используют плагины, которые всегда преподносят какие-то сюрпризы.
Вот и прыгает народ с плагина на плагин, так реально и не разобравшись в принципах работы 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="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" будет помечена такая ссылка:
Как видите, ссылка не является канонической и ведет на тот же неправильный URL. Если робот найдет такие неправильные ссылки на других ресурсах мирового интернета, то угроза полного дубля страницы станет действительно реальна. Мало того, плагин выводит ссылку на следующую или предыдущую страницу, в таком же, неподобающем виде:
Такие ссылки помечаются атрибутами:
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 и будет выводить ссылки на канонические страницы в подобающем виде и там, где они и должны быть.
Открываем файл 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); { 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_posts_url ( 'ID' ); $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" на тестируемых страницах и отписаться в комментариях.
Дополнение
Если требуется, чтобы в навигации canonical всегда указывал на первую страницу, то надо сделать следующее.
Строчка №87:
$link = trailingslashit($link) ."page/". "$mayak_page";
Изменить на:
$link = trailingslashit($link);
До встречи!
С уважением, Виталий Кириллов
Я решил отказаться от all in one seo pack )))
я мало чего понял, но понял что это нужно и круто, поэтому последую за маяком 🙂 Единственно только вопрос такой, у меня кроме all in one seo pack на блоге стоит еще и плагин WordPress SEO by Yoast, оба активны. Не помешают нововведения работе блога?
Андрей, одного плагина all in one seo pack вполне достаточно, просто снимите галочку в пункте «Канонические URL» и вставьте мою функцию в файл functions.php, что находится в папке с темой.
я знаю, что его хватает, но во втором есть такие фишки удобные, которые помогают еще до опубликования статьи проверить релевантность запросу. Не буду его удалять, попробую с двумя. Если что коряво пойдет отпишусь 🙂
Зачем так грузить свой блог.
Для интереса измерьте нагрузку плагинами.
Если Сео все в одном процентов 30 забирает то SEO by Yoas все 60.
Когда посещаемость до сотни то не страшно а когда под штучку каждый плагин нужно тестировать и проверять.
Виталий спасибо за функцию.
Сейчас работаю над статьей по подобной теме, обязательно упомяну вас.
Пожалуйста Федор! Рад Вас видеть на блоге!
Интересно, а как будет с постраничной навигацией комментариев. Некоторые этот тег canonical просто вырезают. А другие просто оставляют так, как в AIOSP. Все же хотелось бы чтобы одновременно не было дублей на другие страницы и одновременно, чтобы страницы типа comment-page2 имели свой тег на эту же страницу, а не на основную страницу с постом. В общем, тут с комментариями немного сложнее, поэтому приходиться выбирать что-то одно.
По логике вещей, во избежании возникновения дублей, в исходном коде страниц типа comment-page2, canonical должна быть помечена ссылка, ведущая на основную страницу с постом.
Тогда страница в индекс может не попасть.(((
Может в дальнейшем разработчики wordpress исправят этот баг с неправильной прописью ссылок на несуществующие страницы.
Виталий, после вставки функции в файл functions.php, сайт перестал работать. Все сделал как положено, сохранил изменения в файле, перехожу на сайт высвечивается урл в адресной строке и чистый лист. Убрал функцию, сохранил изменения, никакой реакции. Открывается только этот файл. что делать?
Евгений, я не могу сказать точно, где ошибка, но на белой странице обычно указывается путь до файла и номер строки, где обнаружена фатальная ошибка. В любом случаи, если Вы не очень в php, то перед редактирование файла надо делать его резервную копию. Если не исправите, можно будет сделать откат файлов на сервере.
Виталий сайт восстановил – вчера на хостинге делал бекап, сейчас все работает.
Виталий, может быть я неправильно внес функцию в файл? Я скопировал ее с вашего сайта в блокнот, а оттуда уже вставил через редактор в тему. правильно ли я поступил?
Евгений, скорее всего вы не так вставили функцию. Для редактирования файлов советую пользоваться ftp клиентом Notapad++.
Виталий, Ваша статья меня сподвигла проделать анализ моего блога на пердмет внутренних косяков и вот что я обнаружил с помощью проги netspeak spider. страницы lider-
ponevole.ru/page/
(2; 3; 4; 5; 6; 7) цифры в скобках это окончание урла страниц. То есть шесть непонятных страниц, скажите, это и есть дубли от которых надо избавляться?Андрей, это URL постраничной навигации сайта. Просто добавьте мета-тег robots на страницы пагинации.
Виталий, что такое страницы пагинации?
Пагинация (от лат. pagina — страница) — разбиение информации на страницы.
Виталий, я сделал полностью как написано у вас в статье мета-тег 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 страницы, но такой чистоты добиться сложно, поэтому с индексацией у Вас все в порядке.
Виталий, в моём плагине all in one seo pack не оказалось файла aioseop_class.php вместо него стоит файл aioseop.class.php (разница в нижнем подчёркивании) и в этом файле отсутствует строка $link = get_permalink( $post->ID ); вы с таким сталкивались? Может подскажете как мне сделать как у вас?
Андрей, у вас какая версия плагина установлена?
Версия 1.6.13.2
Андрей, плагины надо обновлять.
Виталий, в общем я довыделывался… гляньте пожалуйста на мой блог. На главной вроде всё нормально, но стоит кликнуть по заголовку любого поста, то исчезает сайдбар и футер. Откат файлов почему-то не помог, отключил все плагины, не помогло, не подскажете где причину можно поискать?
и комменты тоже не выводятся…
Андрей, напишите мне через форму обратной связи, я попробую помочь.
Здравствуйте, Виталий!
Спасибо за статью и предложенное решение проблемы.
Я так понимаю, применение предложенного Вами способа 4 делает бессмысленным способ 3.
P.S.
Похоже, Александр Борисов выявляет проблему, а рациональное решение предлагаете Вы )). Насколько я помню, так было и с проблемой с «replytocom».
С уважением, Гагик.
Здравствуйте Гагик! Конечно, после активации функции mayak_canonical() исправлять ошибку в плагине All in One SEO Pack, уже не имеет никакого смысла.
Получается так, что читатели сами меня информируют о насущных темах, которые их волнуют и по поводу статьи Борисова было очень много письм, поэтому я и решил написать пост.
Спасибо за ответ, Виталий.
С нетерпением жду новых статей.
С уважением, Гагик.
Спасибо за такой информативный (как и всегда, в общем-то, пост)! Представляю,с колько работы пришлось проделать. Но наверняка не зря. Я пошла по легкому пути — изменила плагин, хотя Ол-ин-Сео Пак мне больше нравился. Но совершенно нет времени во все эти тонкости вникать). Вообще в идеале надо сначала шаблон менять, а потом уже с плагинами разбираться. И, конечно, буду ваши инструкции использовать.
Добавил в закладки. Как будет время, поправлю.
Спасибо то, что нужно!
Еще такой вопрос: как избавиться от исходящей ссылки данного плагина?
Валерий, может я чего-то не знаю, о какой ссылке идет речь?
Имею ввиду плагин All in One SEO Pack выдает внешнюю ссылку если верить RDS bar. И еще один вопрос у меня вышла новая статья (есть в поиске уже) но блоге ее нет может проблема с плагином кеша? стоит настройка 24часа если я правильно понял кэш обновится через 24часа от последнего очищения и статья появится или нет?
Валерий, попробуйте просто обновить страницу и возможно статья появится. Вообще плагин должен быть настроен так, чтобы при добавлении новых текстов кеш обновлялся автоматически.
Вы ссылку в каком месте сайта обнаружили?
Приветствую, Виталий!
Дошли руки и до канонических ЮРЛов. Только вот ни правка в файле плагина, ни установка кодов в functions.php пока что ни к чему не привели. Все остается по-прежнему. И link rel=’prev’
И за link rel=»canonical» выдается та ссылка, по которой я проник на статью (к ЮРЛу я после слэша добавлял некое число, вставлял в адресную строку браузера).
Пока вернул все обратно, включая галочку в пункте Канонические ЮРЛы в настройках плагина.
Коды вставлял в самое начало functions
Здравствуйте Александр!
Не может такого быть, что-то Вы не так сделали, возможно кеш надо сбросить.
С кешем — возможно. Правда, я в разных браузерах смотрел. Буду пробовать снова. Правда, чуть позже.
Здравствуйте. Спасибо за код. Использую связку: сео-титл-тэг и вашу модернизацию ВП. Как в коде для functions.php оставить каноникал только для главной, категорий и страниц тэгов?
Здравствуйте Татьяна!
Получится такая функция:
Здравствуйте. Спасибо за вариант со вставкой в 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+ страниц тоже не хочется 🙂
Алексей, реализуйте постраничную навигацию, по моей инструкции, тогда все будет в порядке.
Успехов!
Здравствуйте, Виталий! У меня получилось следующее.
Правка кода в файле aioseop_class.php привела к тому, что при любых манипуляциях с добавлением некоей несуществующей страницы типа site/?243 в коде появляется ссылка на каноническую страницу (в данном случае — на главную).
При добавлении к адресу записи номера ее (тоже не существующей) страницы — типа site/category/article/111 — тоже появляется link rel=»canonical» со ссылкой на каноническую страницу.
Одновременно выводилась ссылка с атрибутом prev — на якобы предыдущую страницу этой самой записи. Ссылки с атрибутом next не было.
Тогда я добавил в functions.php Ваш код, эту ссылку устраняющий. Сработало — ссылка с атрибутом prev исчезла.
А вот второй код — функция вывода rel=»canonical» — почему-то работать у меня не пожелала. То ли я где-то ошибался, то ли в теме что-то мешает.
Но в принципе, вроде бы, вопрос решен. Только при очередном обновлении All in One Seo Pack, как я понимаю, изменения в его файле исчезнут
Здравствуйте Александр! Скорее всего все же где-то ошибка, функция должна работать, шаблон тут не причем.
Добрый день, Виталий!
Разбираться с тем, почему не работает код, пока руки не доходят. Пока оставляю все по-прежнему — отредактированный файл aioseop_class.php + Ваш код в файле functions.php, устраняющий ссылки на предыдущую и последующую страницы. Обновил только что плагин — сразу отредактировал файл.
Ссылка на каноническую страницу выводится замечательно.
Правда, Яндекс неведомо с какой дури взял да и проиндексировал сегодня две таких «страницы» — типа site/category/article/111. Хотя при переходе на них из Вебмастера, при просмотре кода виден link rel=»canonical» со ссылкой на каноническую страницу.
Это, конечно, результат моих проверок работы кода и результата редактирования файла в плагине. Да и по статьям, по цифрам я это вижу.
Вопрос такой — ждать, пока «само рассосется», или принимать меры? Функции «Удалить ЮРЛ» в Вебмастере Яндекса, в отличие от ГУГЛа, все равно же нет.
Не совсем точно выразился. Функция-то такая есть. Но, прежде чем удалять ЮРЛ из индекса, надо либо удалить статью, чтобы выдавалась ошибка 404, либо закрыть ее в robots.txt или мета-тегом robots
Александр, ошибки (глюки) у роботов тоже бывают. Проверьте, возможно вы где-нибудь оставили такую ссылку в качестве примера, пусть даже в текстовом варианте, но со своим доменом. Думаю, если такой страницы нет, то и дубля тоже не будет.
Нет, подобной ссылки я не оставлял нигде. Можно, конечно, попробовать прописать в Вебмастере эти ЮРЛы на удаление. В их коде есть атрибут rel=»canonical». Следовательно, и для робота подобных страниц в этих записях не существует.
По-моему немного надо выждать.
Виталий, скажите пожалуйста в последней версии All One Seo Pack данная проблема актуальна, требуются ли каки-либо из вышеописанных фиксов ?
Семен, насколько мне известно, разработчики All in One SEO Pack пока не удосужились исправить ошибку описанную в статье. Установите мою функцию и все будет в порядке.
Виталий, спасибо за ответ ! Последовал Вашему совету и установил функцию на свой блог, требуется Время для тестирования и подведения результатов работы функции, по возможности отпишусь !
А ёщё вопрос Виталий, как по Вашему мнению целесообразно ли устанвливать Вашу функцию плюс пдагин all one seo pack при условии, что галочка canonical будет снята на интернет магазин, построеннный на базе WordPress ???
Семен, функция служит дополнением к CSM WordPress и следовательно будет работать при любом шаблоне, будь то интернет магазин или другой функционал. Но в любом случаи надо все протестировать.
Виталий, как оставить canonical только для первых страниц категорий (я оставил canonical только для категорий)
Чтобы для domen/category/rubrika/page/2/, domen/category/rubrika/page/3/ и т.д. выводился rel canonical первой страницы domen/category/rubrika
Роман, извините, но я не могу переделывать код под желания каждого.
Я хочу вам сказать, на счет 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, разницы между одинарными и двойными кавычками нет.
Виталий, вот в статье «Правильная настройка плагина All in One Seo Pack»
/sozdanie-bloga/plaginy-wordpress/nastrojka-plagina-all-in-one-seo-pack.html
вы пишите, что «галочку» на канонические URL надо оставить.
А здесь все наоборот.
Или я неправильно поняла?
Я кажется, теперь разобралась, поискав и почитав информацию про то, что такое Канонический url.
Теперь понятно: в AiOSeo мы должны выбрать в качестве канонической стр. ту, которую мы считаем нужной, а для php-файла уже идут добавки к плагину, которые вы доработали.
Теперь я правильно поняла, да?
Жаль, что нельзя редактировать свои комментарии.
Еще раз перечитала вашу замечательную статью и решила для себя, что мне пока достаточно использовать
Способ №3. Исправить ошибку в плагине All in One SEO Pack (рекомендуется)
————
что я и сделала.
спасибо вам.
Не забудьте обновить изменения после обновления плагина. А почему не в functions.php?
Егор, вы не внимательно читали статью. Обновлять изменения надо только, если эти изменения были произведены в файле плагина.
Я про плагин имел ввиду. Ну и если тема не дочерняя, то лучше все изменения комментировать.
Здравствуйте, спасибо за отлчную функцию.
У меня вопрос немного не по теме, вы не знаете как убрать двойной тайтл? Вот привожу с главной. Дело не в плагине. Не могу понять где может генерить двойной тайтл?
<title>ААвто-Мастер | Кузовные работы / ШиномонтажААвто-Мастер | Кузовные работы / Шиномонтаж</title>
Здравствуйте Егор, бывает что разработчики шаблонов прописывают свои функции для вывода title. Ищите в файле functions.php функцию, где есть упоминания о функции wp_title и удалите эту функцию целиком, тогда проблема отпадет.
Виталий, спасибо большое за такой быстрый ответ на мой вопрос. Ваш ответ на комментарий застал меня за удалением функции вывода тайтла из файла functions.php. Проблема решена. А так подумал, конечно, скорее всего в functions.php вывод реализован, вот и дублируется. Кстати, не в первой теме замечаю это недоразумение. Есть подозрение, что эта функция является обязательной, для размещения темы в репозитории WP. Потом проверю плагином THEME CHECK. Еще раз спасибо!
Не нравится мне то, что из-за этого canonical в индексе только первая страница рубрик (у меня рубрики открыты для индексации). Можно ли как-то сделать так, чтобы все страницы рубрик не отсылали к первой, ведь они все разные.
Выражусь точнее. Как запретить пагинацию канонических URL для статей и страниц, но не запрещать для рубрик и страниц вида /page/номер страницы/.
У вас это сделано (судя по исходному коду страницы). Но у меня сео пак либо разрешает все либо запрещает все.
Дмитрий, установите мою функцию и снимете галочку в настройках плагина All in One SEO pack, в разделе «Канонические URL».
Все прекрасно заработало. Спасибо.
Разработчики сео пака хоть и решили проблемы с этим тегом, но не сделали гибкой настройки.
Без этого получается, что яндекс выкидывает из индекса все страницы рубрик кроме первой, а в вебмастере ошибки начинает рисовать (якобы документ запрещен в роботсе)
Спасибо, действительно есть такая проблема и я даже написал о ней разработчику 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? Если это так, то сделать это можно следующим образом:
Да, именно это имел ввиду, просто не дописал. Я удалил указанные две строчки:
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, ссылка в коде осталась. Версия плагина — последняя. В принципе, удалить руками указанные мною две строчки — не проблема, просто можно забыть это сделать, только вот робот таких ошибок не забывает. В общем, неудобно.
Благодарю! Еще один способ отказаться от использования ASP и перейти на SEO ULTIMATE. В последнем есть возможность управлять индексацией отдельных категорий и тегов, что немаловажно для меня. А вот с каноническими урлами там беда — использую ваш способ!
Пришлось переделать Ваш код немного под себя.
$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. Тогда уж дублей не создастся точно.
Или я не прав ?
Запрещать индексацию лучше мета-тегом robots.
Подскажите как быть если на страницах архивов в вордпресс в каноникале не правильно отображается дата. Т.е. имеем канинокал: ?m=201510 а НАДО: ?m=201410. И на всех страницах архивов прописан один и тот же каноникал ?m=201510
Все так просто оказалось, поправил плагин, все хорошо стало. Это кстати я растолковал проблему Александру Борисову правда он меня не упомянул в своей статье что как то немного обидно хотя и писал что упомянет…
Здравствуйте.
Совместно с плагином СЕО ультимайт стоял плагин Robots Meta. После вышеописанных манипуляций его можно отключить?
Здравствуйте Сергей! Насколько я понимаю плагин Robots Meta выводит мета-тег robots. Думаю прежде чем отключать данный плагин советую ознакомится с этим материалом.
Спасибо за удивительно быстрый ответ!
Статью прочитал, функцию указанную внизу статьи вставил, галки в Настройках индексирования All in One SEO Pack убрал. Насколько я понял, теперь Robots Meta точно не нужен?
Да, можно отключить.
И спасибо за предыдущую ссылку. Заодно прочитал про «сопли» гугла, посмотрел у себя, увидел в RDS на своем сайте «Индекс G:186 (5%)» и ужаснулся. А то все думал, почему гугл мой сайт стороной обходит…
блин, как бы еще понять о чем вы разговариваете! :))
Это я все в кучу понаписал, что интересного нашел, блуждая по Вашему сайту )))
Виталий, сейчас в обновлённом плагине появилась настройка «Запретить пагинацию для канонических 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/
. Неужели нельзя сразу нормально разобраться с проблемой?По Вашему нормально это как?
Давно не обновлял плагин All in One, обновил.
Всё нормально, но обнаружил, что каноническая на главной теперь пишется со слешем на конце http://site.ru/, а раньше было без слеша, у меня вообще идёт переадресация на главную без слеша.
Вроде бы мелочь, но почему так и как исправить не могу найти
А что в этом страшного? Ну и пусть будет слеш на конце, это ни на что не влияет.
Здравствуйте! попробовал на своем сайте добавить /?abc к урлу В коде страницы rel_canonical() выдает без /?abc Попробовал удалить плагин All in One SEO Pack и посмотреть В коде страницы rel_canonical() выдает без /?abc Почему так получается? Это результат обновления вордпресса до последней версии или обновленный плагин? в таком случае почему без него в коде страницы rel_canonical() выдает без /?abc
Здравствуйте Алексей! Это результат обновления плагина, писал об этом в комменте выше.
Виталий, напишите пожалуйста Ваше мнение. Решит ли все проблемы плагин Yoast SEO для WordPress? А то, как видно из комментариев, с плагином All in One SEO Pack много проблем. Некоторые блогеры считают его (Yoast) лучшим и очень рекомендуют, особенно на молодых сайтах?
Спасибо.
Здравствуйте Елена!
Плагин Yoast SEO используют многие, хороший плагин. Но и All in One SEO Pack тоже неплохой продукт. Я использую All in One SEO Pack довольно давно, были конечно проблемы, на сейчас все они устранены. Само главное его правильно настроить. В любом случаи Вам решать, какой продукт выбрать.
Виталий, спасибо, что отвечаете на все вопросы. Я Вам очень благодарна за это.
По поводу ошибочного проставления адреса страницы. Могут (как в моём случае) специально (используя метод негативного SEO) проставлять неверные ссылки на страницы сайта. Причём добавляют не через знак «?», а через знак «&» набор символов. И тогда, атрибут rel=»canonical» не помогает, отдаёт ошибку 404. Кстати Ваша страница сайта при таком запросе, тоже выдаёт ошибку 404, можете проверить seo-mayak.com/seo-prodvizhenie/tonkosti-prodvizheniya/skvoznye-ssylki.html&sa=U&ved=0ahUKEwiio_PEwLjJAhUJz3IKHVMpAjEQFgghMAI&usg=AFQjCNFRbxvmZL9GmUuIpfyrppR2FuJEGg
Вроде бы то, что выдаёт ошибку 404 неплохо. Но неизвестно, как эту ошибку буду учитывать браузеры-поисковики, не понизится ли в последствии рейтинг основной страницы (из-за недоступности 404)
Бывает, что поисковики непонятно где индексирует битые ссылки, о которых вы упомянули в своем комментарии. В любом случаи такие урлы не имеют никакого отношение к основной странице и я не думаю, что современные аналитические технологии поисковых систем не смогут разобраться в такой ситуации.
Здравствуйте, а сейчас данная функция актуальна? Плагин обновился уже раз 10-15 за это время.
Здравствуйте Егор! В одном из вышедших обновлений была добавлена опция «Запретить пагинацию для канонических URL», которая решает описанную в статье проблему. Но! Функция актуальна в любом случаи, более того, в ближайшем будущем я ее дополню. В функцию будет включен вывод атрибута canonical для так называемых пользовательских типов записей, о которых я в данное время готовлю пост.
Извиняюсь, если вопрос глупый))
Можно ли обновлять плагин, если была проведена доработка по Вашей статье?
Сергей, Вы имеете в виду мою функцию или доработку кода в самом плагине?
Ну с функцией-то думаю ничего не случится, а вот здесь все слетит?
В текстовом редакторе 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’);
Ее по-прежнему можно оставить, и никаких галок в настройках индексирования плагина после его обновления проставлять по-прежнему не надо?
Спасибо.
Здесь ничего менять не надо, никакие обновления на функцию не влияют.
Как сделать каноническую ссылку только для главной? Можете дать код для файла functions.php ?
Все понятно. Спасибо. Но ведь после каждого обновления плагина нужно править файл плагина и functions.php. Но ведь можно забыть.
Николай если вставить функцию, тогда никакой зависимости от обновлений не будет. А править файл плагина уже не надо, в плагине исправлена ошибка, об этом я писал в комментариях выше.
Но ведь при обновлении темы functions.php тоже изменится.
Все верно! Я не пойму в чем трудность, ведь в плагине All in One SEO Pack проблема с canonical давно решена и если вы опасаетесь вставлять функцию, тогда просто активируйте в плагине соответствующие опции.
Присоединюсь в вопросу. А можно при вставленной функции активировать опцию и в плагине, или нужно чтобы было или то, или другое? А то вдруг опять какие изменения в плагине будут, и чтобы больше не обращаться к этому вопросу.
Сергей, если использовать оба варианта, то в коде будет два атрибута canonical, что конечно нежелательно. Вы уж выберите один из вариантов.
Классно у Вас реализовано плавающее содержание статьи справа от текста))) Можете поделиться секретом, как можно такое сделать на своем сайте? ))
Респектище Автору!Будучи полным чайником в SЕО технологиях смог понять и разобраться, что от куда и куда с «Канонические URL’ы». Остался несколько вопросов :Ссылаясь на вопрос Татьяны»Здравствуйте. Спасибо за код. Использую связку: сео-титл-тэг и вашу модернизацию ВП. Как в коде для functions.php оставить каноникал только для главной, категорий и страниц тэгов?»Нужно ли мне вставлять Ваш движок ещё куда-то кроме файл functions.php?Должна ли строка»Пользовательский канонический URL» в описании каждого товара оставаться не заполненной?За ранее спасибо,Виталий.
Здравствуйте Геннадий!
1. Функцию надо вставлять только в один файл functions.php.
2. А как же архивы? Не думаю что надо рвать функцию
3. Поле «Пользовательский канонический URL» заполнять не надо.
Ещё раз спасибо Виталий!
Скорее всего у меня на сайте это от плагина All in One SEO Pack , я его удалил и поставил Yoast SEO.
Но страницы почему то не уходят.
Огромное спасибо Виталий за такую функцию, а то у меня в Яндексе уже 5 нормальных статей с rel-«canonical», а потом еще больше нарастет.Удалила все большие плагины SEO и поставила этот — Sewn In Simple SEO, маленький и легкий, без лишних функций. Надеюсь, что ваш код будет кстати, у меня и ваш запретительный метатег стоит, как раз над ним и встала новая функция.
Виталий, по вашему опыту, через сколько времени может исчезнуть rel=»canonical» в коде сайта. Я установила ваш код в файл функций примерно неделю назад, но пока все без изменений.
У Вас вроде все работает.
Прекрасная статья, спасибо.
Виталий, я написала в поддержку Яндекса по вопросу link rel= «canonical». Есть некоторые изменения, я то их не заметила. Сейчас в коде, рядом с этим атрибутом, пишется адрес статьи и индексируется. Меня отправили по этой ссылке, я прочла и успокоилась.
yandex.ru/support/webmaster/controlling-robot/html.xml#canonical
.Почему у меня не появляется canonical категория магазина на воокумерц? вставил код как вы сказали в категориях магазина ничего нет, в товаре есть, как код допилить?
Виталий приветствую! Писал тебе, через форму обратной связи, но почему то ответа так и не дождался. Подскажи пожалуйста, пользуюсь твоим кодом rel=»canonical», хочу использовать пагинацию комментариев, но ссылки имеют вид ваш.сайт/comment-page-1/#comments, как сделать, что бы канонической на всех страницах пагинации комментариев была основная ваш.сайт/укеуекуе/ а не comment-page-1/#comments?
Здравствуйте Сергей, К сожалению у меня нет готового решения! Если как-нибудь столкнусь, напишу в комменте.
Жаль, но всё равно спасибо за ответ, буду ждать, может будет решение.
Виталий!
У меня в коде два
<link rel="canonical"
Подскажите, что сделать?
Николай, видимо у Вас canonical еще плагином выводиться. Смотрите настройки плагина.
Мне, что в All in One SEO Pack убрать птичку в canonical URLs или нет?
Да, уберите галочку с данного пункта.
Виталий привет! Если я не использую плагин All in One SeoPack, будет ли актуальна твоя функция, в конце статьи, для защиты от дублей?
Функция актуальна, я сам ее использую, но другие SEO плагины также могут выводить canonical, поэтому надо учитывать это и не допускать дублирование атрибута.
Добрый день.
Сделал все как описано в Вашей статье, но теперь на странице
мойсайт.ру/page/3
и т.п. каноническая ссылка выводится на саму себя, т.е. страницу пагинации, а не на первую. И вставив указанный выше код я не избавился от rel=’prev’ и rel=’next’. И я не знаю куда копать)В случаи с постраничной навигацией, считаю такой подход правильным, ведь это любая страница пагинации — это уникальная страница. Возможно prev и next у Вас выводится самим WordPress, тогда ответ здесь.
Спасибо за 4 способ, я его еще доработала, чтобы тег добавлялся для категории продукции в woocommerce, теперь на всех страницах есть canonical.
кому нужно:
я вставила код после is_category()
Спасибо Марина за дополнение. Я сам не пользуюсь woocommerce, но уверен, что многим ваш код пригодится.
Все забеспокоились, потому, что Яндекс вебмастер стал выводить в «исключенных страницах» не канонические урлы. На моем сайте про дачу,количество таких адресов быстро выросло до 150 — практически весь сайт. Установила простенький SEO плагин, который ни на что не влияет, только заполняем строки с заголовком статьи и описанием.
А главное скопировала ваш код и вставила его в файл функций. Примерно через полтора месяца уже есть положительный результат. В неканонических урлах появилось перенаправление, и они потихоньку в индексе уменьшаются. Так что обоснованное спасибо, Виталий, за вашу статью.
Добрый день! У меня есть форум, который создано с плагин mingle forum. Все нормально, но одна проблема есть (((. Страницы форума не индексируется. Я искал решение и нашел такие рекомендации. Многие советуют, убрать канонические ссылки. Но я не могу найти этих ссылки. Как можно решить данную проблему?
Здравствуйте! Атрибута canonical в исходном коде я не нашел, но вот такой линк shortlink точно лишний, так как всегда ведет на главную страницу форума:
Как избавиться от данного линка читайте здесь.
Спасибо за ответы! Но у меня вопросик еще, тогда я должна вставить только этой код?
remove_action( ‘wp_head’, ‘wp_shortlink_wp_head’, 10, 0 );
Вообще я в статье советовал подчистить область head от лишних линков, у вас там и версия WordPress выводится. Сами смотрите, что вам надо, а что нет.
Ага ладно, я вставил коды, теперь жду. Спасибо вам большое!
Скажите- статья по сей день актуальна с сегодняшним вордпресом ?
Проблема в том что яндекс выкинул большое количество страниц с «документ является неканоническим» .
Если Вы про функцию, то да, она актуальна.
Здравствуйте, у меня на сайте есть форум
powercoup.by/forum.html
и он проиндексирован роботами, но другие страницы форума не попали в индекс, подскажите как быть в этом случае?роботы ругаются что этот документ является неканоническим.
пример:
powercoup.by/forum.html?view=forum&id=15
powercoup.by/forum.html?view=forum&id=16
Дмитрий здравствуйте! Атрибут canonical в исходном кода данных URL указывает на главную страницу форума, а должен вести на туже страницу. Думаю проблема в функционале вывода canonical. Готового решения у меня нет, гуглите, может что отыщите.
Приветствую! Полезная статья! Добавил на один из сайтов код для вывода canonical, но есть вроде небольшой баг, возможно это особенности моей темы! На страницах меток в исходном коде канонический адрес прописывается со слэшем, а в строке браузера без него. Проверяя спайдером находит дубли, благо метки закрыты от индексации. Хук пока я порезал, до выяснения причины. В чем может быть дело?
Здравствуйте! Уберите строчку с вызовом функции trailingslashit(), она добавляет слеш в конец URL.
Здравствуйте, Виталий!
Вношу изменения в тему Вордпресс (на тестовом поддомене). Никак не встает Ваша функция для вывода атрибута canonical. Просто отказывается работать блог, и все!
Но в итоге обнаружил следующее. Если в настройках плагина All in One SEO Pack (самая свежая версия 2.3.4.2) поставить галочки «Канонические URL» и «Запретить пагинацию для канонических URL», то в итоге получаем в коде атрибут rel=»canonical» со ссылкой на каноническую страницу.
При этом вносить изменения в файл aioseop_class.php не требуется.
Правда, функцию удаления ссылок с атрибутами prev и next нужно оставлять, иначе выводит ссылку на prev.
Здравствуйте Александр! Да, проблему закрыли, я об этом уже писал в комментариях выше, но функция рабочая в любом случаи. Значит у Вас в шаблоне дело.
Возможно, и в шаблоне. У меня в действующей теме блога именно эта функция работать отказалась. Так что ли тема, или «сглаз» ?-)
Добрый день! Поставил на сайт плагин форума (Asgaros) — в нем страницы без ЧПУ, добавил в All in One SEO Pack в исключенные страницы /forum, но форум не индексируется, в Яндексе пишется, что «документы являются неканоническими».Не подскажете, как это исправить?
Здравствуйте! Все верно, выше в комментариях я уже писал, что на всех страницах форума почему-то стоит атрибут canonical с ссылкой на главную страницу форума. Поэтому другие страницы, кроме главной, робот считает неканоническими.
Выполнил 3 способ, т.е. исправил ошибку в плагине.
Результата нет, для каких-то страниц конечно работает, но не для всех.
Как быть в таком случае?
Булат, в плагине проблема уже давно решена и нет смысла редактировать код. В комментариях я уже об этом писал, поправить статью руки не доходят.
Добрый день. Не пойму, в чем проблема, вставляю вашу функцию через ноутпад. галочку снял в сео паке. Выдает ошибку: 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);»
Спасибо Андрей! Непонятно, как там этот знак появился, видимо случайно. Уже поправил.
Добрый день, Виталий! У меня стоит плагин 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/ сразу перенаправляет на верный канонический адрес.
Удачи!
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 в них обернуто? Смысл в них какой?
А вот это что такое?
$mayak_date_link = get_month_link(substr($m, 0, 4), substr($m, 4, 2));
$mayak_date_link = mayak_link_paged($mayak_date_link);
Почему не написать одним оператором тоже самое?
Ты что не видишь это галимая реклама, а ещё он хочет доказать всему миру, что код сделал именно он.
Я удивляюсь людской сущности.
Один хочет набрать очков, ища ошибки в работающей функции. Конечно некоторые моменты можно упростить, но это не значит, что функция корявая.
Второй видимо сам вообще в php ничего не смыслит, раз считает, что функции с неба берутся и я пытаюсь что-то кому-то доказать.
Что же Вы сами такую функцию не разработали, а пошли искать в сеть?
Здравствуйте, Виталий!
Спасибо за функцию.
Вы не подскажите как можно сделать уникальный description каждой страницы при пагинации, хотя бы добавить как в title добавляется «Страница — 2,3» при работающем Seo Pack? Как я понял All in one seo pack где-то на уровне функции перехватывает описание рубрик/меток и публикует в своём контейнере описания. Вот в него бы как-то и поместить.
Буду благодарен за ответ!
Виталий, добрый день!
Подскажите, пожалуйста, как можно сформулировать запись генерации канонического url в исходном коде, чтобы каноническими автоматически указывались страницы по протоколу https, включая внутренние страницы?
Например, если заходишь на страницу сайта по протоколу http, то в исходном коде канонической указывается соответствующая страница, но по протоколу https. Ну и поисковики также сразу же видели, какой протокол приоритетный.
Что-то типа такого: <?if($REQUEST_URI$=$ENTRY_URL$)?><?else?><link rel="canonical" data-link="$ENTRY_URL$"/><?endif?>, наверное.
Возможно ли это?
Заранее благодарен за ответ!
С уважением,
Владимир
У меня ваш код ничего не изменил. Открывается несуществующая страница и в ее коде две ссылки. На каноническую и несуществующую. Убирал в плагине галочку с канонических и ставил обратно, результат один, две ссылки.
All in One Seo Pack конфликтует c PageNavi. При активном Seo плагин Navi не работает, после деактивации постраничка откликается. Не подскажите причину?
А как быть с пагинацией, если куча товаров в магазине на woocommerce?
Ведь атрибуты next/prev понимает только гугл, а яндексу они по барабану.
Атрибуты noindex/nofollow закроют содержимое страниц от индексации.
А сanonical будет вести только на 1 страницу.
Че делать то?
Открывать индексацию страниц пагинации в интернет-магазине совершенно не нужно, даже вредно.
Объясните чайнику, что плохого в дополнительных страницах индекса?
У каждого товара есть на странице категории краткое описание, следовательно там будут не только ссылки с картинками, но и контент, различающийся на каждой странице!
В рамках комментария всего не объяснишь. Ну например, заголовок title какой у второй и последующей страницы будет? А description тоже будет различаться на каждой странице?
ALL IN SEO PACk не использую, SEO BY YOAST лучше. Канонические ссылки настроил через этот плагин.
Приветствую! Делаю с нуля новый сайт. В прошлых версиях вордпресса код работал без проблем. В новой версии wordpress(4.7.3) выдает такую ошибку — Notice: Функция get_author_link с версии 2.1.0 считается устаревшей! Используйте get_author_posts_url(). in и т.д. Эту ошибку не видно по всему сайту, кроме страницы автора. сайт.ru/author/ник
Нашел для себя решение такое — заменил только одну строку Вашу
$mayak_auth_link = get_author_link(false, $userid, $cache_userdata[$userid]->user_nicename);
на
$mayak_auth_link = get_author_posts_url(get_the_author_meta( ‘ID’ ));
Ошибка исчезла, все в порядке. Интересуюсь — правильно ли я код изменил? Или лучше код можно соорудить? Буду признателен за подсказку.
Здравствуйте Алексей! Вроде все правильно. В функции ошибку поправил.
Приветствую Виталий.
Раньше не обращал внимание, после прочтения, заглянул на свой сайт и хочу спросить: как убрать слеш на главной, чтобы было вот так: , а не так
Где это настраивается, и в адресной строке и в роботс без слеша, а canonical добавляет слеш, пробовал через .htaccess, не помогает, удалял плагины, оголял .htaccess до первоначального, из коробки, не могу разобраться, второй день изучаю, пролистал блоги, у всех все единообразно, только у меня слеш в canonical. При наведении на ссылку в левом нижнем углу ссылка без слеша и при нажатии открывается страница без слеша, откуда она в canonical.
Здравствуйте Михаил!
Скопируйте функцию заново, я поправил некоторые шероховатости, в том числе убрал слеш.
Спасибо, на страницах пагинации все поправилось, но на главной canonical нет, видимо структура шаблона такая.
У меня такая функция была. На главной не каноникал. Заменила $canonical_url = get_permalink( $post ); на return false;. Поставила галочку в Платинум сео. Вроде все ОК.
Нужно попробовать Вашу функцию.
Спасибо за Ваш ум и статьи.
Хм… чтобы включить Вашу функцию, нужно свою отключить… Как сделать, не понятно. Если включить только маленькую функцию для главной… С ходу не получилось. Оставлю пока, как есть.
Здравствуйте Наталья!
Можете просто закомментировать свою функцию, так:
Чтобы использовать только «маленькую» функцию для главной, надо вставлять так:
Здравствуйте, подскажите, пожалуйста, как сделать, чтобы каноникал на главной выводился как
site.ru/
со слеш «/» в конце, но на постраничной навигации главной страницы выводился без слешsite.ru/page/2
Вставки canonical в остальные части сайта в вашем коде устраивают.
Здравствуйте!
После 18 строчки сделайте еще одну строку и вставьте туда следующее:
Здравствуйте, Виталий , скажите пожалуйста жто тема еще актуальная? После добавления link = get_permalink( $post->ID ) на $link = rel_canonical() если разработчики плагина обновляет его не пропадет $link = rel_canonical() опять на link = get_permalink( $post->ID ). Еще вопрос этот код Ваш? там написано слова как mayak точь в точь как и название Вашего блога, это не повлияет на позиции? или не будет считать это ошибка? За ранее Вам спасибо.
Здравствуйте Андрей!
В настройках плагина добавили опцию «Запретить пагинацию для канонических URL», которая решает описанную в статье проблему.
Что касается моей функции вывода каноникал, то она актуальна.
Здравствуйте Виталий.
Подскажите пожалуйста
на главной странице сайта выведена страница категории, в коде прописан релканоникал сайт.ру
Но есть дубль страницы этой категории, что выведена на главной сайт.ру/категория/шторы в коде релканоникал выведен сайт.ру/категория/шторы как его можно заменить на сайт.ру ?
Здравствуйте Алексей! Чтобы ответить на Ваш вопрос, необходимо видеть всю картину, т.е. каждая тема имеет свои особенности и мне надо видеть код целиком. К сожалению с ваших слов я ничего Вам посоветовать не могу.
Виталий, буду признательна, если поможете.
Есть сайт с www и без www. Основной домен нужен с
www. Сайт не на wordpress. В панели webmaster не удается выбрать предпочтительный доменю Выдает coобщение: «Part of the process of setting a preferred domain is to verify that you own мойсайт/. Please verify мойсайт/.»
Прописать редирект нет возможности. Caйт хостится на Windows.
Вопрос: можно ли использовать rel="canonical" для указания предпочтительного домена.
Спасибо
Здравствуйте! Я использовал Ваш код и столкнулся с такой пробдемой. На странице которая выводит записи canonical указывает на главную. Как сделать так, чтобы указывал на текущюю страницу?
Здравствуйте!
В смысле, с любой страницы ведет на главную?
Я не говорил что с любой страницы. На странице с записями (архивная страница) каноникал ведёт на главную, то есть ссылка moisait.com/blog а каноникал moisait.com,а должен быть moisait.com/blog
Извините, не правильно Вас понял.
Попробуйте в строчке №16 заменить is_home() на is_front_page().
Здравствуйте!
А как справится со следующей проблемой: главная сайта статична и соответственно имеет адрес site.ru, но в индекс Яндекса полезли дубли главной по адресам site.ru/page/1 (2, 5…85) и при этом canonical у них прописан не главной страницы, а именно такого вида site.ru/page/1 (2, 5…85).
В function прописана функция от Маяка (4 способ)
Как справится с этой проблемой?
Антон, здравствуйте!
Вообще пагинацию надо закрывать от индексации мета-тегом robots.
Если у Вас статичная страница, то попробуйте в строчке №16 заменить is_home() на is_front_page()
Спасибо, Виталий!
Но не помогло. Дело в том, что мне не подходит закрытие пагинации — на них по НЧ трафик какой-никакой идёт? да и вообще это «Спор десятилетия» у Seo’шников. А вот проблема с дублем главной впервые полезла, Яндекс где-то цепанул, тем более, что там prev-next.
Пришлось в строчке №16 заменить is_home() на if (is_home() && !is_paged()), плюс закрыть в роботсе: Disallow: /page/*
Конечно, если бы можно было как-то туда мета-тег robots пристроить без врезки в основную пагинацию, то я был бы счастлив.
Здравствуйте! Использую ваш скрипт и есть одby момент, нужно чтобы на гнлавной странице в canonical url отображался без слеша «/», я уже пробовал удалчть строку с trailingslashit($link) (строка 87) как писал автор, но и это не помогло, есть еще варианты? Буду признателен за подсказку.
Стас, здравствуйте!
Приведите функцию прямо в комментарии, в том виде, в каком она у Вас сейчас.
Я посмотрю, что не так.
Можно ли использовать тег canonical для продвижения основной страницы (например, определённой услуги), вставляя его на страницы блога, в которых публикуется контент под различные запросы на эту услугу?
Нет
Народ, может кто сталкивался, нужно поменять структуру линка для пагинации с moj-sajt/page/2 на moj-sajt/page-2. То есть, нужно сделать не через слеш, а через дефис.
Подскажите пожалуйста как вызвать фуннкцию, пускай, на всех страницах (index.php, archive.php, page.php и т.д.), но там где есть пагинация каноническая ссылка ведёт на первую (my_webpage.com/page/2 -> my_webpage.com/ )? (не так как код указанный в статье)
Бесполезная функция когда страницы пагинации выводят canonical сами на себя. Как исправить?
Строчка №87:
Изменить на:
Спасибо, помогли!