Здравствуйте! В этой статье разберем еще один способ скрытия ссылок авторов комментариев на свои сайты. До этого, мы разбирали способ скрытия ссылок с использованием чистого JavaScript и CSS. Но сейчас, мы прибегнем к помощи замечательного фреймворка jQuery.
Как и раньше, все процедуры (правки кода) я буду выполнять с установленной темой «Twenty Twelve».
Все операции довольно простые, и я не думаю что у вас возникнут какие либо трудности. Но если что — пишите вопросы в комментариях.
Прежде чем читать данную статью, я бы рекомендовал к прочтению статью «Как запретить индексацию ссылок авторов комментариев в WordPress», т. к. они имеют общую тематику.
Первое. Открываем файл функций темы «/wp-content/themes/twentytwelve/functions.php». И в самый конец файла добавляем следующую функцию:
function my_get_comment_author_link( $comment_ID = 0 ) { $url = get_comment_author_url( $comment_ID ); $author = get_comment_author( $comment_ID ); if ( empty( $url ) || 'http://' == $url ) { $return = $author; } else { $return = "<span class='s-link' data-link="".str_replace('http://', '_', $url)."">".$author."</span>"; } return apply_filters( 'my_get_comment_author_link', $return, $author, $comment_ID ); }
Задачи у ф-ии выше точно такие же как и и ф-и «my_get_comment_author_link» в данной статье. Отличие только в единственной записи:
$return = "<span class='s-link' data-link="".str_replace('http://', '_', $url)."">".$author."</span>";
В данном случае, мы используем атрибут «data-link» чтобы спрятать ссылку.
Далее, отыщите в файле «functions.php» функцию «twentytwelve_comment(...)», а в ней «get_comment_author_link()» и змените ее на «my_get_comment_author_link()».
На этом этапе, вместо привычных нам ссылок отображаемых по умолчанию, будет отображаться:
<span class='s-link' data-link="_example.com/">Семен</span>
в вашем случае, имя и ссылка соответственно будут другие.
Второе. Подключаем фреймворк jQuery:
if(function_exists('my_wp_enqueue_scripts') == FALSE): function my_wp_enqueue_scripts() { wp_enqueue_script("jquery"); } add_action('wp_enqueue_scripts', 'my_wp_enqueue_scripts'); endif;
вставьте эту функцию ниже предыдущей.
Третье. И наверное самое интересное. Нам нужно отыскать на странице все span элементы с классом «s-link» и заменить их на привычные для нас теги «a». Для этого, мы будем использовать следующий код:
if(function_exists('my_wp_head') == FALSE): function my_wp_head() { ?> <script type="text/javascript"> jQuery(document).ready(function() { jQuery('.s-link').each(function(i){ jQuery(this).parents('.fn').html('<a href="' + jQuery(this).data('link').replace("_","http://") + '" target="_blank"">' + jQuery(this).text() + '</a>'); }); }); </script> <?php } add_action('wp_head', 'my_wp_head'); endif;
Разберем его подробнее. Используя:
jQuery('.s-link') — мы ищем на странице все элементы (не только SPAN) имеющие класс «s-link»
each(...) - данная функция, позволяет нам в цикле пройтись по всем найденным элементам. В качестве аргумента, она принимает функцию, в котором размещена основная логика приложения:
jQuery(this).parents('.fn').html('<a href="' + jQuery(this).data('link').replace("_","http://") + '" target="_blank"">' + jQuery(this).text() + '</a>');
где:
jQuery(this) — мы обращаемся к текущему найденному элементу с классом «s-link» (далее функции пишутся «поровозиком» :))
parents('.fn') — переходим к родительскому элементу имеющему класс «.fn».
и в html(...) - помещаем нашу созданную ссылку
Данные для формирования ссылки мы берем из того же «span» элемента:
jQuery(this).data('link') — обращаемся к атрибуту «data» (который содержит ссылку)
jQuery(this).text() — имя автора.
Данный способ замечателен тем, что автор комментария не будет знать что его ссылка на самом деле не ссылка, а всего лишь «span» элемент с атрибутом «data-link». Ведь наведя на ссылку, она будет срабатывать как обычная. А вся правда откроется лишь в том случае, когда пользователь просмотрит код странички.
Но в данном подходе есть одно но! На самом деле, я не знаю как поисковые роботы индексируют страницы, формируют ли они содержимое аналогичным образом как браузеры или видят «чистый» код без дополнительной DOM обработки.
Но мне кажется, пока что они видят обычный HTML/JavaScript код.
Паш, привет. Отличный мануал, а главное не надо лезть в файлы движка, что очень хорошо. Так этот хак не слетит после обновления движка.
Паш, я обратил внимание, на скорость загрузки твоего блога, - быстро! Может есть статья, как добиться такого результата.
Привет, Максим!
Да, при обновлении все отстранится.
Нет такой статьи. Но старался оптимизировать как мог :). В основном следовал рекомендациям PageSpeed. Плюс удалил "лишний" (на мой взгляд) js/css код генерируемый самим движком WP.
Я тоже следую рекомендациям PageSpeed, но он не в какую не хочет пропускать миниатюры в популярных материалах. Я их уже оптимизировал по разному, а он всё утверждает, что нужно оптимизировать.
А при обновлении движка, зачистка повторная требуется? Ну, в смысле "лишнего кода".
Максим, очевидно, что на популярные статьи подгружаются картинки большего размера, чем указаны по факту в CSS, или где там в скрипте или шорткоде. То есть может грузится картинка 300 на 300 (к примеру), а по факту 90 на 90 выводится на экран и поэтому Google советует их грузить в уменьшенном виде. Я забил короче на эту тему.
Еще в адаптивных макетах под разные размеры мониторов желательно грузить не одну картинку, а разные размеры. Как-то это неудобно правда. Есть скрипт, режет картинки и подгоняет, забыл название.
А я картинки даже не оптимизирую. Только раз скачал уже оптимизированные с PageSpeed и все.
Нет, я эти функции в теме прописал и все. Хотя я не знаю насколько они влияют на это. Если интересно, то использовал это:
/**
* Удаляем links: RSD, wlwmanifest
*/
remove_action('wp_head', 'wlwmanifest_link');
remove_action('wp_head', 'rsd_link');
/**
* Удаляем CSS и JS код эмоций (если я правильно понял)
*/
remove_action('wp_head', 'print_emoji_detection_script', 7);
remove_action('wp_print_styles', 'print_emoji_styles');
/**
* Удаляем мета-тег генератора
*/
remove_action('wp_head', 'wp_generator');
/**
* Убираем автоматическое преобразование кавычек
*/
remove_filter('the_content', 'wptexturize');
remove_filter('the_title', 'wptexturize');
remove_filter('comment_text', 'wptexturize');
remove_filter('the_excerpt', 'wptexturize');
Грамотный подход, беру на вооружение. Паша, спасибо!
🙂
Привет, Павел. Там у тебя в коде не все фильтры emoji
Вот вроде все
/**
* Disable the emoji's
*/
function disable_emojis() {
remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );
remove_action( 'wp_print_styles', 'print_emoji_styles' );
remove_action( 'admin_print_styles', 'print_emoji_styles' );
remove_filter( 'the_content_feed', 'wp_staticize_emoji' );
remove_filter( 'comment_text_rss', 'wp_staticize_emoji' );
remove_filter( 'wp_mail', 'wp_staticize_emoji_for_email' );
add_filter( 'tiny_mce_plugins', 'disable_emojis_tinymce' );
}
add_action( 'init', 'disable_emojis' );
Спасибо! возьму на заметку
2 часа искал такое решение для WP, и наконец-то нашел. Спасибо за подробную инструкцию!
Рад был помочь
Павел, до боли знакомые стили тега
code 🙂
Ага, Bootstrap