Этот вопрос возник передо мной, когда я разрабатывал асинхронные AJAX-комментарии на своём сайте.
Когда я начинал над ними работать, такие вещи как disqus и комменты из соц сетей ещё не были широко распространены, а мне вот хотелось на своём сайте иметь офигенскую систему комментариев на AJAX со всей сопутствующей функциональностью — в данном случае вложенностью комментариев.
Способ 1. Вступление для начинающих
Так как мой сайт посещают не только продвинутые в WordPress люди, но и новички, сделаю эту небольшую главу-вступление, чтобы в двух словах рассказать, что вообще такое вложенность комментария и как её можно определить «на глаз».
Вот пример комментариев со вложенностью. То есть, когда посетитель нажимает на кнопку «Ответить» к комментарию другого пользователя, то в итоге его сообщение появится с небольшим сдвигом вправо — это и есть вложенность.
Что делать, если на вашем сайте нет кнопки «Ответить»? Есть два варианта:
Остальная часть поста будет только про код.
Способ 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