Создаем comments.php в WordPress

Опубликовано 20 мая, 2009 в WordPress

В этом посте о создании темы для WordPress не раскрыт процесс создания шаблона комментариев (comments.php). Сейчас наверстаем упущеное :)

Итак… Начать стоит с того, что заставим comments.php выводить количество комментариев для текущей записи. Делается это очень просто, с помощью функции comments_number и трех параметров:

<div id="comnum"><?php comments_number('Нет комментариев', '1 комментарий', 'Комментариев: % '); ?> для записи <?php the_title();  ?></div>

Думаю, понятно, что все три параметра – шаблон вывода инфы. В последнем, на месте «%», будет кол-во комментариев. <?php the_title(); ?> просто выводит название текущей записи.

Следующим шагом нам необходимо проверить, есть ли вообще комментарии для этой записи, если есть, то выводим их. Проверка осуществляется посредством переменной $comments. Если она есть, значит и комментарии есть.

<?php if ( $comments ) : ?>
<ol id="comlist">
<!-- выводим комментарии в цикле-->
</ol>
<?php endif; ?>

В случае, если есть хоть один комментарий, мы в цикле проходимся по всем и выводим всю необходимую информацию о каждом комментарии отдельно.

Теперь перечислю самые нужные функции, которые могут понадобиться при выводе комментов. Все они имеют говорящие названия:

  • comment_ID – Выводит уникальный идентификатор комментария.
  • comment_author – Выводит автора комментария (Никнейм).
  • get_avatar – Выводит аватар автора.
  • comment_author_IP – Выводит ип-адрес комментария.
  • comment_author_email -Выводит почту автора.
  • comment_author_email_link – Выводит имя автора ссылкой на его почту (mailto).
  • comment_author_url – Выводит УРЛ сайта автора.
  • comment_author_url_link – Выводит УРЛ автора ссылкой на этот самый УРЛ.
  • comment_author_link – Выводит имя автора ссылкой на его сайт.
  • comments_number – Выводит текущий номер комментария по порядку.
  • comment_text – Собственно, текст комментария
  • comment_date – Дата.
  • comment_time – Время.

Теперь смело возвращаемся к коду выше и вписываем в него наш цикл foreach ($comments as $comment), а внутри него то, что мы хотим видеть в каждом комментарии:

<?php if ( $comments ) : ?>
<ol id="comlist">
<?php foreach ($comments as $comment) : ?>
<li id="comment-<?php comment_ID() ?>">
	Автор: <?php comment_author_link(); ?> (<?php comment_date(); ?> в <?php comment_time(); ?>) [ <?php comment_author_IP(); ?>]<br />
	Аватар: <?php echo get_avatar($comment, 32); ?><hr />
<?php comment_text(); ?>
</li>
<?php endforeach; ?>
</ol>
<?php endif; ?>

Здесь все довольно прозрачно, кроме второго параметра в get_avatar (это кол-во пикселей для аватара) и

id="comment-<?php comment_ID() ?>"

Последнее мы сделали для того, чтобы после того, как посетитель отправил свой коммент, страница перекручивалась на него (site.ru/post/#comment-434). WP делает такой редирект, если запись успешно добавлена.

А вообще, это все не обязательно, достаточно одной функции – <?php wp_list_comments();?>, которую необходимо вставить в цикл. Если не хотите тонкой настройки, используйте этй функцию между тегами <ol></ol>.

Далее мы должны вывести форму добавления комментария. Но сперва, опять же, нужна проверка. Проверка на то, разрешены ли комментарии для текущей записи. Это делается посредством условия:

<?php if ( comments_open() ) : ?>
<!-- выводим форму -->
<?php endif; ?>

Хотя нет, пока не выводим форму. Вначале сделаем еще 1 проверочку. Ведь возможен и такой вариант, что комментирование разрешено только зарегистрированным пользователям.

<?php if ( comments_open() ) : ?>
<?php if ( get_option('comment_registration') && !$user_ID ) : ?>
<p>Вы должны <a href="/wp-login.php">представиться</a> для оставления комментариев.</p>
<?php else : ?>
<!-- выводим форму -->
<?php endif; ?>

Наконец-то выводим форму. В ней должно быть еще одно условие. Точнее исключение. Ведь такие поля, как имя, емейл и сайт, мы должны выводить только не залогиненым юзерам. Эта проверка осуществляется вот так:

<?php if ( !$user_ID ) : ?>
<!-- выводим 3 поля для гостей-->
<?php endif; ?>
<!-- выводим textarea и submit для всех. -->

Настала пора объединить кусочки формы воедино. Вот как это выглядит:

<?php if ( comments_open() ) :  //Если комментирование разрешено ?>
    <?php if ( get_option( 'comment_registration' ) && !$user_ID) : //Если разрешено только для зареганных юзеров ?>
        <p>Вы должны <a href="/wp-login.php">представиться</a> для оставления комментариев.</p>
    <?php else : // Если разрешено для всех юзеров ?>
        <form action="<?php echo get_option('siteurl'); ?>/wp-comments-post.php" method="post">
        <?php if ( !$user_ID ) : //Выводим три поля для гостей ?>
            <p><input type="text" name="author" id="author" value="<?php echo $comment_author; ?>" size="22" tabindex="1" />
            <label for="author"><small>имя</small></label></p>
            <p><input type="text" name="email" id="email" value="<?php echo $comment_author_email; ?>" size="22" tabindex="2" />
            <label for="email"><small>мейл</small></label></p>
            <p><input type="text" name="url" id="url" value="<?php echo $comment_author_url; ?>" size="22" tabindex="3" />
            <label for="url">Сайт</small></label></p>
        <?php endif; // Конец Выводим три поля для гостей ?>
        <p><textarea name="comment" id="comment"></textarea></p>
        <p><input name="submit" type="submit" value="Отправить" />
        <input type="hidden" name="comment_post_ID" value="<?php echo $id; ?>" /></p>
        </form>
    <?php endif; //Конец Если разрешено для всех юзеров?>
<?php endif;  //Конец Если комментирование разрешено ?>

Готово. А вот полный код comments.php:

<div id="comnum"><?php comments_number('Нет комментариев', '1 комментарий', 'Комментариев: % '); ?> для записи <?php the_title();  ?></div>

<?php if ( $comments ) : ?>
    <ol id="comlist">
    <?php foreach ($comments as $comment) : ?>
        <li id="comment-<?php comment_ID() ?>">
        Автор: <?php comment_author_link(); ?> (<?php comment_date(); ?> в <?php comment_time(); ?>) [ <?php comment_author_IP(); ?>]<br />
        Аватар: <?php echo get_avatar($comment, 32); ?><hr />
        <?php comment_text(); ?>
        </li>
    <?php endforeach; ?>
    </ol>
<?php endif; ?>

<?php if ( comments_open() ) :  //Если комментирование разрешено ?>
    <?php if ( get_option( 'comment_registration' ) && !$user_ID) : //Если разрешено только для зареганных юзеров ?>
        <p>Вы должны <a href="/wp-login.php">представиться</a> для оставления комментариев.</p>
    <?php else : // Если разрешено для всех юзеров ?>
        <form action="<?php echo get_option('siteurl'); ?>/wp-comments-post.php" method="post">
        <?php if ( !$user_ID ) : //Выводим три поля для гостей ?>
            <p><input type="text" name="author" id="author" value="<?php echo $comment_author; ?>" size="22" tabindex="1" />
            <label for="author"><small>имя</small></label></p>
            <p><input type="text" name="email" id="email" value="<?php echo $comment_author_email; ?>" size="22" tabindex="2" />
            <label for="email"><small>мейл</small></label></p>
            <p><input type="text" name="url" id="url" value="<?php echo $comment_author_url; ?>" size="22" tabindex="3" />
            <label for="url">Сайт</small></label></p>
        <?php endif; // Конец Выводим три поля для гостей ?>
        <p><textarea name="comment" id="comment"></textarea></p>
        <p><input name="submit" type="submit" value="Отправить" />
        <input type="hidden" name="comment_post_ID" value="<?php echo $id; ?>" /></p>
        </form>
    <?php endif; //Конец Если разрешено для всех юзеров?>
<?php endif;  //Конец Если комментирование разрешено ?>



Комментарии «Создаем comments.php в WordPress»:
Комментариев: 39. Обязательно оставьте свой!
ник 09.09.2009 в 19:08

привет

pistol 10.09.2009 в 8:27

привет

Дмитрий Жилин 25.11.2009 в 10:49

Спасибо за статью. С ее помощью смог исправить файл comments.php, который был у меня в теме кривой, не выводились аватарки кроме админа. Еще бы древовидные комментарии сделать более читаемыми, а то сплошным текстом идут без выделений.

test 27.11.2009 в 22:38

test

Сергей 10.12.2009 в 10:18

Большое спасибо.

Сергей 10.12.2009 в 10:31

Не вижу смысла использовать
?php foreach ($comments as $comment) : ?>
<li id="comment-»>
а как в css настроить вывод для всех комментов, если у них ID разные ?

pistol 10.12.2009 в 10:53

>> а как в css настроить вывод для всех комментов, если у них ID разные ?
1) #comlist li {}
2) Присвоить li не только id, но и class

рвар 14.12.2009 в 22:29

fdsfdfs

Saturna 06.04.2010 в 12:46

Спасибо за статью)))

RodgerFox 16.04.2010 в 12:02

Спс… давно искал адекватно расписанный способ вывода комментов на WP.

Snegurka 07.05.2010 в 17:45

"Думаю, понятно, понятно," – я два раза не повторяю, не повторяю )

pistol 07.05.2010 в 18:00

Snegurka, спасибо, исправил. Редко перечитываю что написал :)

nama 21.05.2010 в 1:51

а как сделать что бы каменты первые показывались последнии введеные. тобишь написанные уходили вниз.

pistol 21.05.2010 в 7:53

nama,

<?php
$comments = array_reverse($comments);
foreach ($comments as $comment) : ?>
….

Dante 29.05.2010 в 19:45

Автор, огромное спасибо за статью. Очень помогло =)
WP пока знаю не особо, однако получилось переписать)
p.s.: Правда мне пришлось переписывать не comments.php а core.php)

Андр 13.06.2010 в 8:38

извините за срач, просто сам парюсь с этой фигнёй, думал у вас работает

Maksim 23.06.2010 в 22:00

дам-с без поллитра не разобраться :)
спасибо за статью

dude 05.07.2010 в 17:19

круто, давно искал как более тонко контролировать вывод комментов

Сергей 07.07.2010 в 18:56

Спасибо за информацию

Вячеслав 21.08.2010 в 22:34

Здравствуйте, извините пожалуйста за вопрос немного не в тему. На движке wordpress когда вводишь комментарий от админа все в порядке, выходим из админки, пишем как простой пользователь, нажимаем отправить и появляется страничка с текстом: Ваше сообщение принято Рё ожидает модерации. В чем может быть проблема? В адресной строке браузера открывается http://sat.ru/wp-comments-post.php. Думаю ошибка в нем, но никак не могу понять где именно. Причем когда пишем такой же самый комментарий, выводится эта же страничка с текстом: «Дубликат комментария удален».

pistol 22.08.2010 в 11:10

Вячеслав, этот текст – «Ваше сообщение принято и ожидает модерации» в неправильной кодировке. Чтобы коммент появился на сайте, нужно одобить его в админке или отключить в настройках премодерацию. Почему сообщение выводится в неправильной кодировке не знаю – попробуйте с другого браузера написать комментарий.

вячеслав 26.08.2010 в 5:03

Спасибо, думаю придется отключить премодерацию :)

replica handbags 06.09.2010 в 10:15

handbags

ugg shoes 10.09.2010 в 4:36

ugg shoes

adisos 23.10.2010 в 5:48

thx!

джордж 21.12.2010 в 19:52

11111

Дмитрий 02.05.2011 в 18:37

Ух спасибо, настроил вывод у комментария ссылки на сайт.

Дима 17.07.2011 в 19:25

Спасибо,действительно процесс раскрыт

Руслан 29.07.2011 в 17:56

Привет, Вы не могли б помочь?
проблема в том что мне нужно сделать что-то на подобии гостевой книги при помощи комментариев на ВП,так вот, Я создаю шаблон в котором буду выводить комментарии,формы вставлены,все выводиться,но после того как я заполняю все поля и пытаюсь отправить комментарий браузер переходит в файл wp-comments-post.php,и показывается просто белый экран.
Я попытался понять в чем дело,но все безрезультатно,но когда я включаю дефолтный шаблон,там все работает….
Помогите,кто знает? буду очень благодарен!

pistol 29.07.2011 в 18:02

Руслан, найдите поля, которых нет у вас и которые есть в дефолтном шаблоне, вставьте эти поля в свой шаблон.

Руслан 29.07.2011 в 18:20

Я брал даже полностью дефолтный шаблон комментариев,он выводиться все в норме,но при клике на отправку происходит тоже самое.

pistol 29.07.2011 в 18:21

Такого у меня не было. Надо смотреть, что за ошибка в логах.

Руслан 29.07.2011 в 18:27

Я Пытался по смотреть что за ошибки таким способом
http://turizmufa.com/wp-comments-post?debug=debug

но выдает только это:
«Notice: Use of undefined constant ddsg_language – assumed ‘ddsg_language’ in /home/t/turizmufru/public_html/wp-content/plugins/sitemap-generator/sitemap-generator.php on line 45

Notice: Use of undefined constant wp_cumulus_widget – assumed ‘wp_cumulus_widget’ in /home/t/turizmufru/public_html/wp-content/plugins/wp-cumulus/wp-cumulus.php on line 297

Notice: Функция register_sidebar_widget с версии 2.8 считается устаревшей! Используйте wp_register_sidebar_widget(). in /home/t/turizmufru/public_html/wp-includes/functions.php on line 3237

Notice: Функция register_widget_control с версии 2.8 считается устаревшей! Используйте wp_register_widget_control(). in /home/t/turizmufru/public_html/wp-includes/functions.php on line 3237″

romm 30.10.2011 в 9:56

romm 30.10.2011 в 9:57

да да

Мохнатый 31.10.2011 в 14:06

А можете написать о том как реализавать кнопку «ответить» в комментариях?

V1ron 24.11.2011 в 16:16

Спасибо за подсказку

Я не БОТ 04.02.2012 в 16:41

Если не понятно – Я НЕ БОТ!

Я не БОТ 04.02.2012 в 16:41

… и не ГОБОТ

Ваш комментарий: