Опубликовано 19 января 2010 (обновлено 19 июля 2011 ), категория: WordPress, by
 

Раздельный вывод Трекбеков и Комментариев в WordPress 2.7 и выше

Вот удивительная вещь, публикаций на тему вывода раздельно пингбеков/трекбеков и комментариев для 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>';
	}

Вот теперь точно все. Если у вас возникли какие-то вопросы, пожелания, или вы нашли ошибку, обязательно дайте мне знать, комментарии читаю, критику воспринимаю.

Удачных вам модификаций, и до встречи.

Представляю интересную статью от Дмитрия: Установка Joomla 1.5 в деталях и картинках, решение возможных проблем.
 
Ерунда и баянПолезный пост
+4
 

Получай новости блога АлаичЪ'а на e-mail:
Подпишись на новые комментарии к записи:
 
Еще заметки по теме. Советую прочитать:
Комментариев к записи: 11
  1. Отлично! Спасибо, сам обыскался :)

    Теперь попробую сделать такую же фичу у себя.

  2. Благодарю за пост! Все описано понятно и доступно. А то у меня раньше стоял плагин Brian's Threaded Comments Wordpress только он после обновления wordpress до версии 3.0 стал коряво работать.

    А сама тема не позволяла выводить древовидные комменты.

    Так вот с инета — по нитке, вроде оформил комменты. И Ваш пост внес завершающий штрих.

    • На то они и нужны, интернеты эти наши ;) А вообще рад что пригодилось. Я стараюсь использовать как можно меньше плагинов и заменять их простым кодом если это возможно.

  3. Мда...у меня выдает синтаксическую ошибку... А это на всех шаблонах работает?

    • Я же не ясновидящий, скопируйте сюда текст ошибки для начала. Будем разбираться в чем проблема.

      • Не помню точно, но именно синтаксис нарушен... А изначально у меня такой шаблон, не выводит Трекбеки... А их вообще можно не выводить или это не принципиально??

        • Все это странно, потому что все операции я проделывал на многих шаблонах и неоднократно, так что с синтаксисом должно быть все в порядке.

          А выводить их совсем необязательно, я вот например убрал вывод не так давно, потому что это не так и важно для меня оказалось, я трекбеки вижу в админке.

  4. Подскажите, как сделать простую вещь в Wordpress 2.7+ с комментариями.

    По умолчанию дата комментария выводится снизу от имени. Хочу сделать как у вас, т.е. в одной строчке идет имя комментатора и дата. В файле comments.php ничего для правки нет.

    В каком файле, в каких строчках, где нужно поправить код, подскажите

    • Конечно подскажу ;) Надо смотреть файл comments-template.php, он как раз находится по соседству с файлом, который смотрели вы. Так вот ищем функцию function start_el. Внутри этой функции будут переменные get_comment_date () и get_comment_time (). Первая отвечает за дату, вторая за время. Вот с ними и колдуйте, перемещайте куда нравится.

      • Спасибо, будем пробовать

  5. Спс большое я тоже попробую=) Отпишусь потом...

Оставить комментарий

1. Комментарий содержит полезную информацию или вопрос, а не оставлен ради ссылки.
2. Ссылка, оставленная в поле url, ведет на ваш персональный блог, иначе оставьте поле пустым.
3. В поле "Имя" указано ваше реальное имя или ник, а НЕ ключевое слово.
* - Данные правила могут быть изменены в любое время.