Как запретить индексирование внутренних ссылок, создаваемых базовыми функциями и виджетами?

Я переделываю тему одного блога, пытаясь снизить количество индексируемых внутренних ссылок. Если это простая ссылка стандартной конструкции, то никакой трудности подставить в нее rel=»nofollow» нет. Основная же загвоздка заключается в ссылках, создаваемых встроенными функциями.
Например, совершенно не ясно, как сделать неиндексируемой вот такие ссылки:


и другие подобные.
Так же не ясно, как сделать неидексируемыми ссылки, создаваемые виджетами? Например, вот этими: WP_Widget_Pages, WP_Widget_Calendar, WP_Widget_Archives, WP_Widget_Links, и другими.
Я понимаю, что можно разобрать до винтиков default-widgets.php, но все же считаю, что вмешиваться в системные файлы не совсем правильно.
Есть ли какой-нибудь способ сделать ссылки, создаваемые базовыми функциями и виджетами, неиндексируемыми? Может фильтры какие, прописываемые в functions.php?

tiaurus

Автор n-wp.ru — блога о WordPress для новичков.

Оцените автора
Добавить комментарий

  1. tiaurus

    Наверняка то же самое можно сделать и для других функций?
    Например, для the_tags работает такое:

    add_filter('the_tags', 'fb_the_tags');
    function fb_the_tags($text) {
    $text = preg_replace('#rel="#', 'rel="nofollow ', $text);
    return $text;
    }

    А вот для ссылки на посты автора

    <?php the_author_posts_link(); ?>

    подобное не работает…

    Ответить
    1. ctapbiu

      для
      the_author_posts_link:

      add_filter('the_author_posts_link', 'fb_the_author_posts_link');
      function fb_the_author_posts_link($text) {
      $text = preg_replace('#href="#', 'rel="nofollow" href="', $text);
      return $text;
      }
      

      (регэксп отличается)

      Ответить
      1. tiaurus

        Работает! Премного благодарен!
        А для

        <?php comments_popup_link(); ?>

        не работает ни первый ни второй способы :(

        Ответить
        1. ctapbiu

          а у этой ф-ции нет хука, но никто не мешает в буфер сохранять что он выводит:

          function fb_comments_popup_link() {
          ob_start();
          comments_popup_link();
          $text = ob_get_contents();
          ob_end_clean();
          
          $text = preg_replace('#href="#', 'rel="nofollow" href="', $text);
          echo $text;
          }
          
          Ответить
          1. tiaurus

            Что-то не работает… :(

            Ответить
        2. ctapbiu

          а в самой теме вместо comments_popup_link();
          вставить fb_comments_popup_link();

          ЗЫ: я не пробовал, но должно работать; если таки не заработает — попробую, но попозже…

          Ответить
          1. tiaurus

            В принципе, для comments_popup_link не принципиально — я могу заменить эту функцию просто выводом количества комментариев, а линк и тайтл подставлю вручную:

            <a href="/#comments" 0="title="Комментарии" 1="к" 2="" 3="the_title();" 4="?" rel="nofollow">"><?php comments_number('#','1','%')?></a>

            А вот что делать с RSS лентами, которые автоматически формирует движок?
            RSS (полн) — /feed
            RSS (сокр) — /feed/rss
            RSS комментариев к посту — например, /2978/feed
            RSS комментариев в блоге — /comments/feed
            В явном виде ссылок на них нет, но при анализе внутренних ссылок на страницах они фигурируют и индексируются.

            Ответить
            1. ctapbiu

              вы хотите вместо

              <link rel="alternate" type="application/rss+xml" title="Q2A | Свободная автономная dofollow-система вопросов и ответов о WordPress - RSS Feed (полный)" href="http://q2a.n-wp.ru/feed" />
              

              сделать

              <link rel="nofollow alternate" type="application/rss+xml" title="Q2A | Свободная автономная dofollow-система вопросов и ответов о WordPress - RSS Feed (полный)" href="http://q2a.n-wp.ru/feed" />
              

              ?

              Ответить
              1. tiaurus

                Спасибо, что напомнили! Уже догадался, что в link тоже можно напрямую подставлять nofollow.
                Спасибо еще раз — ваши ответы достойны отдельной статьи на https://n-wp.ru.

                PS. Осталась одна загвоздка — не могу избавиться от индексируемых ссылок в трекбеках/пингах/комментариях. В блоге используется функция wp_list_comments, которую предоставляет сам движок WordPress . Лезть во внутрь движка совсем не хочется, а делать фильтры я не мастер.

                Ответить
                1. tiaurus

                  Большое спасибо! Первый вариант полностью устраивает.

                  Ответить
                2. ctapbiu
                  function fb_wp_list_comments($args = array(), $comments = null ) {
                  ob_start();
                  wp_list_comments($args, $comments);
                  $text = ob_get_contents();
                  ob_end_clean();
                  
                  $text = preg_replace('#<a href="#', '<a rel="nofollow" href="', $text);
                  echo $text;
                  }
                  

                  в теме используйте fb_wp_list_comments вместо wp_list_comments

                  можно сделать через аргумент callback для ф-ции wp_list_comments:
                  http://codex.wordpress.org/Function_Reference/wp_list_comments#Comments_Only_With_A_Custom_Comment_Display

                  там нужно будет скопировать большую часть кода и добавить нофоллоу

                  Ответить
  2. tiaurus

    а в самой теме вместо comments_popup_link();
    вставить fb_comments_popup_link();

    Работает!
    Единственное но. Когда я использовал comments_popup_link, то указывал свои аргументы:

    <?php comments_popup_link(__('#', 'piano-black'), __('1', 'piano-black'), __('%', 'piano-black')); ?>

    Это работало — цифры выводились так, как я задумал. В случае с заменой мои параметры не работают — WordPress выводит то, что заложено у него по-умолчанию (1 comm.) .

    Ответить
    1. ctapbiu
      function fb_comments_popup_link($zero = false, $one = false, $more = false, $css_class = '', $none = false) {
      ob_start();
      comments_popup_link($zero, $one, $more, $css_class, $none);
      $text = ob_get_contents();
      ob_end_clean();
      
      $text = preg_replace('#href="#', 'rel="nofollow" href="', $text);
      echo $text;
      }
      

      и просто название ф-ции замените

      по поводу рсс позже отвечу

      Ответить
      1. tiaurus

        Да, работает! Премного благодарен!

        Ответить
  3. ctapbiu

    the_author_posts отдает число (кол-во постов автора текущего поста)
    the_category — можно сделать хук
    что-то типа:

    add_filter('the_category', 'fb_the_category');
    function fb_the_category($text) {
    $text = preg_replace('#rel="#', 'rel="nofollow ', $text);
    return $text;
    }
    

    the_tags — тоже самое, только хук на the_tags

    WP_Widget_Pages — хук на wp_list_pages, но немного изменится ф-ция замещения

    add_filter('wp_list_pages', 'fb_wp_list_pages');
    function fb_wp_list_pages($text) {
    $text = preg_replace('#href="#', 'rel="nofollow" href="', $text);
    return $text;
    }
    

    для WP_Widget_Calendar:

    add_filter('get_calendar', 'fb_get_calendar');
    function fb_get_calendar($text) {
    $text = preg_replace('#href="#', 'rel="nofollow" href="', $text);
    return $text;
    }
    

    для WP_Widget_Archives:

    add_filter('get_archives_link', 'fb_get_archives_link');
    function fb_get_archives_link($text) {
    $text = preg_replace('#href='#', 'rel="nofollow" href='', $text);
    return $text;
    }
    

    Где-то так…
    ЗЫ: всё это не проверял, но должно работать
    ЗЗЫ: можно всё это совместить в одну ф-цию и только фильтров напихать

    Ответить
    1. tiaurus

      Применил несколько фильтров — работают. Большое спасибо!

      Ответить
  4. auditor
    Ответить
    1. Как сделать внешние ссылки внутренними | Плагин RC Link Redirector

      Ответить
      1. auditor

        Сенк ю вери мач! А если речь, например, будет идти о хтмл, как быть?

        Ответить
        1. Использовать сервис коротких ссылок.

          Ответить
          1. auditor

            Но тогда же всё равно останутся ссылки, но уже на сервис коротких ссылок…?

            Ответить
      2. auditor

        Кстати, написано, что этот плагин только до версии 2.6. Да и проверил я его — не работает. А какой объективный сервис есть для определения исходящих ссылок? А то в разных сервисах разные данные…

        Ответить