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 вышеописанные вещи и для этого плагина, тогда было бы вообще супер — полезность функции существенно бы возросла. Думаю, что это вполне реально сделать.
Комментарии (67)
  1. 1
    SpiritI

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

  2. 2
    TimeIndex

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

  3. 7
    Богдан

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

  4. 9

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

  5. 11

    Здравствуйте! Извините что не совсем близко к теме, но хотел бы спросить у Вас насчет комментариев. Никак не могу найти информацию как сделать чтобы ссылки в имени комментаторов в новом окне, а в имени автора блога в текущем. Понимаю что нужно через условие 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);
    }
    

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

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

    • 12

      Следующий код нужно вставить в файл 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 лучше не трогать.

  6. 14

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

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

  7. 22
    Ванька

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

  8. 24

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

  9. 27
    Роман

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

    • 28
      Kenny Mccormick
      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;
      }