Создаем 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; //Конец Если комментирование разрешено ?>
Комментариев: 39. Обязательно оставьте свой!
привет
привет
Спасибо за статью. С ее помощью смог исправить файл comments.php, который был у меня в теме кривой, не выводились аватарки кроме админа. Еще бы древовидные комментарии сделать более читаемыми, а то сплошным текстом идут без выделений.
test
Большое спасибо.
Не вижу смысла использовать
?php foreach ($comments as $comment) : ?>
<li id="comment-»>
а как в css настроить вывод для всех комментов, если у них ID разные ?
>> а как в css настроить вывод для всех комментов, если у них ID разные ?
1) #comlist li {}
2) Присвоить li не только id, но и class
fdsfdfs
Спасибо за статью)))
Спс… давно искал адекватно расписанный способ вывода комментов на WP.
"Думаю, понятно, понятно," – я два раза не повторяю, не повторяю )
Snegurka, спасибо, исправил. Редко перечитываю что написал
а как сделать что бы каменты первые показывались последнии введеные. тобишь написанные уходили вниз.
nama,
<?php
$comments = array_reverse($comments);
foreach ($comments as $comment) : ?>
….
Автор, огромное спасибо за статью. Очень помогло =)
WP пока знаю не особо, однако получилось переписать)
p.s.: Правда мне пришлось переписывать не comments.php а core.php)
извините за срач, просто сам парюсь с этой фигнёй, думал у вас работает
дам-с без поллитра не разобраться
спасибо за статью
круто, давно искал как более тонко контролировать вывод комментов
Спасибо за информацию
Здравствуйте, извините пожалуйста за вопрос немного не в тему. На движке wordpress когда вводишь комментарий от админа все в порядке, выходим из админки, пишем как простой пользователь, нажимаем отправить и появляется страничка с текстом: Ваше сообщение принято Рё ожидает модерации. В чем может быть проблема? В адресной строке браузера открывается . Думаю ошибка в нем, но никак не могу понять где именно. Причем когда пишем такой же самый комментарий, выводится эта же страничка с текстом: «Дубликат комментария удален».
Вячеслав, этот текст – «Ваше сообщение принято и ожидает модерации» в неправильной кодировке. Чтобы коммент появился на сайте, нужно одобить его в админке или отключить в настройках премодерацию. Почему сообщение выводится в неправильной кодировке не знаю – попробуйте с другого браузера написать комментарий.
Спасибо, думаю придется отключить премодерацию
handbags
ugg shoes
thx!
11111
Ух спасибо, настроил вывод у комментария ссылки на сайт.
Спасибо,действительно процесс раскрыт
Привет, Вы не могли б помочь?
проблема в том что мне нужно сделать что-то на подобии гостевой книги при помощи комментариев на ВП,так вот, Я создаю шаблон в котором буду выводить комментарии,формы вставлены,все выводиться,но после того как я заполняю все поля и пытаюсь отправить комментарий браузер переходит в файл wp-comments-post.php,и показывается просто белый экран.
Я попытался понять в чем дело,но все безрезультатно,но когда я включаю дефолтный шаблон,там все работает….
Помогите,кто знает? буду очень благодарен!
Руслан, найдите поля, которых нет у вас и которые есть в дефолтном шаблоне, вставьте эти поля в свой шаблон.
Я брал даже полностью дефолтный шаблон комментариев,он выводиться все в норме,но при клике на отправку происходит тоже самое.
Такого у меня не было. Надо смотреть, что за ошибка в логах.
Я Пытался по смотреть что за ошибки таким способом
но выдает только это:
«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″
да да
А можете написать о том как реализавать кнопку «ответить» в комментариях?
Спасибо за подсказку
Если не понятно – Я НЕ БОТ!
… и не ГОБОТ