Как можно получить уровень вложенности комментария? 3 способа

Этот вопрос возник передо мной, когда я разрабатывал асинхронные AJAX-комментарии на своём сайте.

Когда я начинал над ними работать, такие вещи как disqus и комменты из соц сетей ещё не были широко распространены, а мне вот хотелось на своём сайте иметь офигенскую систему комментариев на AJAX со всей сопутствующей функциональностью — в данном случае вложенностью комментариев.

Способ 1. Вступление для начинающих

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

Вот пример комментариев со вложенностью. То есть, когда посетитель нажимает на кнопку «Ответить» к комментарию другого пользователя, то в итоге его сообщение появится с небольшим сдвигом вправо — это и есть вложенность.

пример древовидных комментариев в WordPress
Пример вложенности комментариев в WordPress

Что делать, если на вашем сайте нет кнопки «Ответить»? Есть два варианта:

  1. Вы можете сами включить вложенность в «Настройки > Обсуждение»
    включаем древовидные комментарии в админке
  2. Ваша тема просто не поддерживает древовидные комментарии.

Остальная часть поста будет только про код.

Способ 2. Получение уровня вложенности при помощи глобальных переменных $comment_depth и $GLOBALS[‘comment_depth’]

Возможно вы знаете и даже используете функцию wp_list_comments() — она нужна для вывода комментариев на сайте в виде списка.

Ну во-первых скажу, что в этой функции всё предусмотрено и комментарии выводятся уже с учётом заданного уровня вложенности.

Во-вторых, wp_list_comments позволяет задавать собственный шаблон (функцию) вывода комментариев при помощи параметра callback, например:

wp_list_comments('callback=my_custom_comment_template');

В функции my_custom_comment_template() получить уровень вложенности комментария тоже проще простого — достаточно обратиться к глобальной переменной $comment_depth или $GLOBALS['comment_depth']:

global $comment_depth;
echo $comment_depth;
echo $GLOBALS['comment_depth'];

Дело в том, что глобальная переменная больше нигде и по сути и не работает.

Способ 3. Как узнать уровень вложенности комментария по его ID

Окей, как узнать вложенность комментария, если глобальная переменная $comment_depth недоступна, а всё, что у нас имеется — это ID комментария.

Конечно, тут всё зависит от задач, которые перед вами стоят, тем не менее вот универсальная функция для получения «глубины» коммента:

function true_get_comment_depth( $comment_id ) {
	$depth = 0;
	while( $comment_id > 0  ) { // не знаю, можно ли тут обойтись без цикла, если знаете как, буду рад вашим предложениям
		$comment = get_comment( $comment_id );
		$comment_id = $comment->comment_parent;
		$depth++;
	}
	return $depth;
}

Затем в любом месте кода используем её:

echo true_get_comment_depth( 532 ); // например выведем уровень вложенности комментария с ID 532
Подпишитесь, чтобы раз в неделю получать свежие статьи с блога по email.

По теме

Оставить комментарий / вопрос

phpjsHTMLCSSSQLПросто код
  Для того, чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или авторизуйтесь на сайте.
Получайте новости блога по email или следите за мной в социальных сетях.
  • Миша: Да, точно)

  • Владимир: и на третьей строке не хватает скобки ) закрывающей if :)

  • Миша: Добрый вечер! Рекомендую получить ID пользователя через функцию get_current_user_id().

  • Дмитрий: Миша, подскажите пожалуйста, я использую такой редирект, но он не срабатывает: add_action( 'template_redirect', funct...

  • Миша: Ну как не определена - это аргумент функции. Или я просто вас не до конца понимаю.