Задача любой ссылки на сайте – связывать два документа будь-то главная страница, рубрика, запись или файл. И это правильно, удобно и вполне логично. Однако есть вид ссылок, которые нарушают такую идиллию и называются они – циклическими.

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

Многие темы для WordPress буквально «кишат» циклическими ссылками, тем самым ухудшая юзабилити и отношение ПС к сайту, поэтому срочно избавляемся от них.

План статьи:
1. Плагин Remove Redundant Links
2. Как удалить ссылку на саму себя из заголовка статьи
3. Как удалить циклическую ссылку с логотипа
4. Как удалить ссылку на текущую страницу в меню WordPress
5. Применяем ссылку-якорь вместо обычной
6. Как удалить ссылки-якоря из даты в комментариях
7. Как избавиться от циклических ссылок в replytocom

WordPress плагин Remove Redundant Links

Удалить циклические ссылки можно при помощи плагина для ВП Remove Redundant Links.

Достоинства данного метода:

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

Недостатки:

  • Как и любой другой плагин он создаёт небольшую нагрузку на сайт.
  • Есть вероятность что будет не работать или конфликтовать с другими плагинами. В этом случае делаем все руками по инструкциям ниже.

Принцип работы плагина:

Он удаляет из ссылки:

href=""

Дополняя её Тайтлом:

title="You are here."

* Перевести тайтл можно в файле remove-redundant-links.php, который находится в папке с плагином. Для этого найдите в нём «You are here» и измените на «Вы находитесь здесь».

И Классом:

class="rrl current_page_item"

* То есть при желании мы можем задать своё оформление.


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

Прежде всего, необходимо найти эту циклическую ссылку. В WordPress она находится в шаблоне сайта, в одном из его файлов: чаще всего в «Одна запись (single.php)», реже в «content-single.php». В зависимости от шаблона – название может быть любым, но чаще всего этот файл называют так.

Если не умеете пользоваться фтп и php-редактором, то отредактировать эти файлы можно из админки, перейдя по адресу:

http://site.ru/wp-admin/theme-editor.php

и открыв в нужный файл:

single

content-single

Теперь наша задача найти код похожий на этот:

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

И превратить его в подобный:

<?php the_title(); ?>

В итоге вместо ссылки, анкором которой был заголовок статьи, будет выводиться только текст заголовка.

Как удалить циклическую ссылку с логотипа

Ссылка лежит в файле шаблона «Заголовок (header.php)».
Наша задача указать, что на главной странице сайта ссылка должна отсутствовать, а на остальных показываться. Для этого следует воспользоваться простым php-условием:

<?php
if ( is_home() && !is_paged() ) {
   echo('<p class="logo">Site.ru</p>'); // код, который будет выводится на главной странице
} else {
   echo('<p><a class="logo" href="/">Site.ru</a></p>'); // действие для остальных страниц
}
?>

Внимание! Если ссылка и логотип имеет такой вид:

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

Тогда, прежде чем его «оборачивать» в php-условие, его следует упростить (заменить на простой html-код), иначе условие не сработает, и вместо сайта вы увидите белую страницу. Вот как его нужно переделать:

<a href="/" title="Главная страница" rel="home">Имя сайта</a>

То же самое касается и логотипа (если он задан картинкой):

<img src="<?php header_image(); ?>" alt='<?php bloginfo( 'name' ); ?>' />

Этот код нужно поменять на:

<img src="/wp-content/themes/ВАША_ТЕМА/images/НАЗВАНЕ_КАРТИНКИ.jpg" alt="Главная страница" />

А потом уже его помещать в php-условие.

Как удалить ссылку на текущую страницу в меню WordPress

Меню может выводиться разными способами, но в большинстве тем для Вордпресс оно выводится с помощью функции wp_nav_menu.

Для начала найдём меню:
• Если оно в верхней части сайта, значит открываем файл «Заголовок (header.php)»;
• Если в нижней – «Подвал (footer.php)»;
• Если в боковой – «Боковая колонка (sidebar.php)».

Теперь нужно заменить wp_nav_menu() на wp_nav_menu_extended()

Пример:

<?php wp_nav_menu_extended( array( 'theme_location' => 'primary', 'menu_class' => 'nav-menu') ); ?>

Теперь открываем файл «Функции (functions.php)»
И после:

<?php

С новой строки вставляем такой код:

function wp_nav_menu_extended($args = array()) {
    $_echo = array_key_exists('echo', $args) ? $args['echo'] : true;
    $args['echo'] = false;

    $menu = wp_nav_menu($args);

    // Load menu as xml
    $menu = simplexml_load_string($menu);

    // Find current menu item with xpath selector
    if (array_key_exists('xpath', $args)) {
        $xpath = $args['xpath'];
    } else {
        $xpath = '//li[contains(@class, "current-menu-item") or contains(@class, "current_page_item")]';
    }

    $current = $menu->xpath($xpath);

    // If current item exists
    if (!empty($current)) {
        $text_node = (string) $current[0]->children();

        // Remove link
        unset($current[0]->a);

        // Create required element with text from link
        $element_name = $args['replace_a_by'] ? $args['replace_a_by'] : 'span';

        $dom = dom_import_simplexml($current[0]);
        $n = $dom->insertBefore(
            $dom->ownerDocument->createElement($element_name, $text_node),
            $dom->firstChild
        );

        $current[0] = simplexml_import_dom($n);
    }

    $xml_doc = new DOMDocument('1.0', 'utf-8');
    $menu_x = $xml_doc->importNode(dom_import_simplexml($menu), true);
    $xml_doc->appendChild($menu_x);

    $menu = $xml_doc->saveXML($xml_doc->documentElement);

    if ($_echo) {
        echo $menu;
    } else {
        return $menu;
    }
}

Теперь циклические ссылки в категориях исчезнут.

Использование ссылки-якорь

Для тех, кто не хочет лезть в программирование или у кого-то другой движок есть еще пара вариантов, как убрать эти нехорошие ссылки сами на себя. Сейчас распишу первый. Метод этот прост. Нужно в конец ссылки подставить хэш-тег (символ «решетка»).

К примеру, было так:

<a href="http://site.ru/kategoriya.html">Категория</a>

Стало так:

<a href="http://site.ru/kategoriya.html#2">Категория</a>

Текст после # может быть любой (2, ssilka2, menu и т.п). Получится, по-сути, ссылка-якорь.

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

<a name="2"></a>

(где 2 – это текст, идущий после #)

По итогу получится такой код:

<a name="2"></a><a href="http://site.ru/kategoriya.html#2">Категория</a>

Я считаю, что ссылки с хэш-тегом на конце (ссылка-якорь) не являются циклическими. Во-первых, эти ссылки не открываются в новом окне или вкладке, то есть не вводят пользователя в заблуждение. Во-вторых, они созданы специально для того, чтобы «перемещать посетителя» по текущей странице, а значит, в них не может быть чего-то плохого.

Но те, кто так не считает, может удалять и такие ссылки. К примеру, такие ссылки выводятся в датах в комментариях WordPress’е.

Как удалить ссылки-якоря из даты в комментариях

Те, кто считает, что эти ссылки пользователям не нужны, могут от них избавиться. Можно, конечно, залезть в саму CMS WordPress, но тогда придётся после каждого обновления движка править код, что неудобно. Поэтому предлагаю альтернативу.

Открываем файл «Функции (functions.php)» и после:

<?php

Вставляем следующий код:

function mytheme_comment($comment, $args, $depth) {
    $GLOBALS['comment'] = $comment;
    extract($args, EXTR_SKIP);

    if ( 'div' == $args['style'] ) {
        $tag = 'div';
        $add_below = 'comment';
    } else {
        $tag = 'li';
        $add_below = 'div-comment';
    }
?>
    <<?php echo $tag ?> <?php comment_class( empty( $args['has_children'] ) ? '' : 'parent' ) ?> id="comment-<?php comment_ID() ?>">
    <?php if ( 'div' != $args['style'] ) : ?>
    <div id="div-comment-<?php comment_ID() ?>" class="comment-body">
    <?php endif; ?>
    <div class="comment-author vcard">
    <?php if ( $args['avatar_size'] != 0 ) echo get_avatar( $comment, $args['avatar_size'] ); ?>
    <?php printf( __( '<cite class="fn">%s</cite> <span class="says">says:</span>' ), get_comment_author_link() ); ?>
    </div>
    <?php if ( $comment->comment_approved == '0' ) : ?>
        <em class="comment-awaiting-moderation"><?php _e( 'Your comment is awaiting moderation.' ); ?></em>
        <br />
    <?php endif; ?>

    <div class="comment-meta commentmetadata">
        <?php
            /* translators: 1: date, 2: time */
            printf( __('%1$s at %2$s'), get_comment_date(),  get_comment_time() ); ?><?php edit_comment_link( __( '(Edit)' ), '  ', '' );
        ?>
    </div>

    <?php comment_text(); ?>

    <div class="reply">
    <?php comment_reply_link( array_merge( $args, array( 'add_below' => $add_below, 'depth' => $depth, 'max_depth' => $args['max_depth'] ) ) ); ?>
    </div>
    <?php if ( 'div' != $args['style'] ) : ?>
    </div>
    <?php endif; ?>
<?php
}

Теперь открываем файл «Комментарии (comments.php)» и находим код:

<?php wp_list_comments(); ?>

И меняем его на:

<?php wp_list_comments( 'type=comment&callback=mytheme_comment' ); ?>

Вот и всё. Напоминаю, если при внесении правок изменился цвет или размер шрифта, вы сможете всё это подправить с помощью файла «Список стилей (style.css)».


Как избавиться от циклических ссылок в replytocom

Очень многие вордпресс-темы в комментариях содержат ссылки «Ответить». Выглядят они следующим образом:

http://site.ru/statya/?replytocom=52290#respond

Такие ссылки не только являются циклическими, но и могут быть проиндексированы ПС (Гугл проиндексил).

Если они не нужны вовсе можно их удалить. Если вы воспользовались способом выше (удалением ссылок из даты), то в файле finction.php нужно удалить следующий код:

<div class="reply">
    <?php comment_reply_link( array_merge( $args, array( 'add_below' => $add_below, 'depth' => $depth, 'max_depth' => $args['max_depth'] ) ) ); ?>
    </div>

Если они все же нужны, то их можно переделать следующим способом.
В файл functions.php вашего шаблона после:

<?php

добавляем такой код:

function add_comment_custom_reply_link($link, $args, $comment){
    $comment = get_comment( $comment );
 
    // If no comment author is blank, use 'Anonymous'
    if ( empty($comment->comment_author) ) {
        if (!empty($comment->user_id)){
            $user=get_userdata($comment->user_id);
            $author=$user->user_login;
        } else {
            $author = __('Anonymous');
        }
    } else {
        $author = $comment->comment_author;
    }
 
    // If the user provided more than a first name, use only first name
    if(strpos($author, ' ')){
        $author = substr($author, 0, strpos($author, ' '));
    }
 
    // Replace Reply Link with "Reply to &lt;Author First Name>"
    $reply_link_text = $args['reply_text'];
    $link = str_replace(array($reply_link_text, '<a', '/a>', 'href'), array('Ответ для '.$author, '<span', '/span>', 'rel'), $link);
 
    return $link;
}
add_filter('comment_reply_link', 'add_comment_custom_reply_link', 10, 3);

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

.reply {
    margin-bottom:15px;
}
.comment-reply-link  {
    color: #0c72a2;
}
.comment-reply-link:hover  {
    text-decoration: underline;
    cursor: pointer;
}

P.S.: эту же тему обсуждаем на форуме.

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

Для составления этого поста помогли: раз, два, программист Игорь.

Всем спасибо. Если есть вопросы или дополнения, пишите.