PHP-функция для WordPress “Ответ на комментарий %username%”

PHP-функция для WordPress 'Ответ на комментарий %username%' Я придумал и реализовал очередную полезную фигнюшку для WordPress ツ

Суть

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

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

Вот о чем я говорю:

  1. Если на блоге активирована опция “древовидные комментарии”, было бы очень здорово в письме видеть текст о том, кому был оставлен комментарий: мне, как админу, или же кому-то из комментирующих посетителей. По тексту можно будет сразу понять, не заходя в блог, требует этот комментарий моего ответа или нет.
  2. Так же было бы здорово, если в том же самом письме будет присутствовать прямая ссылка на добавленный комментарий. Опять же это может быть в первую очередь полезно при древовидных комментах. Такая ссылка позволит не искать нужный коммент (ведь он может быть и не в конце списка комментов), а сразу же перейти к нему.

Практика использования этих двух “добавочек” на данном блоге показала, что это весьма полезные штуки. Я уже привык к ним, и в других моих блогах таких функций мне теперь не хватает.

Код PHP-функции

Реализация обоих вещей оказалась довольно простой (эту функцию необходимо запихнуть в файл functions.php вашей темы, если файла нет, то создать его, не забыв добавить <?php и ?> соответственно в начале и в конце файла):

function repliedToComment($text, $comment_id) {
	$comment = get_comment($comment_id);
	$parent_id = $comment->comment_parent;
	$parentComment = get_comment($parent_id);
	if ($parent_id > 0) {
		if ($parentComment->user_id == 1) {
			$text .= "\r\nЭто ответ на мой комментарий.";
		} else {
			$text .= "\r\nВ ответ на комментарий пользователя: " . $parentComment->comment_author;
		}
	}
	$approved = '';
	if ($comment->comment_approved != 1) $approved = ' (необходимо одобрить)';
	$text .= "\r\nОтветить" . $approved . ": " . get_comment_link($comment->comment_ID) . "\r\n";
	return $text;
}
add_filter('comment_notification_text', 'repliedToComment', 10, 2);
add_filter('comment_moderation_text', 'repliedToComment', 10, 2);

Пожалуй, единственное, на что стоит обратить внимание в этом коде, строка:

if ($parentComment->user_id == 1) {

где цифра 1 – это идентификатор пользователя. Думаю, в большинстве случаев он будет таким же.

Как выглядит результат

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

PHP-функция для WordPress 'Ответ на комментарий %username%'

Если это ответ на коммент кого-то из посетителей, то видим текст “В ответ на комментарий пользователя: %username%». Если же это ответ на коммент админа, то текст будет таким: “Это ответ на мой комментарий.” Текст, естественно, можно заменить на какой-то другой.

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

Что дальше?

  1. Есть мысль сделать из этого мой очередной плагин.
  2. Среди пользователей WordPress очень популярен плагин “Subscribe To Comments” (функционал которого, я считаю, уже давно должен быть частью движка), который отправляет письма посетителям сайта, если был оставлен новый коммент. Так вот, если реализовать 2 вышеописанные вещи и для этого плагина, тогда было бы вообще супер – полезность функции существенно бы возросла. Думаю, что это вполне реально сделать.

Комментарии (72)

  1. Дмитрий
    6 марта 2010 г. в 17:06

    Думаю плагин был бы полезнее

  2. 13 марта 2010 г. в 22:27

    Мне кажется, отличная идея. У меня в данный момент на блоге вообще нет “древовидного комментаторства”. Все сплошной полосой идёт. И это очень неудобно. Но после смены дизайна, мне бы хотелось, чтобы сообщения именно в таком виде и приходили.

  3. Favik
    22 марта 2010 г. в 09:56

    Вот это действительная полезная штука! Спасибо тебе!)))

  4. Anton
    28 марта 2010 г. в 01:12

    Я воспользовался вашими советами. Очень удобно, хоть понятно откуда коммент и с чем его есть!

  5. Vladimir
    29 мая 2010 г. в 16:00

    хорошие рекомендации

  6. Владимир
    20 июня 2010 г. в 19:50

    Здравствуйте, я чото та и не понял возможно ли сделать функцию “Уведомление об ответах на мои комментарии по e-mail”

  7. Алексей Шаров
    28 ноября 2010 г. в 14:53

    А можно как-нибудь разбить комментарии на 2 вида, скажем, позитивные и негативные, и пустить их в 2 потока?

    1. Олег
      27 сентября 2011 г. в 15:05 / ответ на коммент Алексей Шаров

      Интересная идея

  8. 25 января 2011 г. в 19:50

    Думаю плагин был бы полезнее

    Чем же?? Тормозами при подзагрузке?? Выносить 20 строк кода в отдельный плагин как то глупо выглядит ИМХО. А открыть function.php редактором и Ctrl+C – Ctrl+V неужели так тяжело сделать?? =)

    А можно как-нибудь разбить комментарии на 2 вида, скажем, позитивные и негативные, и пустить их в 2 потока?

    Как вы себе интересно это представляете?? О_О
    Я так понимаю, если древовидные комментарии отключены то скрипт становится бесполезен (ну за исключением наличия прямой ссылки)?? И еще, не знаете, будет ли он корректно работать с Comment Referrers (плагин\скрипт показывающий откуда пришел на страницу пользователь)??
    А сайт в ссылке первого комментатора и правда жесть. Аж не ожидал =)))

  9. SpiritI
    16 февраля 2011 г. в 11:43

    Итересно)) Реализую у себя!

  10. TimeIndex
    5 сентября 2011 г. в 12:54

    Здравствуйте! Скажите пожалуйста, извиняюсь что не в тему, а у Ваших комментариев кнопка ответить – это стандартная или плагин какой то для древовидных комментариев? Не подскажите?

    1. 5 сентября 2011 г. в 13:08 / ответ на коммент TimeIndex

      И не стандартная, и не плагин. Писал под себя скрипт.

      1. TimeIndex
        5 сентября 2011 г. в 13:10 / ответ на коммент Dimox

        А у Вас на блоге не специальной статьи посвященной этому решению? Я заметил что ссылка ответить не содержит replytocom, с которой у меня постоянные проблемы…

        1. 5 сентября 2011 г. в 13:35 / ответ на коммент TimeIndex

          Нет, я об этом не писал. На этом блоге стоит WordPress 2.3, поэтому пришлось писать скрипт для древовидных комментариев. А в тех версиях WP, где древовидные поддерживаются стандартно, я никаких проблем не испытывал. Странно, что у вас они есть.

          1. TimeIndex
            5 сентября 2011 г. в 13:45 / ответ на коммент Dimox

            Хорошо, спасибо за столь быстрые ответы!

  11. Богдан
    31 октября 2011 г. в 16:05

    Дак а куда именно вставлять код.Куда именно-имеется ввиду в начало,середину или в конец php файла?Я поставил в конец и уменя ничего не изменилось.Помоему этот код хрень полная

    1. 31 октября 2011 г. в 18:15 / ответ на коммент Богдан

      Если хрень, зачем тогда спрашиваешь?

  12. 12 ноября 2011 г. в 05:56

    Скажите, пожалуйста, как возможно настроить ответ на оповещение о необходимости модерации коммента прямо автору коммента, а не wordpress@domain.ru? Заранее спасибо вам!

    1. 12 ноября 2011 г. в 11:35 / ответ на коммент Павел

      Не знаю.

  13. 9 февраля 2012 г. в 16:52

    Здравствуйте! Извините что не совсем близко к теме, но хотел бы спросить у Вас насчет комментариев. Никак не могу найти информацию как сделать чтобы ссылки в имени комментаторов в новом окне, а в имени автора блога в текущем. Понимаю что нужно через условие If, но методом “тыка” не получается…

    Сейчас сделал у себя в /wp-includes/comment-template.php вот так:

    function get_comment_author_link( $comment_ID = 0 ) {
    	/** @todo Only call these functions when they are needed. Include in if... else blocks */
    	$url    = get_comment_author_url( $comment_ID );
    	$author = get_comment_author( $comment_ID );
    
    	if ( empty( $url ) || 'http://' == $url )
    		$return = $author;
    	else
    		$return = "<a target='_blank' href='$url' rel='external nofollow' class='url'>$author</a>";
    	return apply_filters('get_comment_author_link', $return);
    }
    

    Т.е. все ссылки теперь в имени в новом окне, а вот как чтобы у автора блога открывалась в текущем? Буду очень благодарен если подскажете или даже пост напишете об этом)))

    До этого у меня вообще все ссылки открывались в текущем окне и посетители просто уходили с блога. Заранее спасибо!

    1. 9 февраля 2012 г. в 18:03 / ответ на коммент Webliberty

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

      function my_comment_author_url() {
      	$url = get_comment_author_url();
      	$author = get_comment_author();
      	$target = '';
      	if (!preg_match('#'.get_option('home').'#im', $url)) $target = " target='_blank'";
      	if ( empty( $url ) || 'http://' == $url )
      		$return = $author;
      	else
      		$return = "<a$target href='$url' rel='external nofollow' class='url'>$author</a>";
      	return $return;
      }
      add_filter('get_comment_author_link', 'my_comment_author_url', 10000);

      А файл /wp-includes/comment-template.php лучше не трогать.

      1. 9 февраля 2012 г. в 19:28 / ответ на коммент Dimox

        Спасибо Вам огромнейшее! Все получилось и прекрасно функционирует! А из comment-template.php все изменения свои убрал, спасибо)

  14. 1 октября 2012 г. в 14:57

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

    Заранее спасибо!)

    1. 1 октября 2012 г. в 16:54 / ответ на коммент Евгений

      Это стандартная WordPress-функция.

      1. 1 октября 2012 г. в 16:57 / ответ на коммент Dimox

        Ну так ее надо как-то в шаблоне прописать правильно ведь? Когда ставлю галочку в админке, ставлю wp_comment_list, ничего не выходит!( Может за денежку сделаете?

        1. 1 октября 2012 г. в 17:01 / ответ на коммент Евгений

          Посмотрите, как сделано в других шаблонах. Информацию без проблем можно нагуглить.

          1. 1 октября 2012 г. в 17:03 / ответ на коммент Dimox

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

            1. 1 октября 2012 г. в 17:32 / ответ на коммент Евгений
              1. 1 октября 2012 г. в 17:34 / ответ на коммент Dimox

                Там я был!) все проделал.) У Tod-а тоже самое написано, по его текстам тоже делал и ничего, что же буду еще разок пробовать, может что-то упустил!(

      2. 1 октября 2012 г. в 17:01 / ответ на коммент Dimox

        При включении такой функции, комментарии обновляет новую страницу, добавляя параметр –

        replytocom=3047#respond

        но нечего не происходит!(

  15. Ванька
    22 апреля 2013 г. в 00:58

    Здравствуйте!
    Вопрос такой, можно ли как то настроить получения писем только на мои комментарии, как админа?
    Наверно тема устарела, может даже есть что то лучше, Если да посоветуйте пожалуйста! Я пока что не нашел такой функции….
    Заранее спасибо!

    1. 22 апреля 2013 г. в 09:02 / ответ на коммент Ванька

      Насколько я знаю, в WordPress такой возможности нет.

  16. 29 мая 2013 г. в 18:24

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

    1. Существует:

      <?php echo htmlspecialchars( get_comment_link( $comment->comment_ID ) ) ?>
      1. Ох! И как это я раньше не сподобилась её найти? Ну что ж, теперь надо использовать её в деле. :) Спасибо.

  17. Роман
    24 декабря 2015 г. в 04:09

    В wp 4.4. не работает?

    1. Kenny Mccormick
      26 декабря 2015 г. в 00:28 / ответ на коммент Роман
      function addcomm(){
      	$comment = get_comment($comment_id);
      	$parent_id = $comment->comment_parent;
      	$parentComment = get_comment($parent_id);
      	if ($parent_id > 1){
      		$text .='<div style="float: left; margin-top: 1px;">&nbsp;&nbsp;>&nbsp;&nbsp;</div>'. get_avatar( $parentComment, $size='18', $default='' ) .
      		'<a id="anchor" href="' . get_comment_link($parentComment) . '">' .		 	 
      		 	$parentComment->comment_author .
      		'</a>';
      	}
      	echo $text;
      }
      
  18. Константин
    10 января 2018 г. в 21:09

    Здравствуйте! А как получить имя тому, кому отвечаете в комментарии ? Например, как у вас на сайте : Ваш комментарий для: USERNAME. Спасибо.

    1. Нужно разбираться в jQuery. У меня сделано с помощью него.

      1. Константин
        16 января 2018 г. в 20:21 / ответ на коммент Dimox

        Для меня это как на Эвересте подняться, но спасибо за ответ!!!

  19. Vic
    7 октября 2018 г. в 16:31

    Извините, все перебрал. А как получить количество ответов на комментарий?

  20. Валерий
    23 декабря 2020 г. в 19:33

    А есть статья по кастомизации текста в оповещении по электронной почте об оставлении нового комментарии на сайте?

    Хочу его сделать как можно компактнее, к примеру, убрать Новый комментарий к записи “….название статьи…” ибо всё это есть в заголовке письма

Ваш комментарий

Жирный текст

Ссылка

Цитата

Внутристрочный код

CSS-код

HTML-код

JavaScript-код

PHP-код