Как получить комментарий верхнего (корневого) уровня по любому дочернему комментарию
В 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;
}
Пример использования
Предположим, у нас есть эта ветка комментариев (указаны идентификаторы комментариев):
102030
Теперь, если мы передадим любой из этих идентификаторов функции 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] => )