WordPress как на ладони
rgbcode is looking for WordPress developers.

get_comments()WP 2.7.0

Получает комментарии по указанным параметрам, в виде массива данных.

Работает на основе: WP_Comment_Query()

Хуков нет.

Возвращает

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

author_email(строка)
email автора комментария, комментарии которого нужно получить.
По умолчанию: ''
author__in(число/массив)
ID автора, комментарии которого нужно получить. Можно указать ID нескольких авторов в массиве. В запросе используется поле user_id.
По умолчанию: ''
author__not_in(число/массив)
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()
post_author(число)
ID автора записи, комментарии которых нужно получить. В запросе используется поле post_author из таблицы записей wp_posts.
По умолчанию: ''
post_author__in(число/массив)
ID авторов записей, комментарии которых нужно получить. Можно указать ID нескольких авторов в массиве.
post_author__not_in(число/массив)
ID авторов записей, комментарии которых НЕ нужно получать. Можно указать ID нескольких авторов в массиве.
По умолчанию: ''
post_id(число)
ID поста/страницы. Если указать этот параметр, то функция вернет только комментарии к указанному посту или странице.
По умолчанию: ''
post__in(массив)
ID записей, комментарии которых нужно получить.
По умолчанию: ''
post__not_in(массив)
ID записей, комментарии которых нужно исключить.
По умолчанию: ''
post_status(строка)
Статус записи. Будут получены комментарии записей имеющих этот статус. Например publish.
По умолчанию: ''
post_type(строка)
Тип записи. Будут получены комментарии записей имеющих этот тип. Например page.
По умолчанию: ''
post_name(строка)
Название записи (ярлык записи), комментарии которой нужно получить.
По умолчанию: ''
post_parent(число)
ID записи, комментарии дочерних записей которой нужно получить.
По умолчанию: ''
Условия поиска, по которому будут получены комментарии.
По умолчанию: ''
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.

Примеры

0

#1 Выведет все комментарии к посту 15 (включая спам и не одобренные).

$comments = get_comments('post_id=15');
foreach( $comments as $comment ){
	echo( $comment->comment_author );
}
0

#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 );
}
0

#3 Выведем на экран количество комментариев поста.

$comments = get_comments( [
	'post_id' => 1, // используйте post_id, а не post_ID
	'count'   => true // возвращает только count
] );

echo $comments;
0

#4 Выведем количество комментариев пользователя.

$args = array(
	'user_id' => 1,
	'count'   => true
);
$comments = get_comments( $args );
echo $comments
0

#5 Выведем комментарии пользователя.

$args = array(
	'user_id' => 1, // ID пользователя

);
$comments = get_comments( $args );
foreach( $comments as $comment ){
	echo( $comment->comment_author . '<br />' . $comment->comment_content );
}
0

#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 );
}
0

#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

*/
0

#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
*/
0

#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
*/
0

#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() WP 6.6.2

function get_comments( $args = '' ) {
	$query = new WP_Comment_Query();
	return $query->query( $args );
}
24 комментария
Полезные 1Вопросы 1 Все
    Войти