Сборник полезных хаков для комментариев WordPress. Часть 3

Привет друзья, давно я ничего не писал о модернизации нашего с вами любимого WordPress. Сегодня решил устранить эту несправедливость. Продолжу цикл публикаций о хаках и модификациях для комментариев в WP. Будет всего два хака, но зато каких!

Для тех, кто не читал предыдущие части, настоятельно рекомендую это сделать: Часть 1 и Часть 2.

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

Сегодня мы будем говорить и работать с цифрами. То что у нас получится в итоге, смотрите на скриншоте. Цветом помечены новые фишки, которые могут появиться и у вас, после прочтения данного поста.

Вывод количества комментариев автора

Вывод количества комментариев автора

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

Вы можете кидать в меня помидоры, сказав, что уже видели на некоторых блогах такую фишку. Да, я с вами согласен, она кое-где встречается. Но все это реализовано с помощью плагина, который регулирует наличие тега nofollow в ссылке автора комментария в зависимости от количества оставленных комментариев. Вы можете пользоваться и плагином, ограничив настройками его функционал, тем самым получив только счетчик.

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

Но хватит лирики, дайте ближе к делу.

Существует две модификации скрипта. Так случилось, что первая версия однажды показалась мне не совсем верной, и я сделал вторую, но, тем не менее, обе имеют право на жизнь. Первая версия счетчика считает количество комментариев по имени автора (comment_author), а вторая по e-mail (comment_author_email). Очень долгое время у меня был первый вариант, но однажды я подумал, а ведь разных Дмитриев, Василиев и Николаев куча и все это разные люди, а имя одно. Я решил, что это не совсем правильно считать количество комментариев по имени, тем более что даже постоянные комментаторы иногда используют разные имена. Так что теперь у меня на блоге идет подсчет именно по полю e-mail.

Вот вариант №1 для подсчета ПО ИМЕНИ:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/*** Вывод количества комментов автора по имени (by Alaev)***/
 
add_filter('get_comment_author_link', 'count_author_comm', 11);
 
function count_author_comm($mycommcounter) {
global $wpdb, $comment;
	// Count comments per author name
	$queryString="SELECT COUNT(*) as comments FROM ".$wpdb->comments." WHERE comment_author='".$wpdb->escape($comment->comment_author)."'";
	$comments_count = $wpdb->get_var($queryString);
	// Show comments count per author name
		if ($comment->comment_type != "pingback" && $comment->comment_type != "trackback" && !is_admin()) {
			$mycommcounter .= " (".$comments_count." комм.)";
			return $mycommcounter;
		}
}

А вот вариант №2 для подсчета ПО E-MAIL:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/*** Вывод количества комментов автора по e-mail (by Alaev)***/
 
add_filter('get_comment_author_link', 'count_author_comm', 11);
 
function count_author_comm($mycommcounter) {
global $wpdb, $comment;
	// Count comments per author mail
	$queryString="SELECT COUNT(*) as comments FROM ".$wpdb->comments." WHERE comment_author_email='".$wpdb->escape($comment->comment_author_email)."'";
	$comments_count = $wpdb->get_var($queryString);
	// Show comments count per author mail
		if ($comment->comment_type != "pingback" && $comment->comment_type != "trackback" && !is_admin()) {
			$mycommcounter .= " (".$comments_count." комм.)";
			return $mycommcounter;
		}
}

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

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

Обнаружилась небольшая поправка, для тех у кого есть вывод трекбеков к записи. Подробнее тут #comment-2462

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

Пару слов о том, зачем вообще эта штука может пригодиться. Ну, во-первых, это будет полезно для владельцев dofollow блогов, с легкостью можно будет вычислить, кто оставил коммент ради ссылки, а кто ради коммента. Во-вторых, это просто приятно, как вам, так и вашим постоянным комментаторам видеть счетчик активности. Можно придумать какие-нибудь бонусы самым активным комментаторам или еще что-то подобное. Все зависит лишь от вашей фантазии. Когда придумаете, обязательно поделитесь и со мной ;)

Вывод порядкового номера комментария к посту

Вещь, вообще говоря, не новая, на многих блогах она есть, но уверен, что в 99% случаев эта фишка была изначально в теме оформления, которую блогеры берут в паблике. Поэтому я думаю, имеет смысл рассказать о реализации данной функции. К тому же тема сегодняшнего поста это цифры. Давайте посмотрим.

Варианта у нас опять два. Первый – для тех, кто НЕ использует постраничный вывод комментариев. Второй, соответственно — для тех, кто его использует. Напомню, что настройку вывода комментариев можно сделать здесь http://your-blog.ru/wp-admin/options-discussion.php

Вариант первый. Открываем файл /wp-includes/comment-template.php и находим там функцию function start_el. Внутри этой функции находим строку:

1
$GLOBALS['comment'] = $comment;

Прямо перед ней добавляем код:

1
2
3
4
global $comment_num;
if(isset($comment_num)) {
	$comment_num++;
} else { $comment_num = 1; }

Просматривая код ниже, мы наткнемся на такую вещь:

1
2
<div class="comment-meta commentmetadata"> … </div>
<?php comment_text() ?>

Так вот где я оставил три точки, будут вызовы различных функций, и если вы не разбираетесь в этом коде, то советую прямо перед закрывающимся </div> вставить код:

1
&nbsp;&nbsp;#<?php echo $comment_num; ?>

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

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

1
2
3
4
global $comment_num;
if(isset($comment_num)) {
	$comment_num++;
} else { $comment_num = 1; }

Вставлять следующий:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
if ( '' === $args['per_page'] && get_option('page_comments') )
	$args['per_page'] = get_option('comments_per_page');
 
if ( empty($args['per_page']) ) {
	$args['per_page'] = 0;
	$args['page'] = 0;
}
 
if ( $args['per_page'] ) {
	if ( '' == $args['page'] )
		$args['page'] = get_query_var('cpage');
	}
$ccomp = ($args['page']-1) * $args['per_page'] ;
 
global $comment_num;
if(isset($comment_num)) {
	$comment_num++;
} else { $comment_num = 1; }

А вместо:

1
<?php echo $comment_num; ?>

Вставлять:

1
<?php echo $comment_num + $ccomp; ?>

Все просто, правда?

Может случиться так, что в вашей теме оформления формирование html шаблона вывода комментария организовано через функцию mytheme_comment (см. codex). В таком случае можно сделать все по аналогии, только изменения вносить не в /wp-includes/comment-template.php а в соответствующее место функции mytheme_comment в файле functions.php.
Если же возникнут проблемы, то пишите, я обязательно распишу этот вариант более подробно, даже полному новичку будет ясно.

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

С уважением, Александр Алаев
 
Ерунда и баянЪ!Зачет! Плюсую!
+9
 
Оптимизация сайта

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

от 10 000 руб.
Продвижение сайта

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

от 15 000 руб.
Консультация

У вас недостаточно знаний?
Нужен ответ на ряд вопросов?
Хотите узнать мнение эксперта?
Вы задаете вопрос — я на него отвечаю!

1 500 руб./час
 
Получай новости блога АлаичЪ'а на e-mail:
 
Другие посты из категории WordPress:
Что нового на форуме:
  1. Arpjke (15 комм.)

    Думаю оба установлю себе =), спасибо большое за хаки.......

    Ответить
  2. Руслан (4 комм.)

    О как раз то, что надо и своевременно. я как раз собираюсь писать пост по плагинам для комментариев. А тут заглянул в RSS и как раз то что надо=) P. S. Ссылку на этот пос обязательно укажу)

    Ответить
  3. Руслан (4 комм.)

    Блин, почему не придумали плагина для редактирования и исправления отправленного комментария.

    Забыл сказать СПАСИБО автору за подробный обзор

    Ответить
    • АлаичЪ

      Рад, что попал в тему ;) Буду ждать трекбека.

      А над плагином для редактирования своих комментариев надо подумать. Спасибо за идею.

      Ответить
  4. Еремин (1 комм.)

    Как раз сейчас делаю свой шаблон и хотелось что бы все было функционально сразу. Спасибо, в тему.

    Ответить
  5. TiamatInc (93 комм.)

    Прикрутил себе подобную фишку. Хочу сделать маленькое дополнение для твоих функций вывода счетчика постов. Если их ставить так как ты предлагаешь, ты при выводе трекбеков и пингбеков пропадает ссылка на них, может кому-то это и покажется удобно, но в случае с моим шаблоном, надпись "пишет:" с опущенной перед ней ссылкой на источник смотрится дико.

    Чтобы нормально выводились и эти ссылки, надо добавить следующий код в конец функции после закрывающей скобки в if:

    1
    2
    3
    4
    5
    
    else
    {
    	$mycommcounter .= "";
    	return $mycommcounter;
    }

    Так будет смотреться аккуратнее и счетчика у них не будет. ;-)

    Ответить
    • АлаичЪ

      Да да да. Я и забыл, была такая штука, я решал это тем, что изменял вывод трекбеков и add_filter в итоге не применялся к трекбекам. Но потом я вообще трекбеки убрал и про это не вспомнил. Добавлю твою поправочку в пост, наверняка кому-нибудь пригодится, раз нам с тобой пригодилось ;)

      Ответить
      • TiamatInc (93 комм.)

        Рад был помочь, пришлось ненадолго вспомнить, что я все-таки программист по образованию. )))

        Ответить
  6. TiamatInc (93 комм.)

    Да тут и не надо быть программистом. Добавить эти фишки дело пяти минут. ;-)

    Ответить
  7. Alexandr (2 комм.)

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

    Спасибо за обзор.

    Ответить
  8. Kocmoc (77 комм.)

    Спасибо за хаки. Всё попробовал, полезные штуки. TiamatInc тоже спасибо, внёс свою лепту, молодец. Что-то комментаторов маловато, все на отдых ломанулись, я тоже завтра на 3 дня на рыбалку, а потом на море : )

    Ответить
    • TiamatInc (93 комм.)

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

      Ответить
  9. Александр (3 комм.)

    номера комментариев считаются (условно говоря) сверху вниз. например, при ответе на комментарий #10 создастся комментарий #11, даже если после #10 уже были комментарии ##11, 12, etc. т.е. смысл чисто декоративный.

    Ответить
    • АлаичЪ

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

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

      Ответить
      • Александр (3 комм.)

        проблема в том, что наличие нумерации создаёт возможность ссылаться на какой-то комментарий в своём сообщении, указывая его номер, который со временем может измениться. что внесёт неразбериху и путаницу. особенно на блогах с активными дискуссиями. Вы, например, понимая это, ссылались в посте на комментарий 2462, а не #7, верно? т.е. возможность, говоря откровенно, даже вредная. в данном случае глобальный номер комментария из БД будет гораздо правильнее и полезнее. особенно, если его сделать активной ссылкой, скопировав которую, получаешь абсолютный адрес комментария (как в случае с #comment-2462), который можно использовать в собственном комментарии. за это, думаю, многие скажут спасибо.

        Ответить
        • АлаичЪ

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

          Так же повторюсь, что касается это только древовидных комментариев.

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

          Вот ссылка http://alaev.info/post/1247#comment-3017 на комментарий, оставленный вами, на который я сейчас отвечаю ;)

          Ответить
          • Александр (3 комм.)

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

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

            Ответить
          • АлаичЪ

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

            Спор рождает истину, но в нашем случае просто видно кто к чему привык и в чем теперь уверен.

            Ответить
  10. Nomad (3 комм.)

    Спасибо. Все 3 статьи про хаки комментариев очень даже пригодятся — как раз собираю решения без плагинов для нового блога. Заодно и статью напишу со ссылкой на вас.

    Ответить
  11. Geleosan (22 комм.)

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

    Ответить
    • АлаичЪ

      Нет, такого поста у меня не было. А что надо реализовать и как? Может я смогу помочь с этим делом.

      Ответить
  12. Geleosan (22 комм.)

    Спасибо, Алаич за отзывчивость. Но плагин уже нашел, называется iF AJAX Comments For WordPress. Делает возможность добавления комментариев без перезагрузки страницы. Это очень удобно, особенно, если на странице 30 больших фотографий. К сожалению, мало кем используется.

    Так как, у тебя тут хаки, может быть появится время, сделать хак и на эту тему. Как раз для тех кто не любит использовать плагины, или у для тех у кого они не работают. Я 3 плагина перепробовал, и только 4й заработал. Вероятно, есть куча проблем с совместимостью для разных версий вордпресс.

    Ответить
    • АлаичЪ

      Ты про хак связанный с AJAX комментариями? Можно попробовать ;)

      Ответить
      • Geleosan (22 комм.)

        Ага про них самых :) Правда я не знаю насколько это трудозатратно, я не програмер.

        Ответить
        • АлаичЪ

          Я сейчас работаю над "допиливанием" движка DLE. Потом, вероятно, займусь и WP.

          Ответить
  13. Нина (1 комм.)

    Спасибо Вам большое! Везде эту информацию искала, но ничего конкретного не нашла. Тоже поставила по емейл, незнаю правильно ли только... но вроде все кажет...

    Ответить
  14. otshelnik-fm (2 комм.)

    Вариант №2 для подсчета ПО E-MAIL:

    Как в этом варианте выводить без имени? Выводится сейчас так: имя и количество комментариев, пример: Otshelnik-Fm (189 комм.).

    Нужно оставить только цифры (комментарии), чтобы выглядело так: (189 комм.)

    Ответить
    • АлаичЪ

      Что-то вы какую-то фигню задумали, зачем вам безымянные комментарии?

      Для того, чтобы убрать имя автора, надо править шаблоны комментария. Где у вас шаблон комментария можно узнать прочитав в конце поста абзац, начинающийся со слов «Может случиться так, что в вашей теме оформления...»

      Ответить
      • otshelnik-fm (2 комм.)

        Не фигню. Поделюсь что нашел:

        function commentCount() {
         
        global $wpdb;
         
        $count = $wpdb->get_var('SELECT COUNT(comment_ID) FROM ' . $wpdb->comments. ' WHERE comment_author_email = "' . get_comment_author_email() . '"');
         
        echo $count . ' comments';
         
        }

        А выводить <?php commentCount(); ?> выводит только число (в форме коментариев вывожу под аватаркой — как на форумах).

        В чем смысл моего вопроса? Если, как указано у вас, выводить по эмейлу — то отображается ник, тот который был на момент написания. Если в админке автор или подписчик меняет ник, то отображается с старым ником. Если выводить по имени — то это более вероятный путь неправильно посчитанных комментариев. Поэтому и нужна была функция подсчета по эмейлу без указания имени. А имя актуальное берется из другой функции (сравнивается с user_id из бд и display_name)... в общем такая задача.

        Успешно решил, но спасибо всё равно.

        Ответить
        • АлаичЪ

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

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

          Просто задачи у нас разные...

          Ответить
  15. Наталья (26 комм.)

    По подсчету кол-ва комментов по мейлу -есть загвоздочка. У многих разные мейлы и они по-разному бывают их вносят — то один, то другой, а вот по сайту бы еще не помешало, но тут другая загвоздочка — у некотрых сайтов вообще нет... Идеального мало, но плагин наверное тоже так заточен — так что из 2-х зол выберу это ;) Спасибо! Завтра на практике проверю (уже сегодня)

    Ответить
    • Наталья (26 комм.)

      Ну вот вам пример свежий — я внесла здесь свой любимый ящик, а в другом месте ящик, на который граватар заточен. и тут у меня 1-2 коммента, а там тоже наверное 2. А от меня всего 4 на самом деле. Вообще случайно так получилось — говорю же по-разному могут комменты оставлять и сайты разные указывают, те у кого сайтов несколько — так что идеального видимо не будет. Может по айпи правда? как считаете? так можно? Тут правда если он динамический или с разных компьютеров заходит человек, то наверное тоже нельзя и если комп рабочий -а людей несколько например пользуется, то тоже не вариант...

      Ответить
      • Наталья (26 комм.)

        Супер! Заработал у меня счетчик комментариев- даже мои посчитал — всегда было интересно сколько моих в том числе. Огромное спасибо!!!

        Поправочка — я уже научена немного горьким опытом. Наверное не в самом начале файла писать, а отступив вот такой символ:

        <?php

        Далее код вставить. Верно? Я сейчас так сделала все получилось!

        А по второму хаку вопрос: Если наприме не все комментарии утверждаешь, или по какой либо причине удалил и спам посчитаем на всякий случай... как будет работать подсчет? Будет все все все учитывать и ставить порядковый номер или только утвержденные, а если потом решил и удалил комментарий (не факт что вы все мои комменты оставите — может думаете, что я спамер... нет я просто пишу по ходу действий своих) то как будет порядковый номер выводиться?

        Ответить
        • АлаичЪ

          Подсчет по e-mail самый нормальный вариант, так как это обязательное поле в отличие от всех других полей. Айпишники, имена, урлы — это все фигня, ip меняется, имена часто совпадают (когда речь идет именно об имени человека, а не псевдониме), а url часто оставляют пустым, а то и вообще такое поле отсутствует. В общем, вы меня поняли.

          <?php — всегда обозначает начало файла, точнее показывает, что начинается php код. Люди, занимающиеся установкой хаков, должны это знать, для всех остальных есть громоздкие плагины.

          Во втором хаке всегда выводится последовательный набор номеров, так что если, например, на блоге включены древовидные комментарии (как у меня), то номера комментариев могут меняться. Именно по этой причине я отказался от данного хака на моем блоге.

          Ответить
  16. Flora (1 комм.)

    Огромное спасибо за хак — это то, что доктор прописал))

    Только только хотелось бы из каждого номера сделать потенциальную ссылку — это возможно? Если да, то, подскажите как))))

    Ответить
    • АлаичЪ

      Можно и сделать, только это вы сами пилите, я не хочу этим заниматься. Пилить надо /wp-includes/comment-template.php

      Ответить
  17. Виталий (4 комм.)

    В варианте 2 escape уже не работает с новым WP.

    Меняем 2 строки на

    $queryString = "SELECT COUNT (`comment_ID`) as `comments` FROM $wpdb->comments WHERE `comment_author_email` = %s";

    $comments_count = $wpdb->get_var ($wpdb->prepare ($queryString, $comment->comment_author_email));

    Ответить
    • АлаичЪ

      Почему не работает? У меня стоит 4.2 версия WP и в функциях я с момента написания поста ничего не менял. При этом, как видите, кол-во в комментариях выводится.

      Ответить
  18. Ян (1 комм.)

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

    Ответить
    • АлаичЪ

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

      Ответить
Оставь комментарий или спроси через Twitter →

· Малоинформативные комментарии или комментарии, не содержащие вопрос, удаляются.
· В поле URL оставляйте ссылку только на свой сайт/блог. Эта ссылка для админа, посетители ее не увидят.
· Любой html-код отображается в виде текста, любые ссылки неактивны.
· Для спаммеров - БЛОГ НЕ DOFOLLOW!!!