Вот удивительная вещь, публикаций на тему вывода раздельно пингбеков/трекбеков и комментариев для WordPress хоть пруд пруди, но все они для старых версий, а точнее для версий ниже 2.7. Прочитав комментарии на разных блогах на эту тему, понял, что все ищут, а найти не могут, или сталкиваются с различными проблемами.
Конечно вариант сделать «по старинке» тоже работает, но в таком случае мы лишаемся некоторых прелестей вывода комментариев в новых версиях. Из вкусных вещей в новых версиях можно выделить, например, AJAX форму комментирования. Поэтому, все же, я настоятельно рекомендую использовать новый метод разделения, который я опишу ниже.
В новой версии мы будем пользоваться удобной функцией wp_list_comments, вместо неудобного парсинга массива через foreach. Чем не повод использовать новый метод.
Функция wp_list_comments описана в кодексе. Там вы можете посмотреть все значения, доступные для нее. Однако, приступим.
Давайте взглянем на исходный код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?php if ( have_comments() ) : ?> <h3 id="comments"><?php comments_number('Нет комментариев', 'Один комментарий', '% Комментариев' );?> для “<?php the_title(); ?>”</h3> <ol class="commentlist"> <?php wp_list_comments(); ?> </ol> <div class="navigation"> <div class="alignleft"><?php previous_comments_link() ?></div> <div class="alignright"><?php next_comments_link() ?></div> </div> <?php else : // this is displayed if there are no comments so far ?> <?php if ('open' == $post->comment_status) : ?> <!-- If comments are open, but there are no comments. --> <?php else : // comments are closed ?> <!-- If comments are closed. --> <p class="nocomments">Комментарии закрыты. <?php endif; ?> <?php endif; ?> |
Сразу видно, что теперь все гораздо проще выглядит, чем раньше, никаких премудростей. А самое главное изменение — функция wp_list_comments ();
Чтобы удалить вывод трекбеков/пингбеков нам всего-то надо сделать два мелких изменения.
Первое из них — изменение single.php:
Находим:
1 | <?php comments_template(); ?> |
Заменяем на:
1 | <?php comments_template('', true); ?> |
Это изменение говорит comments_template создать массив для $comments_by_type, который мы используем дальше.
Редактируем comments.php:
Находим:
1 | <?php if ( have_comments() ) : ?> |
Сразу ниже добавляем:
1 | <?php if ( ! empty($comments_by_type['comment']) ) : ?> |
Находим:
1 | <?php wp_list_comments(); ?> |
Заменяем на:
1 | <?php wp_list_comments('type=comment'); ?> |
После вывода функции wp_list_comments мы должны видеть тег
1 | </ol> |
Сразу же после него добавляем:
1 | <?php endif; ?> |
Последнее нужно для того, чтобы ничего не развалилось, если вдруг у публикации нет комментариев, а только трекбеки.
Все просто, не правда ли? ;)
Для вывода пингбеков и трекбеков нам надо добавить:
1 2 3 4 5 6 7 | <?php if ( ! empty($comments_by_type['pings']) ) : ?> <h3 id="pings">Trackbacks/Pingbacks</h3> <ol class="commentlist"> <?php wp_list_comments('type=pings'); ?> </ol> <?php endif; ?> |
сразу же после endif'а который добавляли после тега ol.
В итоге, видим такую картину:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | <?php if ( have_comments() ) : ?> <?php if ( ! empty($comments_by_type['comment']) ) : ?> <h3 id="comments"><?php comments_number('Нет комментариев', 'Один комментарий', '% Комментариев' );?> для “<?php the_title(); ?>”</h3> <ol class="commentlist"> <?php wp_list_comments('type=comment'); ?> </ol> <?php endif; ?> <?php if ( ! empty($comments_by_type['pings']) ) : ?> <h3 id="pings">Trackbacks/Pingbacks</h3> <ol class="commentlist"> <?php wp_list_comments('type=pings'); ?> </ol> <?php endif; ?> <div class="navigation"> <div class="alignleft"><?php previous_comments_link() ?></div> <div class="alignright"><?php next_comments_link() ?></div> </div> <?php else : // this is displayed if there are no comments so far ?> <?php if ('open' == $post->comment_status) : ?> <!-- If comments are open, but there are no comments. --> <?php else : // comments are closed ?> <!-- If comments are closed. --> <p class="nocomments">Комментарии закрыты. <?php endif; ?> <?php endif; ?> |
Круто! Пингбеки и трекбеки теперь выводятся сразу же под комментариями.
Но тут есть косяк, выводятся они в таком же виде как комментарии. Это совсем не красиво, лично для меня. Потому продолжим войну с кодом.
Открываем наш файл functions.php, который идет вместе с темой оформления, и вставляем туда, например, в самое начало:
1 2 3 4 5 6 | <?php function list_pings($comment, $args, $depth) { $GLOBALS['comment'] = $comment; ?> <li id="comment-<?php comment_ID(); ?>"><?php comment_author_link(); ?> <?php } ?> |
Потом заменяем:
1 2 | <ol class="commentlist"> <?php wp_list_comments('type=pings'); ?> |
На это:
1 2 | <ol class="pinglist"> <?php wp_list_comments('type=pings&callback=list_pings'); ?> |
Если у вас почему-то нет файла functions.php, то его надо, не поверите, создать!
В итоге, файл шаблона комментариев должен выглядеть примерно так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | <?php if ( have_comments() ) : ?> <?php if ( ! empty($comments_by_type['comment']) ) : ?> <h3 id="comments"><?php comments_number('Нет комментариев', 'Один комментарий', '% Комментариев' );?> для “<?php the_title(); ?>”</h3> <ol class="commentlist"> <?php wp_list_comments('type=comment'); ?> </ol> <?php endif; ?> <?php if ( ! empty($comments_by_type['pings']) ) : ?> <h3 id="pings">Trackbacks/Pingbacks</h3> <ol class="pinglist"> <?php wp_list_comments('type=pings&callback=list_pings'); ?> </ol> <?php endif; ?> <div class="navigation"> <div class="alignleft"><?php previous_comments_link() ?></div> <div class="alignright"><?php next_comments_link() ?></div> </div> <?php else : // this is displayed if there are no comments so far ?> <?php if ('open' == $post->comment_status) : ?> <!-- If comments are open, but there are no comments. --> <?php else : // comments are closed ?> <!-- If comments are closed. --> <p class="nocomments">Комментарии закрыты. <?php endif; ?> <?php endif; ?> |
Это все! Хотя...вы можете мне сказать, что тут есть недоработка, и будете правы! Она есть.
Только для эстетов. Открываем functions.php и добавляем туда, так же в самое начало:
1 2 3 4 5 6 7 8 9 10 11 12 | <?php add_filter('get_comments_number', 'comment_count', 0); function comment_count( $count ) { if ( ! is_admin() ) { global $id; $comments_by_type = &separate_comments(get_comments('status=approve&post_id=' . $id)); return count($comments_by_type['comment']); } else { return $count; } } ?> |
Теперь количество комментариев будет равно количеству комментариев, а не сумме комментов и пингбеков, как было до этого!
Для супер-пупер эстетов есть еще один момент. Я себя отношу к таким людям, потому для себя доработал некоторые места в коде. Люблю чтобы все было лаконично, без единого лишнего символа.
Потому в итоге преобразований, которые мы проделали, у меня в файле function.php добавочный код выглядит по другому нежели у вас, если вы делали по инструкции. А вот как в итоге выглядит у меня:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <?php add_filter('get_comments_number', 'comment_count', 0); function comment_count( $count ) { if ( ! is_admin() ) { global $id; $comments_by_type = &separate_comments(get_comments('status=approve&post_id=' . $id)); return count($comments_by_type['comment']); } else { return $count; } } function list_pings($comment, $args, $depth) { $GLOBALS['comment'] = $comment; $html .= '<div>' . comment_author_link() . '</div>'; } |
Вот теперь точно все. Если у вас возникли какие-то вопросы, пожелания, или вы нашли ошибку, обязательно дайте мне знать, комментарии читаю, критику воспринимаю.
Удачных вам модификаций, и до встречи.
Отлично! Спасибо, сам обыскался :)
Теперь попробую сделать такую же фичу у себя.
Благодарю за пост! Все описано понятно и доступно. А то у меня раньше стоял плагин Brian's Threaded Comments Wordpress только он после обновления wordpress до версии 3.0 стал коряво работать.
А сама тема не позволяла выводить древовидные комменты.
Так вот с инета — по нитке, вроде оформил комменты. И Ваш пост внес завершающий штрих.
На то они и нужны, интернеты эти наши ;) А вообще рад что пригодилось. Я стараюсь использовать как можно меньше плагинов и заменять их простым кодом если это возможно.
Мда...у меня выдает синтаксическую ошибку... А это на всех шаблонах работает?
Я же не ясновидящий, скопируйте сюда текст ошибки для начала. Будем разбираться в чем проблема.
Не помню точно, но именно синтаксис нарушен... А изначально у меня такой шаблон, не выводит Трекбеки... А их вообще можно не выводить или это не принципиально??
Все это странно, потому что все операции я проделывал на многих шаблонах и неоднократно, так что с синтаксисом должно быть все в порядке.
А выводить их совсем необязательно, я вот например убрал вывод не так давно, потому что это не так и важно для меня оказалось, я трекбеки вижу в админке.
Подскажите, как сделать простую вещь в Wordpress 2.7+ с комментариями.
По умолчанию дата комментария выводится снизу от имени. Хочу сделать как у вас, т.е. в одной строчке идет имя комментатора и дата. В файле comments.php ничего для правки нет.
В каком файле, в каких строчках, где нужно поправить код, подскажите
Конечно подскажу ;) Надо смотреть файл comments-template.php, он как раз находится по соседству с файлом, который смотрели вы. Так вот ищем функцию function start_el. Внутри этой функции будут переменные get_comment_date () и get_comment_time (). Первая отвечает за дату, вторая за время. Вот с ними и колдуйте, перемещайте куда нравится.
Спасибо, будем пробовать
Спс большое я тоже попробую=) Отпишусь потом...