Циклические ссылки или ссылка на саму себя

Всем привет! Сегодня на seo-mayak.com мы будем говорить о циклических ссылках.

Циклические ссылки встречаются довольно часто, и на WordPress блогах, и на других CMS, как говориться, чтобы найти «живой» пример такой ссылки, далеко ходить не надо. Велика вероятность, что и у Вас на сайте есть хоть одна циклическая ссылка.

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

Итак, определение для тех, кто не в курсе.

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

Так проблема это, или нет? Вот об этом и пойдет сегодня речь. Поехали!

Как найти циклическую ссылку

На 100% уверен, что у начинающих мастеров веб-индустрии циклические ссылки есть: в меню страниц, в меню рубрик, в заголовке сайта (в некоторых случаях в логотипе) или в заголовке статьи, нередко циклические ссылки можно встретить в подвале.

Определить просто. Практически на всех сайтах есть страница «Контакты». Так вот, находясь на странице «Контакты», нажмите опять на «Контакты» и если страница обновится, т.е. подгрузится заново, то можете себя поздравить — вы только что нашли циклическую ссылку.

tciclicheskie-ssylki

На самом деле радоваться тут особо нечему, так как вы обнаружили проблему. Не скажу, что проблема первостепенная, но каждый уважающий себя веб-мастер, обязательно должен с ней разобраться и сейчас объясню почему.

Ссылка на саму себя — проблема или нет

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

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

Известный блогер Devaka, еще в 2010 году, провел эксперимент с циклическими ссылками, по завершению которого сделал интересный вывод:

Как видим, ни один из проверочных способов не дал результатов, другими словами, ссылки со страницы на саму себя не работают (не участвуют в ссылочном графе). Удаление подобных ссылок со страницы будет своего рода оптимизацией, так как другие страницы сайта недополучают статический вес из-за присутствия неработающих линков.

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

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

Известно, что на главной сосредотачивается основной вес сайта и если теряется даже небольшая его часть, то это отрицательно сказывается на всем проекте.

Тем более в 90% случаев на главной располагаются минимум две (бывает и больше) циклические ссылки — это ссылка в заголовке с анкором «Названия сайта» и ссылка в меню с анкором «Главная». Такие дела!

Кроме того, считаю, что циклические ссылки оказывают негативное влияние на поведенческий фактор.

Из всего вышесказанного можно сделать вывод — бороться с циклическими ссылками все же надо, этим мы сейчас и займемся. Приступим!

Как убрать циклические ссылки с главной страницы

Для начала, давайте уберем ссылку на саму себя из заголовка сайта. Открываем файл header.php и ищем строчку, отвечающую за вывод заголовка. Например, что похожее на это:

  <h1><a href="<?php echo esc_url( home_url( '/' ) ); ?>"><?php bloginfo( 'name' ); ?></a></h1>  

Или на это:

  <h1 itemprop="headline"><a href="<?php bloginfo('url');?>"><?php bloginfo('name');?></a></h1>  

Шаблоны все разные, поэтому могут быть и другие варианты.

Что нам надо сделать? Нам надо создать сценарий-условие, которое будет заключаться в следующем. Если открыта главная страница, то ссылка с заголовка будет превращаться в постой текст.

  <?php if (is_front_page() || is_home()) : ?>  <h1>SEO Маяк</h1>  <?php else : ?>  <h1><a href="http://seo-mayak.com/">SEO Маяк</a></h1>  <?php endif; ?>  

В примере я заменил php функции, выводящие URL и название сайта, на их текстовый вариант. Подробней об этом здесь.

Давайте я поясню, как работает данный сценарий. Здесь применяется конструкция if/else, создающее условие. Другими словами, если (if) открыта главная страница (is_home), выводим заголовок сайта без ссылки, иначе (else) выводим заголовок с атрибутами ссылки и завершаем сценарий (endif;).

Конечно придется подправить стили, без этого никак, ведь неактивный заголовок превратится в простой текст, а в style.css или другом css файле, стили прописаны для ссылки.

В силу разнообразия WordPress-тем, я не могу привести какой-либо стандартный пример стилевого оформления, понятно, что у каждого сайта свой дизайн и свои стили, так что новичкам будет еще один повод вникнуть в CSS.

Теперь давайте разберемся с логотипом. Опять же, в разных шаблонах код вывода логотипа может отличатся. Для примера, приведу код из стандартной темы WordPress — Twentyfourteen:

  <a href="<?php echo esc_url( home_url( '/' ) ); ?>" rel="home">  <img src="<?php header_image(); ?>" width="<?php echo get_custom_header()->width; ?>" height="<?php echo get_custom_header()->height; ?>" alt="<?php echo esc_attr( get_bloginfo( 'name', 'display' ) ); ?>"></a>  

Применим знакомую нам конструкцию if/else. В итоге должно получится так:

  <?php if (is_front_page() || is_home() ) : ?>  <img src="<?php header_image(); ?>" width="<?php echo get_custom_header()->width; ?>" height="<?php echo get_custom_header()->height; ?>" alt="<?php echo esc_attr( get_bloginfo( 'name', 'display' ) ); ?>">  <?php else : ?>  <a href="<?php echo esc_url( home_url( '/' ) ); ?>" rel="home"><img src="<?php header_image(); ?>" width="<?php echo get_custom_header()->width; ?>" height="<?php echo get_custom_header()->height; ?>" alt="<?php echo esc_attr( get_bloginfo( 'name', 'display' ) ); ?>">  </a>  <?php endif; ?>  

Как видите, ничего сложного!

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

Как убрать циклические ссылки из меню страниц

Здесь многое зависит от функции, которая выводит данное меню. В wordPress заложено три функции:

1.wp_list_pages()
2.wp_page_menu()
3.wp_nav_menu()

У данных функций есть определенная структура взаимедействий. Базовой функцией является wp_list_pages(). На ее основе работает функция wp_page_menu(), которая отличается от своего родителя лишь возможностью выводить ссылку на главную страницу.

Функция wp_nav_menu волне самостоятельная и отвечает за вывод произвольного меню. Но, в случаи, если функция не найдет ни одного произвольного меню, то следуя параметрам заложенным по умолчанию, передаст все свои полномочия функции wp_page_menu(), которая сформирует меню из имеющихся страниц.

Теперь надо выяснить, какая из функций отвечает за вывод меню страниц в вашей теме. Искать одну из вышеперечисленных функций, надо в том же файле header.php.

Функция wp_list_pages()

В первую очередь давайте рассмотрим функцию wp_list_pages(), которая выводит в меню все существующие страницы, кроме главной. Поэтому ссылка на главную в коде прописывается отдельно.

  <ul id="nav">  <li><a href="<?php echo esc_url( home_url( '/' ) ); ?>">Главная</a></li>  <?php wp_list_pages('sort_column=menu_order&title_li=&depth=1'); ?>  </ul>  

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

  <ul id="nav">  <?php if ( is_home() ) : ?>  <li>Главная</li>  <?php else : ?>  <li><a href="http://seo-mayak.com/">Главная</a></li>  <?php endif; ?>  <?php wp_list_pages('sort_column=menu_order&title_li=&depth=1'); ?>  </ul>  

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

Разработчики WordPress предусмотрели специальный CSS-класс, который автоматически подставляется к активному пункту меню:

tciclicheskie-ssylki1

Раз у нас есть уникальный класс current_page_item, за который можно зацепиться, значит стоит попробовать составить регулярное выражение.

Вот что у меня получилось:

  function mayak_list_page_no_link($no_link){  $gg_mk = '!<li class="(.*?)current_page_item"><a(.*?)>(.*?)</a>!si';  $dd_mk = '<li class="$1current_page_item">$3';  return preg_replace($gg_mk, $dd_mk, $no_link );  }  add_filter('wp_list_pages', 'mayak_list_page_no_link');  

Теперь все названия активных пунктов меню будут выводится в виде простого текста, останется лишь подправить слили. Напомню, что стили надо прописывать для класса current_page_item. Например:

  .current_page_item{  font-size: 16px // размер шрифта  color: #fffff // цвет текста  background:#F0F0F0; //цвет фона  }  

Функция wp_page_menu()

Если в вашей теме, формированием меню страниц занимается функция wp_page_menu(), то ссылка на главную может отдельно не прописывается, а задаваться в параметрах. Например:

<?php wp_page_menu('show_home=Главная'); ?>

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

  function mayak_page_menu_no_link($no_link){  $gg_mk = '!<li class="(.*?)current_page_item"><a(.*?)>(.*?)</a>!si';  $dd_mk = '<li class="$1current_page_item">$3';  return preg_replace($gg_mk, $dd_mk, $no_link );  }  add_filter('wp_page_menu', 'mayak_page_menu_no_link');  

Осталась последняя функция, которая может использоваться разработчиками тем WordPress для построения меню страниц.

Функция wp_nav_menu()

Функция wp_nav_menu() появилась с версии WordPress 3.0 и используется большинстве современных шаблонов.

Как я уже говорил выше, данная функция выодит произвольного меню, если таковое было создано. Но если ни одного произвольного меню не было найдено, то согласно настройкам по умолчанию, за вывод списка страниц будет отвечать знакомая нам функция wp_page_menu().

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

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

Придется немного подкорректировать функцию:

  function mayak_nav_menu_no_link($no_link){  $gg_mk = '!<li(.*?)class="(.*?)current_page_item(.*?)"><a(.*?)>(.*?)</a>!si';  $dd_mk = '<li$1class="\2current_page_item\3">$5';  return preg_replace($gg_mk, $dd_mk, $no_link );  }  add_filter('wp_nav_menu', 'mayak_nav_menu_no_link');  

Теперь должно быть все в порядке. Пришло время разобраться с ссылками в меню категорий.

Как удалить циклические ссылки из меню категорий

Меню категорий на WoirdPress в 90% случаях формирует функция wp_list_categories() (бывают редкие исключения). Если в вашем шаблоне применяться другая функция, то пишите в комментариях, что-нибудь придумаем.

Для извлечения циклических ссылок из wp_list_categories() применим следующий фильтр:

  function mayak_category_no_link($no_link){  	$gg_mk = '!<li class="cat-item (.*?) current-cat"><a (.*?)>(.*?)</a>!si';  	$dd_mk = '<li class="cat-item \1 current-cat">\3';  	return preg_replace($gg_mk, $dd_mk, $no_link );  }  add_filter('wp_list_categories', 'mayak_category_no_link');  

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

Ссылка на саму себя в заголовке статьи

В некоторых темах, непонятно зачем, заголовок записи в файле single php или в одном из прикрепленных к нему файлов, заключен в ссылку. Например так:

  <h2><a href="<?php the_get_permalink() ?>"><?php the_title(); ?></a></h2>  

Или так:

  <?php the_title( '<h1 class="entry-title"><a href="' . esc_url( get_permalink() ) . '" rel="bookmark">', '</a></h1>' ); ?>  

Могут быть и другие варианты. Получается ссылка на туже страницу, т.е пресловутая ссылка на саму себя.

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

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

До встречи!

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

Источник