Комментарии в WordPress
Комментарии это отдельная сущность в структуре данных WordPress. Связывают комментарии с записями (постами, таблица wp_posts) и пользователями (таблица wp_users).
Читайте также:
Структура таблиц комментариев в БД
В базе данных WordPress за комментарии отвечают две таблицы: wp_comments и wp_commentmeta. Разберем каждую.
wp_comments
Содержит основные данные комментария.
Поле | Описание и пример значения |
---|---|
comment_ID | ID комментария. (7999) |
comment_post_ID | ID записи к которой относится комментарий. Равно колонке ID в таблице wp_posts (4896) |
comment_author | Имя автора комментария. (Mseo) |
comment_author_email | email автора комментария. (maoru@yandex.ru) |
comment_author_url | URL автора комментария. (http://maeo.ru) |
comment_author_IP | IP автора комментария. Автоматически НЕ определяется. (95.79.52.2) |
comment_approved | Одобрен коммент или нет: 1/0. Это строковое поле и него плагины могут записывать и другие значения, например, 'spam'. Правильнее было бы назвать это поле comment_status, но оно используется в таблице wp_posts. |
comment_agent | User 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_parent | ID родительского комментария. (7998) |
user_id | ID пользователя, который опубликовал комментарий. Равно колонке 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:
Установка куков комментирования для неавторизованных пользователей
Когда неавторизованный пользователь оставляет комментарий, WP устанавливает куки в которых сохраняются введенные данные. Какие куки сохраняются:
'comment_author_' . COOKIEHASH 'comment_author_email_' . COOKIEHASH 'comment_author_url_' . COOKIEHASH // где COOKIEHASH = md5( get_site_option( 'siteurl' ) )
Сохраняет эти куки функция wp_set_comment_cookies().
Она по умолчанию повешена на хук set_comment_cookies в файле /wp-includes/default-filters.php:
add_action( 'set_comment_cookies', 'wp_set_comment_cookies', 10, 3 );
Этот хук срабатывает когда комментарий публикуется через форму комментирвоания comment_form(). Т.е. когда отправляется POST запрос в файл /wp-comments-post.php:
/** * Perform other actions when comment cookies are 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. The user may not exist. * @param bool $cookies_consent Comment author's consent to store 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() | Добавляет новый комментарий в Базу Данных. Фильтрует данные. |