wp_list_comments() WP 2.7.0

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

Ця функція сама собою нічого не робить. Вона повинна бути викликана з файлу шаблону коментарів, наприклад, comments.phpякий, у свою чергу, повинен бути підключений функцією comments_template() .

Розглянемо з прикладу:

Файл сторінки/поста, до якого ви бажаєте вставити коментарі:

<?php comments_template('/comments.php'); ?>

Потім у файлі comments.php:

<div>
	<?php wp_list_comments(); ?>
</div>

Чому слід робити саме так? Перед цією функцією має бути викликана функція comments_template() . Вона отримує з бази даних коментарі для виведення, які потім використовує цю функцію. Якщо цього не зробити, то потрібно вказати другий параметр $comments, де вказати коментарі, які ми хочемо вивести.

Хуки з функції

Повертає

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
(об’єкт)
Примірник класу, на основі якого збирається список коментарів. За промовчанням за висновок відповідає клас
Walker_Comment .


Типово: 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
(рядок)

Назва функції, яка формуватиме HTML виведення кожного коментаря.

Вказана тут функція буде викликатись при виведенні кожного коментаря. Майте на увазі, що функція повинна містити тег <div> або <li> (залежно від параметра style ), але цей тег не повинен закриватися. WordPress впише закриває тег автоматично. Можна змінити параметр end-callback, щоб змінити його.

Такий поділ потрібний для деревоподібних коментарів, коли один комент вкладений в інший.

Функція отримає три параметри $comment, $args, $depth. За замовчуванням викликається метод:

Типово: null


end-callback
(рядок)

Назва функції, яка формуватиме HTML виведення закриття кожного коментаря.

Вказана функція буде викликатися при закритті кожного коментаря. Вона повинна виводити тег </div> або </li> (залежно від параметра style ).

Параметри callbackі end-callbackрозділені, щоб правильно виводити деревоподібні коментарі.

Типово: null


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

#1 Висновок коментарів з використанням функції користувача

Для налаштування зовнішнього вигляду кожного коментаря, можна використовувати параметр 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> і він не повинен закриватися. Докладніше див. у описі параметра.

0

#2 За замовчуванням

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

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

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

#4 Приклад використання параметра walker та створення свого класу

Приклад файлу comments.php:

<?php
if (post_password_required()) {
	return;
}

if ( $comments ) {
	?>

	<div class="comments" id="comments">

		<?php
		wp_list_comments(
			array(
				'walker' => new TwentyTwenty_Walker_Comment(),
				'avatar_size' => 120,
				'style' => 'div',
			)
		);
		?>

	</div><!-- comments -->

	<?php
}

Клас Волкера

<?php

/**
 * CUSTOM COMMENT WALKER
 * Як custom walker for comments, заснований на walker в Twenty Nineteen.
 *
 * @since Twenty Twenty 1.0
 */
class TwentyTwenty_Walker_Comment extends Walker_Comment {

	/**
	 * Outputs a comment в форматі HTML5.
	 *
	 * @since Twenty Twenty 1.0
	 *
	 * @see wp_list_comments()
	 * @see https://developer.wordpress.org/reference/functions/get_comment_author_url/
	 * @see https://developer.wordpress.org/reference/functions/get_comment_author/
	 * @see https://developer.wordpress.org/reference/functions/get_avatar/
	 * @see https://developer.wordpress.org/reference/functions/get_comment_reply_link/
	 * @see https://developer.wordpress.org/reference/functions/get_edit_comment_link/
	 *
	 * @param WP_Comment $comment Comment to display.
	 * @param int $depth Відомості про поточний коментар.
	 * @param array $args An array of arguments.
	 */
	protected function html5_comment( $comment, $depth, $args ) {

		$tag = ( 'div' === $args['style'] ) ? 'div': 'li';

		?>
		<<? php echo $tag; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- static output ?> id="comment-<?php comment_ID(); ?>" <?php comment_class( $this->has_children ? 'parent' : '' , $ Comment); ?>>
			<article id="div-comment-<?php comment_ID(); ?>" class="comment-body">
				<footer class="comment-meta">
					<div class="comment-author vcard">
						<?php
						$ comment_author_url = get_comment_author_url ($ comment);
						$ comment_author = get_comment_author ($ comment);
						$avatar = get_avatar( $comment, $args['avatar_size'] );
						if ( 0 !== $args['avatar_size'] ) {
							if ( empty( $comment_author_url ) ) {
								echo wp_kses_post($avatar);
							} else {
								printf( '<a href="%s" rel="external nofollow" class="url">', $comment_author_url ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped --Escaped in https://developer.wordpress.org/reference/functions/get_comment_author_url/
								echo wp_kses_post($avatar);
							}
						}

						printf(
							'<span class="fn">%1$s</span><span class="screen-reader-text says">%2$s</span>',
							esc_html( $comment_author ),
							__( 'says:', 'twentytwenty' )
						);

						if ( ! empty( $comment_author_url ) ) {
							echo '</a>';
						}
						?>
					</div><!-- .comment-author -->

					<div class="comment-metadata">
						<?php
						/* translators: 1: Comment date, 2: Comment time. */
						$comment_timestamp = sprintf( __( '%1$s at %2$s', 'twentytwenty' ), get_comment_date( '', $comment ), get_comment_time() );

						printf(
							'<a href="%s"><time datetime="%s" title="%s">%s</time></a>',
							esc_url( get_comment_link( $comment, $args ) ),
							get_comment_time( 'c' ),
							esc_attr( $comment_timestamp ),
							esc_html( $comment_timestamp )
						);

						if ( get_edit_comment_link() ) {
							printf(
								' <span aria-hidden="true">•</span> <a class="comment-edit-link" href="%s">%s</a>',
								esc_url( get_edit_comment_link() ),
								__( 'Edit', 'twentytwenty' )
							);
						}
						?>
					</div><!-- .comment-metadata -->

				</footer><!-- .comment-meta -->

				<div class="comment-content entry-content">

					<?php

					comment_text();

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

					?>

				</div><!-- .comment-content -->

				<?php

				$comment_reply_link = get_comment_reply_link(
					array_merge(
						$args,
						array(
							'add_below' => 'div-comment',
							'depth' => $depth,
							'max_depth' => $args['max_depth'],
							'before' => '<span class="comment-reply">',
							'after' => '</span>',
						)
					)
				);

				$by_post_author = twentytwenty_is_comment_by_post_author( $comment );

				if ( $comment_reply_link | | $ by_post_author ) {
					?>

					<footer class="comment-footer-meta">

						<?php
						if ( $comment_reply_link ) {
							echo $comment_reply_link; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Link is escaped in https://developer.wordpress.org/reference/functions/get_comment_reply_link/
						}
						if ( $by_post_author ) {
							echo '<span class="by-post-author">' . __( 'By Post Author', 'twentytwenty' ) . '</span>';
						}
						?>

					</footer>

					<?php
				}
				?>

			</article><!-- .comment-body -->

		<?php
	}
}

нотатки

  • Дивіться: WP_Query->comments
  • Global. WP_Query. $wp_query WordPress Query object.
  • Global. int. $comment_alt
  • Global. int. $comment_depth
  • Global. int. $comment_thread_alt
  • Global. true | false. $overridden_cpage
  • Global. true | false. $in_comment_loop

список змін

З версії 2.7.0Введено.

wp list comments WP 6.0.2

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 На array 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 {
		/*
		 * Якщо 'page' або 'per_page' мають бути пропущені, і тому не збираються, що в $wp_query,
		 * Perform a separate comment query and allow Walker_Comment до 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'] = array( 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;
				}
			}

			// Інші, 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;

					/*
					* Коли перша сторінка розповідає про останні коментарі, post permalink is the same as
					* the comment permalink.
					*/
				} elseif ( 1 == $cpage ) {
					$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'] = (int) $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 = новий 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;
	}
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *