WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

wp_list_comments() WP 2.7.0

Выводит комментарии записей (постов, страниц). Функция может принимать ряд параметров и используется в шаблоне для вывода списка комментариев к посту/странице. Некоторые из параметров можно настроить в админ-панели.

Перед этой функцией должна быть вызвана функция comments_template(), которая получает комментарии для вывода из базы данных. Если этого не сделать, то нужно указать второй параметр $comments иначе функция не выведет ничего.

Хуки из функции
Возвращает

HTML/null. HTML списка комментариев, когда параметр echo=1. Null, когда параметр echo=0.

Шаблон использования

<ul class="commentlist">
	<?php        
	wp_list_comments( [
		'walker'            => null,
		'max_depth'         => '',
		'style'             => 'ul',
		'callback'          => null,
		'end-callback'      => null,
		'type'              => 'all',
		'reply_text'        => 'Reply',
		'page'              => '',
		'per_page'          => '',
		'avatar_size'       => 32,
		'reverse_top_level' => null,
		'reverse_children'  => '',
		'format'            => 'html5', // или xhtml, если HTML5 не поддерживается темой
		'short_ping'        => false,    // С версии 3.6,
		'echo'              => true,     // true или false
	] ); 
	?>
</ul>

Использование

<?php wp_list_comments( $args, $comments ); ?>
$args(строка/массив)
Массив аргументов, определяющий вывод комментариев.
По умолчанию: параметры по умолчанию
$comments(массив)
Массив полученный функцией get_comments().
По умолчанию: $wp_query->comments

Аргументы параметра $args

walker(объект)
Экземпляр класса, на основе которого собирается список комментариев.
По умолчанию: null (new Walker_Comment)
max_depth(число)
Глубина вложенности дочерних комментариев. Работает если включена поддержка древовидных комментариев. Параметр устанавливается в админ-панели.
По умолчанию: 5
style(строка)

В каком виде выводить список комментариев. Может быть div, ol или ul. Имейте ввиду, что сам список нужно оборачивать вручную:

<div class="commentlist">
 <?php wp_list_comments(array('style' => 'div')); ?>
</div>

или

<ol class="commentlist">
  <?php wp_list_comments(array('style' => 'ol')); ?>
</ol>

По умолчанию: 'ol'

callback(строка)
Название произвольной функции, которая будет использоваться для формирования вывода каждого комментария.
Указанная тут функция будет вызываться при выводе каждого комментария. Имейте ввиду, что ваша функция обратного вызова (callback) должна содержать открывающий тег <div> или <li> (в зависимости от параметра style), но этот тег не должен закрываться. WordPress впишет закрывающий тег автоматически. Можно использовать параметр end-callback, чтобы изменить его. Такое разделение нужно для древовидных комментариев, когда один коммент вложен в другой.
По умолчанию: нет
меню
end-callback(строка)
Название произвольной функции, которая будет закрывать каждый комментарий. Указанная тут функция будет вызываться при закрытии каждого комментария. Она должна выводить закрывающий тег </div> или </li> в зависимости от параметра style. Callbackи end-callback разделены, для того чтобы правильно выводить древовидные комментарии.
По умолчанию: нет
type(строка)
Какой тип комментариев показывать. Может быть all, comment, trackback, pingback или pings. pings включает в себя 'trackback' и 'pingback'.
По умолчанию: all
per_page(число)

Количество комментариев на странице. Работа этого параметра не так проста:

  • Если параметры page или per_page переданы и они не равны тем что указаны в $wp_query: get_query_var('cpage') и get_query_var('comments_per_page'), то будет создан отдельный запрос на получение всех комментов текущей записи и комментарии будут разделены на страницы пагинации.

  • Если указать пустую строку '' и опция get_option( 'page_comments' ) включена, то этот параметр будет равен опции get_query_var( 'comments_per_page' ).

  • Если параметр пустой (empty), то параметры per_page и page выставятся в 0;

Таким образом, когда нужно вывести все комментарии (без разбивки на страницы пагинации) указывает параметр: per_page=0 и page=1.

По умолчанию: 50

меню
page(число)
Страница пагинации, комментарии которой нужно вывести.
avatar_size(число)
Размер аватара в пикселях.
По умолчанию: 32
reverse_top_level(логический)
Если поставить true (1), то самые последние комментарии будут наверху (обратная сортировка по дате). Влияет только на комментарии верхнего уровня (родительские, те у которых есть или могут быть дочерние комменты).
По умолчанию: false
reverse_children(логический)
Если поставить true, то самые последние комментарии будут наверху (обратная сортировка по дате). Влияет только на дочерние комментарии.
По умолчанию: false
reply_text(строка)
Текст, который нужно показать в ссылке "ответить". Текст используется в функции: get_comment_reply_link().
По умолчанию: 'reply'
login_text(строка)
Текст, который будет показан для не зарегистрированных пользователей, если комменты могут оставлять только зарегистрированные юзеры.
По умолчанию: 'Log in to Reply'
echo(логический)
Выводить код на экран или возвращать для обработки.
По умолчанию: 'true'

Примеры

#1 Использование по умолчанию

Выводит список комментариев. Используется в файле шаблона comments.php. Наличие древовидности и пагинации у комментариев контролируется через админ-панель Опции->Обсуждение.

<ol class="commentlist">
<?php wp_list_comments(); ?>
</ol>

#2 Вывод комментариев с использованием пользовательской функции

Для настройки внешнего вида каждого комментария, можно использовать параметр callback в который указать название функции, а затем создать эту функцию с нужным кодом (выводом):

<ul class="commentlist">
	  <?php wp_list_comments('type=comment&callback=mytheme_comment'); ?>
</ul>

Мы выводим список комментариев (type=comment), т.е. это не пинги, а так же используем свою функцию формирующую внешний вид комментария (callback=mytheme_comment). Функцию mytheme_comment нужно описывать отдельно, можно в файл functions.php или прям в том же файле, где находится этот код (обычно это comments.php).

<?php
function mytheme_comment( $comment, $args, $depth ) {
	if ( 'div' === $args['style'] ) {
		$tag       = 'div';
		$add_below = 'comment';
	} else {
		$tag       = 'li';
		$add_below = 'div-comment';
	}

	$classes = ' ' . comment_class( empty( $args['has_children'] ) ? '' : 'parent', null, null, false );
	?>

	<<?php echo $tag, $classes; ?> id="comment-<?php comment_ID() ?>">
	<?php if ( 'div' != $args['style'] ) { ?>
		<div id="div-comment-<?php comment_ID() ?>" class="comment-body"><?php
	} ?>

	<div class="comment-author vcard">
		<?php
		if ( $args['avatar_size'] != 0 ) {
			echo get_avatar( $comment, $args['avatar_size'] );
		}
		printf(
			__( '<cite class="fn">%s</cite> <span class="says">says:</span>' ),
			get_comment_author_link()
		);
		?>
	</div>

	<?php if ( $comment->comment_approved == '0' ) { ?>
		<em class="comment-awaiting-moderation">
			<?php _e( 'Your comment is awaiting moderation.' ); ?>
		</em><br/>
	<?php } ?>

	<div class="comment-meta commentmetadata">
		<a href="<?php echo htmlspecialchars( get_comment_link( $comment->comment_ID ) ); ?>">
			<?php
			printf(
				__( '%1$s at %2$s' ),
				get_comment_date(),
				get_comment_time()
			); ?>
		</a>

		<?php edit_comment_link( __( '(Edit)' ), '  ', '' ); ?>
	</div>

	<?php comment_text(); ?>

	<div class="reply">
		<?php
		comment_reply_link(
			array_merge(
				$args,
				array(
					'add_below' => $add_below,
					'depth'     => $depth,
					'max_depth' => $args['max_depth']
				)
			)
		); ?>
	</div>

	<?php if ( 'div' != $args['style'] ) { ?>
		</div>
	<?php }
}

callback функция содержит только открывающий тег <li> и он не должен закрываться. Подробнее см. в описании параметра.

#3 Вывод комментариев для определенного поста

Если нужно вывести привычный список комментариев, но при этом в этот список должны попасть только нужные комментарии. Допустим, нам нужно вывести комментарии определенного поста. Для этого сначала получим нужные комментарии, а затем передадим их во второй параметр функции wp_list_comments(), чтобы вывести их в привычном формате. Древовидность, если она установлена, сохраняется.

<ol class="commentlist">
	<?php
		// Получаем комментарии поста с ID XXX из базы данных 
		$comments = get_comments(array(
			'post_id' => XXX,
			'status' => 'approve' // комментарии прошедшие модерацию
		));

		// Формируем вывод списка полученных комментариев
		wp_list_comments(array(
			'per_page' => 10, // Пагинация комментариев - по 10 на страницу
			'reverse_top_level' => false // Показываем последние комментарии в начале
		), $comments);
	?>
</ol>

Заметки

  • Смотрите: WP_Query->comments
  • Global. WP_Query. $wp_query WordPress Query object.
  • Global. Число. $comment_alt
  • Global. Число. $comment_depth
  • Global. Число. $comment_thread_alt
  • Global. true/false. $overridden_cpage
  • Global. true/false. $in_comment_loop

Список изменений

С версии 2.7.0 Введена.

Код wp list comments: wp-includes/comment-template.php WP 5.3.1

<?php
function wp_list_comments( $args = array(), $comments = null ) {
	global $wp_query, $comment_alt, $comment_depth, $comment_thread_alt, $overridden_cpage, $in_comment_loop;

	$in_comment_loop = true;

	$comment_alt        = 0;
	$comment_thread_alt = 0;
	$comment_depth      = 1;

	$defaults = array(
		'walker'            => null,
		'max_depth'         => '',
		'style'             => 'ul',
		'callback'          => null,
		'end-callback'      => null,
		'type'              => 'all',
		'page'              => '',
		'per_page'          => '',
		'avatar_size'       => 32,
		'reverse_top_level' => null,
		'reverse_children'  => '',
		'format'            => current_theme_supports( 'html5', 'comment-list' ) ? 'html5' : 'xhtml',
		'short_ping'        => false,
		'echo'              => true,
	);

	$parsed_args = wp_parse_args( $args, $defaults );

	/**
	 * Filters the arguments used in retrieving the comment list.
	 *
	 * @since 4.0.0
	 *
	 * @see wp_list_comments()
	 *
	 * @param array $parsed_args An array of arguments for displaying comments.
	 */
	$parsed_args = apply_filters( 'wp_list_comments_args', $parsed_args );

	// Figure out what comments we'll be looping through ($_comments)
	if ( null !== $comments ) {
		$comments = (array) $comments;
		if ( empty( $comments ) ) {
			return;
		}
		if ( 'all' != $parsed_args['type'] ) {
			$comments_by_type = separate_comments( $comments );
			if ( empty( $comments_by_type[ $parsed_args['type'] ] ) ) {
				return;
			}
			$_comments = $comments_by_type[ $parsed_args['type'] ];
		} else {
			$_comments = $comments;
		}
	} else {
		/*
		 * If 'page' or 'per_page' has been passed, and does not match what's in $wp_query,
		 * perform a separate comment query and allow Walker_Comment to paginate.
		 */
		if ( $parsed_args['page'] || $parsed_args['per_page'] ) {
			$current_cpage = get_query_var( 'cpage' );
			if ( ! $current_cpage ) {
				$current_cpage = 'newest' === get_option( 'default_comments_page' ) ? 1 : $wp_query->max_num_comment_pages;
			}

			$current_per_page = get_query_var( 'comments_per_page' );
			if ( $parsed_args['page'] != $current_cpage || $parsed_args['per_page'] != $current_per_page ) {
				$comment_args = array(
					'post_id' => get_the_ID(),
					'orderby' => 'comment_date_gmt',
					'order'   => 'ASC',
					'status'  => 'approve',
				);

				if ( is_user_logged_in() ) {
					$comment_args['include_unapproved'] = get_current_user_id();
				} else {
					$unapproved_email = wp_get_unapproved_comment_author_email();

					if ( $unapproved_email ) {
						$comment_args['include_unapproved'] = array( $unapproved_email );
					}
				}

				$comments = get_comments( $comment_args );

				if ( 'all' != $parsed_args['type'] ) {
					$comments_by_type = separate_comments( $comments );
					if ( empty( $comments_by_type[ $parsed_args['type'] ] ) ) {
						return;
					}

					$_comments = $comments_by_type[ $parsed_args['type'] ];
				} else {
					$_comments = $comments;
				}
			}

			// Otherwise, fall back on the comments from `$wp_query->comments`.
		} else {
			if ( empty( $wp_query->comments ) ) {
				return;
			}
			if ( 'all' != $parsed_args['type'] ) {
				if ( empty( $wp_query->comments_by_type ) ) {
					$wp_query->comments_by_type = separate_comments( $wp_query->comments );
				}
				if ( empty( $wp_query->comments_by_type[ $parsed_args['type'] ] ) ) {
					return;
				}
				$_comments = $wp_query->comments_by_type[ $parsed_args['type'] ];
			} else {
				$_comments = $wp_query->comments;
			}

			if ( $wp_query->max_num_comment_pages ) {
				$default_comments_page = get_option( 'default_comments_page' );
				$cpage                 = get_query_var( 'cpage' );
				if ( 'newest' === $default_comments_page ) {
					$parsed_args['cpage'] = $cpage;

					/*
					* When first page shows oldest comments, post permalink is the same as
					* the comment permalink.
					*/
				} elseif ( $cpage == 1 ) {
					$parsed_args['cpage'] = '';
				} else {
					$parsed_args['cpage'] = $cpage;
				}

				$parsed_args['page']     = 0;
				$parsed_args['per_page'] = 0;
			}
		}
	}

	if ( '' === $parsed_args['per_page'] && get_option( 'page_comments' ) ) {
		$parsed_args['per_page'] = get_query_var( 'comments_per_page' );
	}

	if ( empty( $parsed_args['per_page'] ) ) {
		$parsed_args['per_page'] = 0;
		$parsed_args['page']     = 0;
	}

	if ( '' === $parsed_args['max_depth'] ) {
		if ( get_option( 'thread_comments' ) ) {
			$parsed_args['max_depth'] = get_option( 'thread_comments_depth' );
		} else {
			$parsed_args['max_depth'] = -1;
		}
	}

	if ( '' === $parsed_args['page'] ) {
		if ( empty( $overridden_cpage ) ) {
			$parsed_args['page'] = get_query_var( 'cpage' );
		} else {
			$threaded            = ( -1 != $parsed_args['max_depth'] );
			$parsed_args['page'] = ( 'newest' == get_option( 'default_comments_page' ) ) ? get_comment_pages_count( $_comments, $parsed_args['per_page'], $threaded ) : 1;
			set_query_var( 'cpage', $parsed_args['page'] );
		}
	}
	// Validation check
	$parsed_args['page'] = intval( $parsed_args['page'] );
	if ( 0 == $parsed_args['page'] && 0 != $parsed_args['per_page'] ) {
		$parsed_args['page'] = 1;
	}

	if ( null === $parsed_args['reverse_top_level'] ) {
		$parsed_args['reverse_top_level'] = ( 'desc' == get_option( 'comment_order' ) );
	}

	wp_queue_comments_for_comment_meta_lazyload( $_comments );

	if ( empty( $parsed_args['walker'] ) ) {
		$walker = new Walker_Comment;
	} else {
		$walker = $parsed_args['walker'];
	}

	$output = $walker->paged_walk( $_comments, $parsed_args['max_depth'], $parsed_args['page'], $parsed_args['per_page'], $parsed_args );

	$in_comment_loop = false;

	if ( $parsed_args['echo'] ) {
		echo $output;
	} else {
		return $output;
	}
}

Cвязанные функции

Из метки: Список (wp_list списки)

Еще из раздела: Комментарии

Еще из тегов шаблона: Комментарии

59 комментов
Полезные 5 Вопросы 2 Все
  • Denis

    Добрый день! У меня почему то данная функция не выводит комментарии, но если выводить через get_comments() - то все ок, в чем может быть проблема?

    Ответить26.Окт.2018 в 12:55 #
    • @ campusboy3434 www.youtube.com/c/wpplus

      Здравствуйте. Возможно, в невнимательности. Прочитайте второй абзац из этой статьи. Этот шаг был проделан?

      2
      Ответить26.Окт.2018 в 13:02 #
      • Denis

        Спасибо большое! Действительно невнимательность smile

        Ответить26.Окт.2018 в 13:09 #
  • Дмитрий

    Добрый день! Не подскажите как задать размеры аватара в этом коде ?

    <?php
    if ( $args['avatar_size'] != 50 ) { // Ставлю 50 но ни чего не меняется
    	echo get_avatar( $comment, $args['avatar_size'] );
    }
    printf(
    	__( '%s' ),
    	get_comment_author_link()
    );
    ?>
    Ответить19.Мар.2019 в 11:50 #
  • Кама, добрый день, столкнулся с проблемой. Реализовал частичный вывод комментариев, и по клику на кнопку вывожу все комментарии, но есть одно но, я указываю в

     wp_list_comments('type=all&callback=mytheme_comment&per_page=10');
    

    и подсчет выведенного ведется только по родительским комментам, а я вывожу кнопку "Показать еще" если

    $comment_number = get_comments_number($post_id__c);
    
    		if( $comment_number >= 10 ) {
    					?>
    					<form class="see_more_form" method="post">
    						<input class="hide" type="hidden" name="button_value" value="<?php echo $post_id__c; ?>">
    						<input type="submit" name="submit_btn" id="see_more" value="Показать еще">
    					</form>
    					<?php
    				}
    			 ?>

    то есть, если количество комментариев >= 10. Но вот get_comments_number считает общее количество комментариев, а мне, по факту, нужны только комментарии верхнего уровня.

    Может подскажете каким образом я могу решить данную задачку?

    Ответить10.Июн.2019 в 19:10 #
  • Добрый день, использую этот код

        <?php
    		// Получаем комментарии нескольких постов с ID XXX из базы данных 
    		$comments = get_comments(array(
    			'post_in' => XXX, // массив id постов
    			'hierarchical' => false,
    			'status' => 'approve' // комментарии прошедшие модерацию
    		));
    
    		// Формируем вывод списка полученных комментариев
    		wp_list_comments(array(
    			'per_page' => 4, // Пагинация комментариев - по 4 на страницу
    			'reverse_top_level' => false // Показываем последние комментарии в начале
    		), $comments);
    
    		the_comments_pagination();
    	?>

    для вывода комментариев с определенных страниц. Комментарии выводятся, НО ...

    1. Выводятся комментарии всех уровней вложенности, как выводить только родительские?
    2. Ни как не хочет выводится пагинация, т.е. сами комментарии разбиваются, а пагинация не выводится, в чем может быть проблема?
    Ответить23.Сен.2019 в 10:43 #
Здравствуйте, !     Войти . Зарегистрироваться