Коментарі в WordPress

Коментарі це окрема сутність у структурі даних WordPress. Зв’язують коментарі із записами (постами, таблиця wp_posts ) та користувачами (таблиця wp_users ).


Структура таблиць коментарів у БД

У базі даних WordPress за коментарі відповідають дві таблиці: wp_comments та wp_commentmeta . Розберемо кожну.

повну
схему таблиць .


wp_comments

Містить основні дані коментарів.

ПолеОпис та приклад значення
comment_IDID коментаря. (7999)
comment_post_IDID запису до якої належить коментар. Рівно колонці ID таблиці wp_posts (4896)
comment_authorІм’я автора коментаря. (Mseo)
comment_author_emailemail автора коментаря. ([email protected])
comment_author_urlURL автора коментаря. ( http://maeo.ru )
comment_author_IPIP автора коментаря. Автоматично не визначається. (95.79.52.2)
comment_approvedСхвалений комент чи ні: 1/0. Це рядкове поле і його плагіни можуть записувати інші значення, наприклад, ‘spam’. Правильніше було б назвати це поле comment_status , але воно використовується в таблиці wp_posts .
comment_agentUser agent автора коментаря. (Mozilla/5.0 (Windows…)
comment_dateДата та час відправки коментаря. У MySQL форматі. (2015-09-01 16:28:33)
comment_date_gmtДата та час відправки коментаря в GMT зоні. (2015-09-01 16:28:33)
comment_contentТекст коментарю. (Вітаю, вище вказаний…)
comment_karmaКарма коментаря. (0)
comment_typeТип коментарю. За замовчуванням ВП використовуються три типи: comment– звичайний комент (до версії 5.0 був порожнім рядком ). trackbackта pingback. Про них читайте тут .
comment_parentID батьківського коментаря. (7998)
user_idID користувача, що опублікував коментар. Рівно колонці ID у таблиці wp_users(123)

ВАЖЛИВО! Довжина значення поля comment_type = 20 символів ! Приклад максимально допустимої довжини: new_question_comment.

Приклад того, як таке обмеження може зіпсувати код: припустимо, у нас є додатковий тип коментаря question_comment. Деякі з таких коментарів згодом потрапляють до архіву, при цьому нам потрібно додати префікс archive-до типу. Робимо ми це так:

// $com - це об'єкт оброблюваного коментаря
wp_update_comment([
	'comment_ID' => $com->comment_ID,
	'comment_type' => "archive-$com->comment_type", // archive-question_comment
]);

В результаті таке оновлення не спрацює і що важливіше ми не побачимо жодної помилки – нічого! Щоб зрозуміти чому не оновлюється, доведеться лізти в нетрі ядра ВП.


wp_commentmeta

Містить додаткові дані коментаря. З коробки в цю таблицю нічого не записується, вона потрібна для розширення функціоналу коментування, щоб додати додаткові дані.


Висновок коментарів у темі

Для виведення коментарів на сторінці потрібно використовувати функцію comments_template() у тому місці, де нам потрібно показати список коментарів. Ця функція зробить запит та збере коментарі для сторінки.

Також у тему потрібно додати файл comments.php. У ньому потрібно описати висновок коментарів:

  • Потрібно перевірити чи є коментарі на сторінці. Робиться це за допомогою змінної $comemnts , яка встановлюється в comments_template()$comments = & $wp_query->commentsі доступна в цьому файлі. Також перевірити наявність коментарів на сторінці можна функцією have_comments() . Далі якщо:
    • коментарі є , потрібно використовувати функцію wp_list_comments() , щоб вивести список коментарів.
    • коментарів немає , потрібно вивести повідомлення, що їх немає.
  • Потрібно вивести форму коментування. comment_form () .

Приклад файлу comments.php із теми Twenty Twenty:

<?php
/**
 * The template file for displaying the comments and comment form for the
 * Twenty Twenty theme.
 *
 * @package WordPress
 * @subpackage Twenty_Twenty
 * @since Twenty Twenty 1.0
 */

/*
 * If the current post is protected by a password and
 * the visitor has not yet entered the password we will
 * return early without loading the comments.
*/
if (post_password_required()) {
	return;
}

if ( $comments ) {
	?>

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

		<?php
		$comments_number = absint( get_comments_number() );
		?>

		<div class="comments-header section-inner small max-percentage">

			<h2 class="comment-reply-title">
				<?php
				if ( ! have_comments() ) {
					_e ( 'Leave a comment', 'twentytwenty');
				}
				elseif ( 1 === $comments_number ) {
					/* translators: %s: Post title. */
					printf( _x( 'One reply on “%s”', 'comments title', 'twentytwenty' ), get_the_title() );
				}
				else {
					printf(
					/* translators: 1: Number of comments, 2: Post title. */
						_nx(
							'%1$s reply on “%2$s”',
							'%1$s replies on “%2$s”',
							$comments_number,
							'comments title',
							'twentytwenty'
						),
						number_format_i18n( $comments_number ),
						get_the_title()
					);
				}

				?>
			</h2><!-- .comments-title -->

		</div><!-- .comments-header -->

		<div class="comments-inner section-inner thin max-percentage">

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

			$comment_pagination = paginate_comments_links(
				array(
					'echo' => false,
					'end_size' => 0,
					'mid_size' => 0,
					'next_text' => __( 'Newer Comments', 'twentytwenty' ) . '<span aria-hidden="true">→</span>',
					'prev_text' => '<span aria-hidden="true">←</span> ' . __( 'Older Comments', 'twentytwenty' ),
				)
			);

			if ( $comment_pagination ) {
				$pagination_classes = '';

				// If we're only showing the "Next" link, add a class indicating so.
				if ( false === strpos( $comment_pagination, 'prev page-numbers' ) ) {
					$pagination_classes = 'only-next';
				}
				?>

				<nav class="comments-pagination pagination<?php echo $pagination_classes; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- static output ?>" aria-label="<?php esc_attr_e( 'Comments' twentytwenty'); ?>">
					<?php echo wp_kses_post( $comment_pagination ); ?>
				</nav>

				<?php
			}
			?>

		</div><!-- .comments-inner -->

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

	<?php
}

if ( comments_open() || pings_open() ) {

	if ( $comments ) {
		echo '<hr class="styled-separator is-style-wide" aria-hidden="true" />';
	}

	comment_form(
		array(
			'class_form' => 'section-inner thin max-percentage',
			'title_reply_before' => '<h2 id="reply-title" class="comment-reply-title">',
			'title_reply_after' => '</h2>',
		)
	);

}
elseif (is_single()) {

	if ( $comments ) {
		echo '<hr class="styled-separator is-style-wide" aria-hidden="true" />';
	}

	?>

	<div class="comment-respond" id="respond">

		<p class="comments-closed"><?php _e( 'Comments are closed.', 'twentytwenty' ); ?></p>

	</div><!-- #respond -->

	<?php
}

Коли неавторизований користувач залишає коментар, WP встановлює куки, в яких зберігаються введені дані. Які куки зберігаються:

'comment_author_' . COOKIEHASH
'comment_author_email_' . COOKIEHASH
'comment_author_url_' . COOKIEHASH

// де COOKIEHASH = md5( get_site_option( 'siteurl' ) )

Зберігає ці куки функція wp_set_comment_cookies() .

За промовчанням вона повішена на хук /wp-includes/default-filters.php :

add_action( 'set_comment_cookies', 'wp_set_comment_cookies', 10, 3);

Цей хук спрацьовує коли коментар публікується через форму коментування /wp-comments-post.php :

/**
 * Perform other actions when comment cookies є set.
 *
 * @ Since 3.4.0
 * @since 4.9.6 The `$cookies_consent` parameter was added.
 *
 * @param WP_Comment $comment Comment object.
 * @param WP_User $user Comment author's user object. User не може бути.
 * @param bool $cookies_consent Коментарі автора входять до магазину cookies.
 */
do_action( 'set_comment_cookies', $comment, $user, $cookies_consent);

Використовуйте wp_get_current_commenter() , щоб отримати дані цих cookies.

Для роботи цієї функції потрібно, щоб була включена опція show_comments_cookies_opt_in: ” Обговорення ” → чекбокс ” Показувати галочку дозволу установки куки для авторів коментарів “.

Коли ця опція включена, то у формі коментування буде виведена галочка “”, якщо галочка включена, то із запитом відправляється поле $_POST['wp-comment-cookies-consent'], ця опція надалі передається третій параметр wp_set_comment_cookies() .


Функції коментарів

Це список функцій, що часто використовуються. Повний список дивіться тут .

comments_template()Підвантажує файл шаблону коментарів на сторінці запису: /comments.php із папки теми.
wp_list_comments()Виводить коментарі записів (постів, сторінок). Функція може приймати ряд параметрів і використовується у шаблоні для виведення списку коментарів до посту/сторінки. Деякі параметри можна налаштувати в адмін-панелі.
comment_form()Виводить на екран готовий код форми коментування.
get_comments()Отримує коментарі за вказаними параметрами у вигляді масиву даних.
get_comment()Отримує дані вказаного коментаря із бази даних. Повертає екземпляр класу WP_Comment (умовно можна сказати, що повертаються всі поля таблиці wp_comments ).
get_comments_number()Отримує кількість усіх коментарів посту, включаючи повідомлення та пінги.
wp_count_comments()Отримує дані про кількість коментарів на сайті або окремо для вказаного посту. Дані збираються окремо за типами коментів (всі варіанти поля comment_approved : approved , spam і т.д.).
get_comment_date()Отримує дату вказаного коментаря.
get_avatar_url()Отримує посилання на аватар, надісланий email, ID або об’єкт користувача. Також можна передати об’єкт посту чи коментаря.
comment_reply_link()Виводить посилання <a> , яке дозволяє відповідати на коментар. Тег використовується в циклі коментарів для кожного коментаря.
edit_comment_link()Виводить посилання (HTML тег A) на редагування поточного в циклі коментаря, якщо користувач має право на це.
comment_link()Виводить посилання (URL) коментаря.
paginate_comments_links()Виводить список посилань на сторінки коментарів (посилання пагінації), поточного посту.
wp_insert_comment()Вставляє/додає коментар до бази даних.
wp_new_comment()Додає новий коментар до Бази Даних. Фільтрує дані.

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

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