VovkDesign

Блог Александры и Владимира Вовк

RSS лента
wp-puzzle

Дубли replytocom — как удалить и откуда они появляются?

Буквально пару дней назад в процессе работы над блогом выяснилась одна весьма интересная вещь. Раздумывая, как бы вообще убрать с блога WordPress ссылки с replytocom и предотвратить появление страниц-дублей в поиске, я нашла идеальное для себя решение без необходимости отключать древовидные комментарии. Дальше постараюсь все разложить по полочкам и подробнее рассказать обо всем.

проблемы с проблемы replytocom

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

Откуда появляются дубли с replytocom

Если в настройках WordPress включены древовидные комментарии, то после текста сообщения мы можем видеть ссылку Ответить примерно с таким адресом:

пример ссылки с replytocom

Содержимое этой страницы не будет отличаться от страницы с адресом http://blog.com/adressposta.html. На картинке кроме основного адреса видим два выделенных блока — параметр запроса и якорь. Последний — дает возможность сразу после загрузки страницы перейти к форме комментирования.

Параметр запроса — наш replytocom со значением 74. Для каждой ссылки указывается уникальное число — идентификатор комментария. Если на странице записи будет 20 комментариев, то автоматически сгенерируется 20 разных ссылок. По каждой перейдет робот и проиндексирует как отдельную страницу блога, которую потом и пометит как дубль.

к оглавлению ↑

Способы борьбы с replytocom

В блогах веб-мастеров можно встретить несколько советов по поводу избавления от таких страниц-дублей.

В Google все просто — в вебмастере есть настройка Параметры URL в разделе Сканирование — там можно указать, чтобы робот не сканировал страницы с параметром ‘replytocom’ в запросе.

настройка replytocom в Google

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

  1. Закрыть от индексации страницы с replytocom можно, добавив в robots.txt строчку:
    Disallow: /*?replytocom

    Отредактировано 08.07.2014
    Добавление URL в robots.txt только ограничивает доступ к странице, но поисковиком она все-равно учитывается. Вместо этого в случае с replytocom нужно:
    1. В robots.txt не добавлять никаких ограничений;
    2. Настроить канонические ссылки с помощью любого SEO-плагина.
  2. Перенаправление в .htaccess настраивается добавлением двух строк в начало файла:
    RewriteCond %{QUERY_STRING} (replytocom=)
    RewriteRule ^(.*) $1? [R=301,L]

До недавнего времени я закрывала эти страницы в robots.txt и настраивала перенаправление в некоторых случаях.

к оглавлению ↑

Зачем нужна ссылка с replytocom?

Параметр replytocom сообщает вордпресу номер комментария, на который мы хотим ответить (назовем его «родительским комментарием»).

Если в браузере пользователя включен JavaScript, то номер родительского комментария запишется скриптом в специальное скрытое поле и будет передан вместе с вашим именем, почтой и сообщением. А вот если JavaScript отключен, на помощь приходит ссылка с параметром replytocom. Тогда уже она и передает номера родительского комментария через строку запроса.

Выходит, ссылка с параметром replytocom нужна когда в браузере отключен JavaScript. Вот как все это работает:

  1. Нажимаем на ссылку Ответить
  2. Если JavaScript включен, то срабатывает скрипт — он записывает номер родительского комментария в скрытое поле, перемещает форму комментирования прямо под родительский комментарий и запрещает перейти по ссылке (перезагрузка не происходит как при обычном клике на ссылку — это заслуга скрипта).
  3. Если JavaScript отключен, то происходит обычный переход по ссылке http://blog.com/adressposta.html?replytocom=74#respond, где параметр replytocom=74 сообщает номер родительского комментария, а якорь #respond прокручивает страницу к форме комментирования.
НО! Если в .htaccess настроено перенаправление с replytocom, то в пункте 3 мы попадем на страницу http://blog.com/adressposta.html#respond — к форме комментирования страница прокрутится, но номер родительского комментария вордпресу мы так и не сообщим.

Отсюда вопрос: зачем тогда вообще эта проблемная ссылка с replytocom нам нужна?

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

к оглавлению ↑

Как убрать ссылку с replytocom

Чтобы вместо ссылки с параметром вывести просто якорь на форму комментирования, я воспользовалась фильтром для функции comment_reply_link. В качестве параметра WordPress передает пользовательской функции HTML-код ссылки. Регулярным выражением нахожу в строке кода атрибут href с ссылкой и заменяю ее на якорь. Вот моя функция:

add_filter('comment_reply_link','avd_custom_comment_reply_link');
function avd_custom_comment_reply_link( $link ) {
    $link = preg_replace( '~href=([\'"]{1})([^\'"]+)#([^\'"]*)([\'"]{1})~i', 'href=$1#$3$4', $link, 1 );
    return $link;
}

Учитывая, что по-умолчанию в WordPress блок с формой комментирования имеет якорь respond, третью строку можно и вовсе так записать:

$link = preg_replace( '~href=[\'"]+([^\'"]+)[\'"]+~i', 'href="#respond"', $link, 1 );

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

Этот код вставляем в function.php нашей темы и проверяем адрес ссылок Ответить в комментариях. С JavaScript они будут работать как и прежде, без него — просто «перескакивать» на форму комментирования.

ВАЖНО! Такой подход избавит от дублей с replytocom для новых страниц. А вот с теми, которые уже попали в индекс нужно бороться.

к оглавлению ↑

Теперь никаких replytocom!

Думаю, для SEO-оптимизации своих шаблонов дальше я буду использовать именно такой подход в борьбе с replytocom в WordPress. Потеря в функционале совсем мизерная (а как вы считаете?), а искоренение дублей в зародыше — огромный плюс. Метод сейчас настроен на нашем блоге, ждем индекса новых статей с комментариями. Но редирект все-таки пришлось настроить, первые статьи проиндексировались с replytocom 🙁 .

Альтернативное и радикальное решение — подключение к блогу системы комментирования Disqus или Cackle Комментарии, но это уже отдельная история.

свобода!

Комментарии всего: 36

  • Александра,так я не совсем понял,добавление строчки в файл robots не помогает?

    • Игорь, добавление в robots.txt закроет от индексации эти страницы — т.е. они будут и в вебмастере покажутся как исключенные. Я же задалась целью исключить появление этих ссылок, чтобы не приходилось затем их закрывать или перенаправлять. Этот способ особенно хорошо для новенького блога.

      • Спасибо,сейчас попробую сделать как вы обьяснили!

      • Александра, «подводных камней» указанного кода не обнаружилось за время использования? )
        И еще вопрос: Вы написали, что третью строку кода можно заменить упрощенной записью вида "$link = preg_replace( '~href=[\'"]+([^\'"]+)[\'"]+~i', 'href="#respond"', $link, 1 );". Можно смело её использовать или всё-таки надежней будет первый вариант?

        • Сергей, за это время никаких подводных камней не обнаружила — все отлично работает. Если у вас в файле темы есть вызов функции comment_form(), то да — можно смело пользоваться упрощенной записью.
          Кстати, недавно ознакомилась с популярным плагином WordPress SEO by Yoast — там используется подобный подход, но якорь ставится не на форму комментирования, а на сам комментарий.

          • Александра, после вставки кода вроде как все работает — механизм комментирования не изменился, replytocom не появляется. А в каком файле смотреть есть ли вызов функции comment_form()? Или если все работает то и смотреть нет смысла?
            А в чем разница когда якорь ставится не на форму комментирования, а на сам комментарий? Как это проявляется при комментировании?

          • Забыла указать название, смотрите в файле comments.php. Если работает — смысла смотреть нет.
            Если якорь стоит на форму комментирования, то будет переход к форме. А если на комментарий — то к началу комментария.
            Можно даже попробовать — якорь на форму комментирования и на этот комментарий (как сделано в плагине). Так будут вести себя ссылки Ответить, если отключен JavaScript.

  • Ну по большому счету большой же разницы нет? Человек все равно ведь может отвечать на любой комментарий, верно?
    Александра, большое спасибо за код! Только у Вас нашел решение проблемы replytocom, хотя перелопатил десятки, если не сотни статей )

    • Сергей, при включенном JS абсолютно никакой разницы в работе. Была рада помочь 🙂

  • Как по мне, то более чем достаточно, все объяснить в robots.txt, а также если есть плагин SEO by Yoast, поставить галочку избавиться от replytocom. У меня с помощью данного метода, все страницы типа ghost-image.html#comment-29 и ghost-image.html#respond, в гугле находит — ghost-image.html

    • Евгений, именно благодаря плагину все у Вас и работает. Потому как он тоже убирает ссылку и оставляет только якорь.
      В robots.txt нужно закрывать доступ к файлам, а ограничение доступа к URL как раз и приводит к появлению дублей.

      • Дак вот я и говорю, что этого будет достаточно, как бы плагин очень хорош.

        • Согласна, и много в нем плюшек полезных. Я до недавнего времени пользовалась плагином All In One SEO, пока не наткнулась на толковый обзор WP SEO by Yoast. Сейчас на одном проекте уже удачно сменила, пробую и привыкаю.
          А этот вариант как раз для тех проектов, где все еще All In One SEO висит. Многие к нему просто привыкли и лень менять )))

          • Александра, не только потому что лень ) Почитайте в интернет — о Yoast очень много негативных отзывов. Часто глючит, конфликтует и пр. All In One SEO гораздо в меньшей степени страдает от этого.

          • Сергей, натыкалась тоже на отзывы о проблемах. Но все-же рискнула поставить на один проект, вроде пока все ок. Надо видимо пристальнее за ним приглядывать, спасибо за предупреждение.

  • Александра, я подписана на ваш блог, но у меня нет кода. Не могли бы вы отправить на burzevao@gmail.com. Хочу установить ваш плагин для карты сайта=)

    Можно спросить, у меня проблема, Google заносит в дубли изображения такого типа
    мой блог/ссылка на страницу/название картинки
    Как от этого избавиться?
    У меня установлен плагин плагин Attachment Pages Redirect и в .htaccess настроен 301 редирект. RewriteRule (.+)/attachment /$1 [R=301,L]
    RewriteCond %{QUERY_STRING} ^attachment_id= [NC]
    А толку нет. Хотя сначала Google все картинки выкинул, а вот неделю назад опять всё забрал в дополнительный индекс .
    Плагин SEO у меня как и у вас WordPress SEO Йоаст
    Спасибо.

    • Олия, отправила Вам код.
      Плагин SEO здесь не имеет значения. Я использую All In One SEO, а указанный Вами WordPress SEO by Yoast в качестве эксперимента только на одном проекте.
      По поводу дублей — Вам лучше дополнительно проконсультироваться с Владимиром. Рекомендую проверить не закрыты ли страницы attachment в robots.txt. Также, уберите все ссылки из статей на эти страницы вложения. И попробуйте сделать перенаправление без .htaccess — создайте в шаблоне файл attachment.php и разместите там это код (или отредактируйте, если файл уже есть):

      <?php 
      	wp_redirect( get_permalink($post->post_parent) ); 
      ?>
      • Александра, спасибо, что быстро ответили. В robots.txt у меня страницы attachment не закрыты. С кодом попробую. Спасибо. Если не поможет, обращусь к Владимиру.

        • Здравствуйте. Спасибо Вам за данную статью. Очень полезной оказалась. Я решил свою проблему.

  • 1)У вас стоит Перенаправление в .htaccess :

    RewriteCond %{QUERY_STRING} (replytocom=)
    RewriteRule ^(.*) $1? [R=301,L]

    У меня же код чуточку другой:

    RewriteCond %{QUERY_STRING} ^replytocom= [NC]
    RewriteRule (.*) $1? [R=301,L]

    Вопрос: Стоит ли менять на ваш или оставить все как есть??)
    2) И еще стоят редиректы на ( feed, comment-page, trackback, comments, attachment) оставить их, или лучше убрать? заранее спасибо! п.с.(htaccess брал у А. Борисова)

    • Виталий, если перенаправление работает и выполняет свои функции, то можно оставить любой вариант.

  • Александра, спасибо за способ борьбы с реплитукомами! Попробовала у себя на новом шаблоне (дизайн блога поменяла 🙂 ) поставила его, вроде работает, но древовидные комменты перестали работать, перекидывает тупо в низ к форме комментирования. Думала, в браузере отключен джава, но на вашем-то блоге срабатывает скрипт. Может, я не в то место ставлю код? Я его в конце перед закрывающимся тегом /> влепила.

    • Елена, замечательный новый дизайн — вкусно-шоколадный, не удержаться от комплиментов!
      С комментариями проблема не в коде. У Вас похоже скрипт стандартный от WordPress не подключается. Попробуйте в functions.php (или лучше в спец. плагин FunctionsPHP) добавить вот такие строчки:

      if ( is_singular() && comments_open() && get_option('thread_comments') ) {
      	wp_enqueue_script( 'comment-reply', false, null, true );
      }
      • Спасибо!!! Очень приятно, что дизайн понравился! 😉 А код почти такой же в functions у меня есть, только без фигурных скобок и надписей false, null, true. Попробовала подставить этот (почистила. естественно кеш на всякий случай), но результат такой же, по прежнему перекидывает вниз. Чего же этим комментариям не хватает…

        • Елена, странно. Где-то этот код все-таки теряется у Вас. Попробуйте добавить вот этот скрипт в футер:

          <script>
          var addComment={moveForm:function(a,b,c,d){var e,f=this,g=f.I(a),h=f.I(c),i=f.I("cancel-comment-reply-link"),j=f.I("comment_parent"),k=f.I("comment_post_ID");if(g&&h&&i&&j){f.respondId=c,d=d||!1,f.I("wp-temp-form-div")||(e=document.createElement("div"),e.id="wp-temp-form-div",e.style.display="none",h.parentNode.insertBefore(e,h)),g.parentNode.insertBefore(h,g.nextSibling),k&&d&&(k.value=d),j.value=b,i.style.display="",i.onclick=function(){var a=addComment,b=a.I("wp-temp-form-div"),c=a.I(a.respondId);if(b&&c)return a.I("comment_parent").value="0",b.parentNode.insertBefore(c,b),b.parentNode.removeChild(b),this.style.display="none",this.onclick=null,!1};try{f.I("comment").focus()}catch(l){}return!1}},I:function(a){return document.getElementById(a)}};
          </script>
        • Вот этот файл должен подключаться на внутренних страницах:

          <script type='text/javascript' src='http://domovenok-art.ru/wp-includes/js/comment-reply.min.js'></script>
          • Александра, Вы волшебница!!! Просто огромнейшее спасибо за решение!!! Вставка дополнительного скрипта в футер помогла, теперь древовидность работает. Я, честно говоря, не особо знаю, где проверить подключение файла comment-reply.min.js (или в футере мы это и подключили? 🙂 ) . Ну, в общем, работает — и круто!

          • Да, в футере мы вставили код из этого файла. Файл у Вас не подключен, это видно в коде сайта (если поискать через Ctrl+F фразу comment-reply.min.js).

  • Здравствуйте! воспользовался вашим решением но после установки

    add_filter('comment_reply_link','avd_custom_comment_reply_link');
    function avd_custom_comment_reply_link( $link ) {
        $link = preg_replace( '~href=([\'"]{1})([^\'"]+)#([^\'"]*)([\'"]{1})~i', 'href=$1#$3$4', $link, 1 );
        return $link;
    }

    древовидные комментарии не работают Это так должно быть!? тогда смысл установки данного кода?

    • Алексей, все должно работать как и прежде, именно на работу комментариев (древовидных или обычных) код совершенно не влияет.
      Попробуйте убрать код и проверить работу комментариев. Если проблема появляется после установки кода, дайте адрес Вашего сайта — так будет проще понять в чем именно причина

  • Когда код убираю древовидные комментарии работают

    • Алексей, комментарий в спам попал, только сегодня увидела. А как именно проявляется неработспособность? Комментарии выводятся в один уровень или при нажатии на ссылку Ответить ничего не происходит?

  • Доброго времени суток! после обновления БД просмотрела есть ли изменения и убрались ли все ссылки с replytocom, но все ссылки так и остались в исключенных и по прежнему классифицируются как неканоническими. Я вставила код и в файл .htaccess и внесены соответствующие изменения в плагин functionsphp.php
    Или я что-то неправильно поняла , и ссылки такого вот типа
    blagie-namereniya-ili-sumatoshnyj-den.html?replytocom=265
    все равно останутся даже после всех изменений? хотя я так поняла, что они вообще должны «исчезнуть»…

    • Лора, сообщение в спам почему-то улетело, только сейчас заметила.
      Если верно все настроить, то при переходе на ссылку blagie-namereniya-ili-sumatoshnyj-den.html?replytocom=265 должно перенаправлять на вот такой адрес blagie-namereniya-ili-sumatoshnyj-den.html

Комментировать

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

wp-puzzle.com logo