Немного о настройке вывода комментариев в WordPress. Довольно часто сталкиваюсь с тем, что верстальщики придумывают некие нестандартные для WordPress конструкции для вывода комментариев. В каких-то случаях html-конструкцию можно привести стандартному формату поработав с css, заменив какие-то теги, но это не всегда быстрый и простой путь.
Древовидные/вложенные комментарии
Одна из сложностей — это вывод так называемых nested комментариев (древовидных или вложенных), т.е. комментариев, которые написаны в ответ на чей-то и должны отображаться таким образом, чтобы визуально было понятно, что это ответ. Количество nested комментариев лучше всего ограничить до 2х, иначе могут возникнуть проблемы с их корректным отображением, т.к. в вёрстке обычно не предусмотрено наличие более двух уровней и многоуровневые обсуждение — явление довольно редкое. Ограничить nested комментарии можно тут: Настройки — Обсуждение — Разрешить древовидные (вложенные) комментарии глубиной уровней.
Вывод комментариев
Осуществляется при помощи функции wp_list_comments() с указанием дополнительных параметров, например:
1 |
<?php wp_list_comments('type=comment&callback=my_comment&style=div&end-callback=end_comment'); ?> |
Функция для вывода комментариев обозначается как callback=my_comment
Функция для закрытия тегов или вывода другой дополнительной информации: end-callback=end_comment
Обе функции можно расположить либо в comments.php либо в functions.php
Стандартные функции вывода можно взять здесь: codex.wordpress.org Подробное описание на русском: wp-kama.ru
Для понимания того, что возвращает стандартная функция wordpress можно воспользоваться var_damp’ом:
1 |
<?php var_dump($comment); ?> |
Она вернёт что-то подобное:
1 |
object(WP_Comment)#4508 (18) { ["comment_ID"]=> string(1) "6" ["comment_post_ID"]=> string(2) "31" ["comment_author"]=> string(5) "admin" ["comment_author_email"]=> string(18) "admin@wintersea.ru" ["comment_author_url"]=> string(0) "" ["comment_author_IP"]=> string(11) "95.53.4.195" ["comment_date"]=> string(19) "2018-02-19 23:37:52" ["comment_date_gmt"]=> string(19) "2018-02-19 20:37:52" ["comment_content"]=> string(44) "Третий комментарий........." ["comment_karma"]=> string(1) "0" ["comment_approved"]=> string(1) "1" ["comment_agent"]=> string(78) "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0" ["comment_type"]=> string(0) "" ["comment_parent"]=> string(1) "0" ["user_id"]=> string(1) "1" ["children":protected]=> array(0) { } ["populated_children":protected]=> bool(true) ["post_fields":protected]=> array(21) { [0]=> string(11) "post_author" [1]=> string(9) "post_date" [2]=> string(13) "post_date_gmt" [3]=> string(12) "post_content" [4]=> string(10) "post_title" [5]=> string(12) "post_excerpt" [6]=> string(11) "post_status" [7]=> string(14) "comment_status" [8]=> string(11) "ping_status" [9]=> string(9) "post_name" [10]=> string(7) "to_ping" [11]=> string(6) "pinged" [12]=> string(13) "post_modified" [13]=> string(17) "post_modified_gmt" [14]=> string(21) "post_content_filtered" [15]=> string(11) "post_parent" [16]=> string(4) "guid" [17]=> string(10) "menu_order" [18]=> string(9) "post_type" [19]=> string(14) "post_mime_type" [20]=> string(13) "comment_count" } } |
Описание элементов доступно тут: codex.wordpress.org
При помощи стандартных условий можно легко настроить вывод того или иного элемента:
1 2 3 4 |
if( $comment->comment_type == 'pingback') {} //тип записи pingback if ($comment->comment_parent == '0'): echo "</div>"; else: echo ""; endif; //условие для проверки дочерний это комментарий или нет |
Отдельно нужно сказать о функции, которая закрывает каждый комментарий, её можно и не дописывать, но в особых случая она может выглядеть следующим образом:
1 2 3 4 5 6 7 |
<?php if ( ! function_exists( 'end_comment' ) ): function end_comment() { echo '</div></div><!-- end comment -->'; } endif; ?> |
Особые случаи
Если не получается изменить вывод комментариев стандартными средствами, то можно использовать метод нестандартный 🙂 А именно, перед отображением данных поработать с ними в буфере при помощи функций ob_start() и ob_get_clean() Это будет выглядеть как-то так:
1 2 3 4 5 |
<?php ob_start(); comment_form(); echo str_replace('class="example-comment-form"','class="my-class"',ob_get_clean()); ?> |
Но я думаю, что этот метод подойдёт только для тех, кто не хочет разобраться с тем как работают стандартные функции…
Дополнительно
Список стандартных wordpress функций для работы с комментариями, пингами и т.п. элементами: wp-kama.ru
Свежие комментарии