Привет друзья, давно я ничего не писал о модернизации нашего с вами любимого 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 | #<?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.
Если же возникнут проблемы, то пишите, я обязательно распишу этот вариант более подробно, даже полному новичку будет ясно.
На сегодня все, дорогие мои. Надеюсь, что мои наработки в очередной раз окажутся для вас полезными. Буду благодарен за любые отзывы и комментарии.


(Итоговый рейтинг: +4 / 12)
Думаю оба установлю себе =), спасибо большое за хаки.......
О как раз то, что надо и своевременно. я как раз собираюсь писать пост по плагинам для комментариев. А тут заглянул в RSS и как раз то что надо=) P. S. Ссылку на этот пос обязательно укажу)
Блин, почему не придумали плагина для редактирования и исправления отправленного комментария.
Забыл сказать СПАСИБО автору за подробный обзор
Рад, что попал в тему ;) Буду ждать трекбека.
А над плагином для редактирования своих комментариев надо подумать. Спасибо за идею.
Как раз сейчас делаю свой шаблон и хотелось что бы все было функционально сразу. Спасибо, в тему.
Прикрутил себе подобную фишку. Хочу сделать маленькое дополнение для твоих функций вывода счетчика постов. Если их ставить так как ты предлагаешь, ты при выводе трекбеков и пингбеков пропадает ссылка на них, может кому-то это и покажется удобно, но в случае с моим шаблоном, надпись "пишет:" с опущенной перед ней ссылкой на источник смотрится дико.
Чтобы нормально выводились и эти ссылки, надо добавить следующий код в конец функции после закрывающей скобки в if:
Так будет смотреться аккуратнее и счетчика у них не будет. ;-)
Да да да. Я и забыл, была такая штука, я решал это тем, что изменял вывод трекбеков и add_filter в итоге не применялся к трекбекам. Но потом я вообще трекбеки убрал и про это не вспомнил. Добавлю твою поправочку в пост, наверняка кому-нибудь пригодится, раз нам с тобой пригодилось ;)
Рад был помочь, пришлось ненадолго вспомнить, что я все-таки программист по образованию. )))
Да тут и не надо быть программистом. Добавить эти фишки дело пяти минут. ;-)
Про порядковый номер комментария понравилось, будем внедрять.
Спасибо за обзор.
Спасибо за хаки. Всё попробовал, полезные штуки. TiamatInc тоже спасибо, внёс свою лепту, молодец. Что-то комментаторов маловато, все на отдых ломанулись, я тоже завтра на 3 дня на рыбалку, а потом на море : )
Всегда пожалуйста. Просто когда начал прикручивать себе, наткнулся на проблему. Грех было не поделиться решением.
номера комментариев считаются (условно говоря) сверху вниз. например, при ответе на комментарий #10 создастся комментарий #11, даже если после #10 уже были комментарии ##11, 12, etc. т.е. смысл чисто декоративный.
Ну да, это так. Обычный цикл. Иначе никак. Можно, например, выводить глобальный номер комментария из БД, но я думаю это тем более никому не интересно.
Эта проблема, о которой вы упомянули, касается только блогов, у которых активирована древовидная схема комментирования.
проблема в том, что наличие нумерации создаёт возможность ссылаться на какой-то комментарий в своём сообщении, указывая его номер, который со временем может измениться. что внесёт неразбериху и путаницу. особенно на блогах с активными дискуссиями. Вы, например, понимая это, ссылались в посте на комментарий 2462, а не #7, верно? т.е. возможность, говоря откровенно, даже вредная. в данном случае глобальный номер комментария из БД будет гораздо правильнее и полезнее. особенно, если его сделать активной ссылкой, скопировав которую, получаешь абсолютный адрес комментария (как в случае с #comment-2462), который можно использовать в собственном комментарии. за это, думаю, многие скажут спасибо.
Ну видите ли, обычно на какой-то из комментариев при обсуждении ссылается автор блога, а не комментаторы, участвующие в дискуссии. По крайней мере я видел такое в единичных случаях.
Так же повторюсь, что касается это только древовидных комментариев.
Еще я считаю, что показывать глобальный номер это некрасиво (чисто эстетически). А ссылка именно на нужный комментарий она есть. Вот, например, возьмите и наведите сейчас на дату и время оставления комментария и получите прямую ссылку в нужное место.
Вот ссылка на комментарий, оставленный вами, на который я сейчас отвечаю ;)
с первым утверждением совершенно не согласен: в горячих дискуссиях ссылаются все. особенно, когда нет цивилизованной возможности цитировать собеседников. кроме этого, касается это не только древовидных комментариев, но и случаев удаления сообщений (спамерских, оскорбительных, etc).
с абсолютно ссылкой на конкретный комментарий, содержащейся под датой и временем, согласен. но интуитивно понятней — под номером, как, например, на форумах. впрочем, спор у нас выходит довольно беспредметный. читаю Вас с интересом, учусь новому. спасибо.
Кстати, хорошая идея сделать глобальную ссылку комментария не только на дату, но и на номер. Пожалуй надо будет подправить немного код.
Спор рождает истину, но в нашем случае просто видно кто к чему привык и в чем теперь уверен.