В WordPress нет функции, которая получает комментарий верхнего уровня для указанного комментария. А вот для постов или таксономий такая функция есть, это: get_ancestors() и get_post_ancestors().
Как мы можем проверить, является ли текущий комментарий WordPress верхним (главным родителем) в ветке комментариев. Если текущий комментарий не является корневым, то нам нужно найти корневой комментарий (комментарий верхнего уровня) в дереве комментариев.
То есть нам нужна функция, которая получает верхний комментарий в ветке комментариев независимо от того, какой комментарий дерева мы передаем в нее.
Ниже я написал свою функцию, которая решает эту задачу и получает верхний родительский комментарий указанного комментария.
/** * Retrieves top level comment of specified comment. * * @param int|WP_Comment $child_comment * * @return WP_Comment|null Null on error. */ function get_top_comment( $child_comment ){ $top_comm = get_comment( $child_comment ); if( ! $top_comm ){ return 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; } // infinite loop if( in_array( $parent_comm->comment_ID, $ancestors, true ) ){ trigger_error( "Comment $parent_comm->comment_ID breaks comment tree." ); return null; } $ancestors[] = $parent_comm->comment_ID; $top_comm = $parent_comm; } return $top_comm; }
Пример использования
Предположим, у нас есть эта ветка комментариев (указаны идентификаторы комментариев):
10
20
30
Теперь, если мы передадим любой из этих идентификаторов функции get_top_comment(), в ответ мы получим объект WP_Comment комментария 10
:
$top_comment = get_top_comment( 30 ); $top_comment = get_top_comment( 20 ); $top_comment = get_top_comment( 10 );
Любая из этих строк извлекает такой объект:
WP_Comment Object ( [comment_ID] => 10 [comment_post_ID] => 95 [comment_author] => Johnny [comment_author_email] => eonovich@gmail.com [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 text [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] => )