Как получить верхний (корневой) комментарий по любому дочернему комментарию
В WordPress нет встроенной функции для получения верхнего комментария для указанного комментария. Для этого можно воспользоваться функциями get_ancestors()
и get_post_ancestors()
для постов или таксономий.
Зачем нам это нужно?
Иногда может потребоваться проверить, является ли текущий комментарий верхним в ветке комментариев. Если не является, то нам необходимо найти корневой комментарий в этой ветке.
Ниже я представлю функцию, которая решает эту задачу и позволяет получить родительский комментарий любого уровня.
Функция для получения корневого комментария
/**
* Получает верхний уровень комментария для указанного комментария.
*
* @param int|WP_Comment $child_comment Идентификатор дочернего комментария.
*
* @return WP_Comment|null Возвращает null в случае ошибки.
*/
function get_top_comment( $child_comment ) {
$top_comm = get_comment( $child_comment );
if( ! $top_comm ) {
return null; // Если комментарий не найден, возвращаем null
}
$ancestors = [ $top_comm->comment_ID ]; // Массив для хранения идентификаторов предков
while( $top_comm->comment_parent ) { // Пока есть родитель
$parent_comm = get_comment( $top_comm->comment_parent ); // Получаем родительский комментарий
if( ! $parent_comm ) {
return $top_comm; // Если родитель не найден, возвращаем текущий верхний комментарий
}
// Проверка на бесконечный цикл
if( in_array( $parent_comm->comment_ID, $ancestors, true ) ) {
trigger_error( "Комментарий $parent_comm->comment_ID нарушает дерево комментариев." );
return null; // Возвращаем null в случае ошибки
}
$ancestors[] = $parent_comm->comment_ID; // Добавляем идентификатор родителя в массив
$top_comm = $parent_comm; // Переходим к родительскому комментарий
}
return $top_comm; // Возвращаем верхний комментарий
}
Пример использования функции
Предположим, у нас есть следующая ветка комментариев (идентификаторы комментариев):
- 10
- 20
- 30
Если мы передадим любой из этих идентификаторов в функцию get_top_comment()
, то в ответе получим объект WP_Comment
для комментария с ID 10:
$top_comment = get_top_comment( 30 ); // Возвращает комментарий 10
$top_comment = get_top_comment( 20 ); // Возвращает комментарий 10
$top_comment = get_top_comment( 10 ); // Возвращает комментарий 10
Пример объекта WP_Comment
При любом из указанных выше вызовов мы получим объект:
WP_Comment Object
(
[comment_ID] => 10
[comment_post_ID] => 95
[comment_author] => Johnny
[comment_author_email] => [email protected]/cdn-cgi/l/email-protection
[comment_author_url] =>
[comment_author_IP] => 162.210.194.38
[comment_date] => 2020-11-12 11:27:59
[comment_date_gmt] => 2020-11-12 06:27:59
[comment_content] => Текст комментария
[comment_karma] => 0
[comment_approved] => 1
[comment_agent] => Mozilla/5.0 (Windows NT 6.3; Win64; x64)
[comment_type] => comment
[comment_parent] => 0
[user_id] => 0
[children:protected] =>
[populated_children:protected] =>
)
Теперь вы знаете, как получить корневой комментарий по идентификатору любого комментария в WordPress!