get_comments()
Получает комментарии по указанным параметрам, в виде массива данных.
Хуков нет.
Возвращает
WP_Comment[]|int[]|int. Массив объектов комментариев:
Array ( [0] => stdClass Object ( [comment_ID] => 7999 [comment_post_ID] => 4896 [comment_author] => Kama [comment_author_email] => mail@bk.ru [comment_author_url] => [comment_author_IP] => 65.229.196.81 [comment_date] => 2014-09-08 13:16:09 [comment_date_gmt] => 2014-09-08 09:16:09 [comment_content] => текст комментария [comment_karma] => 0 [comment_approved] => 1 [comment_agent] => [comment_type] => [comment_parent] => 7989 [user_id] => 1 [comment_subscribe] => N ) [1] => stdClass Object ( Аналогичные данные, как в объекте 0 ) )
Или число, когда указано получить кол. комментариев.
Шаблон использования
$args = array(
'author_email' => '',
'author__in' => '',
'author__not_in' => '',
'include_unapproved' => '',
'fields' => '',
'comment__in' => '',
'comment__not_in' => '',
'karma' => '',
'number' => '',
'offset' => '',
'no_found_rows' => true,
'orderby' => '',
'order' => 'DESC',
'parent' => '',
'post_author__in' => '',
'post_author__not_in' => '',
'post_id' => 0,
'post__in' => '',
'post__not_in' => '',
'post_author' => '',
'post_name' => '',
'post_parent' => '',
'post_status' => '',
'post_type' => '',
'status' => 'all',
'type' => '',
'type__in' => '',
'type__not_in' => '',
'user_id' => '',
'search' => '',
'count' => false,
'meta_key' => '',
'meta_value' => '',
'meta_query' => '',
'date_query' => null, // See WP_Date_Query
'hierarchical' => false,
'update_comment_meta_cache' => true,
'update_comment_post_cache' => false,
);
if( $comments = get_comments( $args ) ){
foreach( $comments as $comment ){
// действия
}
}
Использование
$comments = get_comments( $args );
foreach( $comments as $comment ){
// вывод
}
Аргументы параметра $args
- email автора комментария, комментарии которого нужно получить.
По умолчанию: '' - ID автора, комментарии которого нужно получить. Можно указать ID нескольких авторов в массиве. В запросе используется поле user_id.
По умолчанию: '' - ID автора, комментарии которого нужно исключить. Можно указать ID нескольких авторов в массиве. В запросе используется поле user_id.
По умолчанию: '' - comment__in(массив/число)
- ID комментариев которые нужно получить.
По умолчанию: '' - comment__not_in(массив/число)
- ID комментариев которые нужно исключить.
По умолчанию: '' - count(true/false)
- При true функция вернет общее число комментариев. При false массив объектов комментариев.
По умолчанию: false - include_unapproved(массив)
- Массив ID или email пользователей, неодобренные комментарии которых будут включены в результат, неважно какой статус бы указан в параметре
status.
По умолчанию: '' - karma(число)
- Получить комментарии с указанным числом karma.
По умолчанию: '' - parent(число)
- ID комментария, дочерние комментарии которого нужно получить. Указываем ID и запрос будет строиться по полю
comment_parent=указанное число.
Если включен параметрhierarchical, то в результат также будут добавлены вложенные комментарии (не только те которые указаны в этом параметре)
По умолчанию: '' - parent__in(массив)
- Массив ID комментариев, дочерние комментарии которых нужно получить. Тоже что и parent, только указываются сразу несколько ID.
По умолчанию: array() - parent__not_in(массив)
- ID комментариев, дочерние комментарии которых НЕ нужно получать. Противоположность параметра parent__in.
По умолчанию: array() - ID автора записи, комментарии которых нужно получить. В запросе используется поле post_author из таблицы записей wp_posts.
По умолчанию: '' - ID авторов записей, комментарии которых нужно получить. Можно указать ID нескольких авторов в массиве.
- ID авторов записей, комментарии которых НЕ нужно получать. Можно указать ID нескольких авторов в массиве.
По умолчанию: '' - post_id(число)
- ID поста/страницы. Если указать этот параметр, то функция вернет только комментарии к указанному посту или странице.
По умолчанию: '' - post__in(массив)
- ID записей, комментарии которых нужно получить.
По умолчанию: '' - post__not_in(массив)
- ID записей, комментарии которых нужно исключить.
По умолчанию: '' - post_status(строка)
- Статус записи. Будут получены комментарии записей имеющих этот статус. Например
publish.
По умолчанию: '' - post_type(строка)
- Тип записи. Будут получены комментарии записей имеющих этот тип. Например
page.
По умолчанию: '' - post_name(строка)
- Название записи (ярлык записи), комментарии которой нужно получить.
По умолчанию: '' - post_parent(число)
- ID записи, комментарии дочерних записей которой нужно получить.
По умолчанию: '' - search(строка)
- Условия поиска, по которому будут получены комментарии.
По умолчанию: '' - status(строка)
Вернет комментарии с этим статусом. Может принимать параметры:
all- все комментарииhold- не одобренные комментыapprove- одобренные комментыspam- спамtrash- корзинаpost-trashed- комментарии записей из корзины
По умолчанию: 'all'
- orderby(строка/массив)
Поле из таблицы БД по которому нужно отсортировать вывод. Можно указывать несколько полей через пробел или запятую. Можно указывать метаданные комментария:
Поля основной таблицы (comments):
- comment_agent
- comment_approved
- comment_author
- comment_author_email
- comment_author_IP
- comment_author_url
- comment_content
- comment_date
- comment_date_gmt
- comment_ID
- comment_karma
- comment_parent
- comment_post_ID
- comment_type
- user_id
Метаполя. При этом должен быть установлен параметр $meta_key:
- meta_value
- meta_value_num
Чтобы сортировать по определенному метаполю из параметра $meta_query, задайте индекс для запроса $meta_query, а тут впишите этот индекс.
Можно указать несколько полей в массиве. При этом в индексе нужно указать название поля, а в значении направление сортировки. Например:
array('comment_date'=>'ASC', 'comment_karma'=>'DESC')Подробнее читайте здесь.Можно указать false, array() или 'none', чтобы отключить часть запроса ORDER BY.
По умолчанию: 'comment_date_gmt'
- order(строка)
- Порядок сортировки:
ASC(123),DESC(321). Игнорируется если в orderby указан ассоциативный массив.
По умолчанию: DESC - number(число)
- Ограничения выводимых комментариев (укажите макс. число). Оставьте пустым, чтобы получить все комментарии.
По умолчанию: '' - offset(число)
- Количество комментариев, которые нужно пропустить с начала (сверху результата). Используется для построения SQL LIMIT части запроса. Применяется для создания пагинации.
По умолчанию: 0 - no_found_rows(логический)
- Нужно ли отключить SQL_CALC_FOUND_ROWS в запросе.
По умолчанию: true - meta_key(строка)
- Получить комментарии с указанным мета ключом.
По умолчанию: '' - meta_value(строка)
- Получить комментарии с указанным значением метаполя. Должен быть указан параметр
meta_key.
По умолчанию: '' - meta_query(массив)
- Для создания сложных запросов по метаданным. Заменяет параметры meta_key и meta_value. Работает также как meta_query в WP_Query.
По умолчанию: '' - date_query(массив)
- Фильтр по дате комментариев. Смотрите WP_Date_Query
По умолчанию: null - fields(строка)
- Поля которые будут возвращены. Может быть
ids- получит только ID комментариев, или пусто - получит все поля.
По умолчанию: '' - type(строка/массив)
- Тип комментариев которые нужно получить. Можно указать несколько типов в массиве. Может быть:
comment(равно''),pings(включает pingback и trackback), или любой другой произвольный тип.
По умолчанию: '' (comment) - type__in(строка/массив)
- Получить только комментарии с указанным типом.
По умолчанию: '' - type__not_in(строка/массив)
- Получить все комментарии, кроме комментариев с указанным типом.
По умолчанию: '' - user_id(число)
- Вернет только комментарии указанного пользователя. Аналог параметра author__in.
По умолчанию: '' - hierarchical(строка/логический)
Нужно ли включить дочерние комментарии в результат. Можно указать следующие параметры:
-
'threaded'— вернет дерево со всеми дочерними комментариям. Дочерние комментарии будут добавлены в свойство $children первого (наивысшего) объекта WP_Comment. -
'flat'— вернет «плоский» массив, комментарии и их дочерние комментарии. false— дочерние комментарии не будут включены в результат.
Параметр игнорируется (устанавливается в false), когда $fields = 'ids' или 'counts'.
По умолчанию: false
-
- update_comment_meta_cache(логический)
- Нужно ли сбросить мета-кэш для полученных комментариев?
По умолчанию: true - update_comment_post_cache(логический)
- Нужно ли сбросить мета-кэш для записей (постов) комментариев?
По умолчанию: false
При использовании параметров типа post_* запрос строиться на базе таблицы записей wp_posts. И если например указать post_author__in, то будут получены все комментарии записей, авторами которых являются указанные пользователи.
А вот, если указать author__in, то будут получены отдельные комментарии указанных пользователей.
Добавлено в версии 4.4.0. Сортировка по полю comment__in. Параметры: $update_comment_meta_cache, $no_found_rows, $hierarchical, $update_comment_post_cache, $parent__in, $parent__not_in.
Примеры
#1 Выведет все комментарии к посту 15 (включая спам и не одобренные).
$comments = get_comments('post_id=15');
foreach( $comments as $comment ){
echo( $comment->comment_author );
} #2 Покажет 5 не одобренных комментариев.
$comments = get_comments( [
'status' => 'hold',
'number' => '5',
'post_id' => 1, // правильно post_id, а не post_ID
] );
foreach( $comments as $comment ){
echo( $comment->comment_author . '<br />' . $comment->comment_content );
} #3 Выведем на экран количество комментариев поста.
$comments = get_comments( [ 'post_id' => 1, // используйте post_id, а не post_ID 'count' => true // возвращает только count ] ); echo $comments;
#4 Выведем количество комментариев пользователя.
$args = array( 'user_id' => 1, 'count' => true ); $comments = get_comments( $args ); echo $comments
#5 Выведем комментарии пользователя.
$args = array(
'user_id' => 1, // ID пользователя
);
$comments = get_comments( $args );
foreach( $comments as $comment ){
echo( $comment->comment_author . '<br />' . $comment->comment_content );
} #6 Удалим, идущие подряд, одинаковые комментарии.
Сравниваем автора и контент комментария.
// Получим все комментарии с пустым аргументом number
$all_comments = get_comments( [
'status' => 'approve',
'number' => '',
] );
// массив который будет содержать ID дублей комментариев
$comment_ids_to_delete = [];
foreach( $all_comments as $k => $c ){
$kk = $k-1; // Предыдущий индекс комментария в массиве $all_comments
$pc = $all_comments[ $kk ]; // предыдущий объект комментария
// Если автор и контент одинаковые, добавляем комментарий в массив для удаления
if(
$pc->comment_author === $c->comment_author
&&
$pc->comment_content === $c->comment_content
){
$comment_ids_to_delete[] = $pc->comment_ID;
}
}
// Удаляем комментарии по ID
foreach( $comment_ids_to_delete as $comm_id ){
wp_delete_comment( $comm_id );
} #7 Получим последние комментарии списком.
Этот код получает последние 10 комментариев в виде списка UL. Где текст комментария укорочен до 50 символов и является ссылкой на сам комментарий:
$args = array(
'number' => 10,
'orderby' => 'comment_date',
'order' => 'DESC',
'type' => '', // только комментарии, без пингов и т.д...
);
if( $comments = get_comments( $args ) ){
echo '<ul>';
foreach( $comments as $comment ){
$comm_link = get_comment_link( $comment->comment_ID ); // может быть тяжелый запрос ...
$comm_short_txt = mb_substr( strip_tags( $comment->comment_content ), 0, 50 ) .'...';
echo '<li>'. $comment->comment_author .': <a rel="nofollow" href="'. $comm_link .'">'. $comm_short_txt .'</a></li>';
}
echo '</ul>';
}
/*
Данные в объекте $comment
stdClass Object
[comment_ID] => 9727
[comment_post_ID] => 477
[comment_author] => Andrew
[comment_author_email] => mail@gmail.com
[comment_author_url] =>
[comment_author_IP] => 178.45.177.200
[comment_date] => 2015-22-01 00:27:04
[comment_date_gmt] => 2015-22-28 21:27:04
[comment_content] => текст коммента
[comment_karma] => 0
[comment_approved] => 1
[comment_agent] => Mozilla/5.0 (Windows NT 6.1; WOW64; rv:36.0)
[comment_type] =>
[comment_parent] => 9724
[user_id] => 313
*/ #8 Пример получения дочерних комментариев в виде дерева
Пример того, как работает параметр 'hierarchical' => 'threaded':
$comments = get_comments([ 'parent' => 22384, 'hierarchical' => 'threaded', ]); /* Получим (некоторые поля объекта WP_Comment удалены для наглядности): Array [22986] => WP_Comment Object [comment_ID] => 22986 [comment_post_ID] => 8342 [comment_author] => camp [comment_date] => 2018-04-11 19:07:08 [comment_content] => Добавлено. [comment_type] => [comment_parent] => 22430 [populated_children:protected] => 1 [children:protected] => Array [22998] => WP_Comment Object [comment_ID] => 22998 [comment_post_ID] => 8342 [comment_author] => Максим [comment_date] => 2018-04-12 12:15:25 [comment_content] => Работает отлично. Спасибо! [comment_type] => [comment_parent] => 22986 [populated_children:protected] => 1 [children:protected] => Array [23035] => WP_Comment Object [comment_ID] => 23035 [comment_post_ID] => 8342 [comment_author] => camp [comment_date] => 2018-04-16 15:36:00 [comment_content] => Спасибо за обратную связь! [comment_type] => [comment_parent] => 22998 [children:protected] => [populated_children:protected] => 1 [22982] => WP_Comment Object [comment_ID] => 22982 [comment_post_ID] => 8342 [comment_author] => Максим [comment_date] => 2018-04-11 12:12:00 [comment_content] => > Супер, если бы еще запилить вывод суммарного рейтинга. [comment_type] => [comment_parent] => 22430 [populated_children:protected] => 1 [children:protected] => Array [22985] => WP_Comment Object [comment_ID] => 22985 [comment_post_ID] => 8342 [comment_author] => camp [comment_date] => 2018-04-11 19:05:57 [comment_content] => Здравствуй. Судя по вопросу, тебе не подсказать надо, а сразу сделать готовое. [comment_type] => [comment_parent] => 22982 [children:protected] => [populated_children:protected] => 1 */
#9 Запрос get_comments() через WP_Comment_Query
Такой запрос может пригодится когда нам нужен доступ к свойствам объекта WP_Comment_Query. Например, в свойствах мы можем посмотреть запрос, который получается при указанных параметрах запроса.
$args = [ 'meta_query' => [ [ 'key' => 'condition', 'value' => 'to_delete' ] ], 'date_query' => [ [ 'before' => '5 month ago' ] ], 'orderby' => [ 'comment_ID' => 'DESC' ], 'number' => 100 ]; $query = new WP_Comment_Query; $comments = $query->query( $args ); // выведем запрос echo $query->request; /* SELECT wp_comments.comment_ID FROM wp_comments INNER JOIN wp_commentmeta ON ( wp_comments.comment_ID = wp_commentmeta.comment_id ) WHERE ( ( comment_approved = '0' OR comment_approved = '1' ) ) AND ( ( wp_commentmeta.meta_key = 'condition' AND wp_commentmeta.meta_value = 'to_delete' ) ) AND ( wp_comments.comment_date < '2020-02-26 11:48:03' ) GROUP BY wp_comments.comment_ID ORDER BY wp_comments.comment_ID DESC LIMIT 0,100 */
#10 Создание пагинации комментариев
Код ниже показывает, как в WordPress вывести комментарии пользователя со ссылками пагинации. Для этого нужно использовать класс WP_Comment_Query. Допустим мы выводим комментарии на странице В результате получим следующий код пагинации:/user-comments и номер страницы пагинации мы ходим добавлять через GET параметр ?pagenum=10. Выводить будем по 50 комментариев на странице. Для создания HTML кода ссылок пагинации будем использовать функцию paginate_links().$per_page = 50;
$pagenum = $_GET['pagenum'] ?? 1;
$offset = ($pagenum - 1) * $per_page;
$paged_url_patt = home_url( preg_replace( '/[?&].*/', '', $_SERVER['REQUEST_URI'] ) ) .'?pagenum=%#%';
$query = new WP_Comment_Query;
$comments = $query->query( [
'order' => 'DESC',
'user_id' => $user_id,
'offset' => $offset,
'number' => $per_page,
'no_found_rows' => false,
] );
//$total_comments = (int) $query->found_comments;
$max_pages = (int) $query->max_num_pages;
$paginate_links = paginate_links( [
'base' => $paged_url_patt,
'current' => $pagenum,
'total' => $max_pages
] );
echo $paginate_links;
<a class="prev page-numbers" href="https://wp-kama.dev/profile/comments?pagenum=2">← Ранее</a>
<a class="page-numbers" href="https://wp-kama.dev/profile/comments?pagenum=1">1</a>
<a class="page-numbers" href="https://wp-kama.dev/profile/comments?pagenum=2">2</a>
<span aria-current="page" class="page-numbers current">3</span>
<a class="page-numbers" href="https://wp-kama.dev/profile/comments?pagenum=4">4</a>
<a class="page-numbers" href="https://wp-kama.dev/profile/comments?pagenum=5">5</a>
<span class="page-numbers dots">…</span>
<a class="page-numbers" href="https://wp-kama.dev/profile/comments?pagenum=75">75</a>
<a class="next page-numbers" href="https://wp-kama.dev/profile/comments?pagenum=4">Далее →</a>
Список изменений
| С версии 2.7.0 | Введена. |
Код get_comments() get comments WP 6.9
function get_comments( $args = '' ) {
$query = new WP_Comment_Query();
return $query->query( $args );
}