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

1053 22

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

1
2
3
<?php the_author_posts(); ?>
<?php the_category(); ?>
<?php the_tags(); ?>

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

Комментариев 22
  1. 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;
    }
    [/cc]
    
    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;
    }
    [/cc]
    
    для 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;
    }
    [/cc]
    
    для 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;
    }
    [/cc]
    
    Где-то так...
    ЗЫ: всё это не проверял, но должно работать
    ЗЗЫ: можно всё это совместить в одну ф-цию и только фильтров напихать
  2. Наверняка то же самое можно сделать и для других функций?
    Например, для the_tags работает такое:

    1
    2
    3
    4
    5
    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(); ?>[/cc]
    подобное не работает...
    • для
      the_author_posts_link:

      1
      2
      3
      4
      5
      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;
      }

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

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

        < ?php comments_popup_link(); ?>[/cc] не работает ни первый ни второй способы :(
        • а у этой ф-ции нет хука, но никто не мешает в буфер сохранять что он выводит:

          1
          2
          3
          4
          5
          6
          7
          8
          9
          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;
          }
        • а в самой теме вместо comments_popup_link();
          вставить fb_comments_popup_link();

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

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

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

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

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

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

              сделать

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

              ?

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

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

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

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

    < ?php comments_popup_link(__('#', 'piano-black'), __('1', 'piano-black'), __('%', 'piano-black')); ?>[/cc]
    Это работало - цифры выводились так, как я задумал. В случае с заменой мои параметры не работают - WordPress выводит то, что заложено у него по-умолчанию (1 comm.) .
  4. А как можно сейчас закрыть обычную исходящую ссылку со страницы? Ведь уже ноуидексы и ноуфолловы не работают? Дело в том, что мне надо , чтобы ещё была спрятана рефссылка. То есть, как закрыть вот такую конструкцию от индексации?

    1
    <a href="http://www.site.ru/" target="_blank" onClick="this.href="http://www.site.ru/ref.php"><img src="http://site2.ru/kartinka.png"></a>