dofollow blog
 
Рейтинг блогов
 
 

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

Запись опубликована 19 января 2010 в 15:32 в категории: WordPress

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

В новой версии мы будем пользоваться удобной функцией wp_list_comments, вместо неудобного парсинга массива через foreach. Чем не повод использовать новый метод.

Функция wp_list_comments описана в кодексе (http://codex.wordpress.org/Template_Tags/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>';
	}

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

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

Была ли эта информация полезной? НетДа (Итоговый рейтинг: +3 / 7)
Загрузка ... Загрузка ...

Так же сегодня хочу порекомендовать вам скачать аську на телефон бесплатно. Смысла объяснять для чего и почему это нужно я не стану, вы и так без меня это прекрасно знаете. Мобильная аська это всегда удобно в поездках.

Представляю интересную статью от Дмитрия: Установка Joomla 1.5 в деталях и картинках, решение возможных проблем.
 
Получай новости блога АлаичЪ'а на e-mail:
Подпишись на новые комментарии к записи:
 

Советую к прочтению и обсуждению:

Комментариев к записи: 8

  1. sharp (1 комм.)

    Отлично! спасибо :) сам обыскался)) теперь попробую сделать такую же фичу у себя)

  2. ramzes (1 комм.)

    Пошагово и доступно. Спасибо

  3. Other (1 комм.)

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

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

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

    • АлаичЪ (808 комм.)

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

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

    • АлаичЪ (808 комм.)

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

      • Человек Артем (3 комм.)

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

        • АлаичЪ (808 комм.)

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

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

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

1. Он малоинформативен и оставлен ради ссылки.
2. Ссылка оставленная в поле url ведет не на ваш персональнй блог. (лучше оставить поле пустым)
3. Ваш блог даже отдаленно не связан тематикой с данным блогом.
4. В качестве имени указано ключевое слово.
* - Данные правила могут быть изменены в любое время по усмотрению автора.
** - Ссылки в комменатриях индексируются, т.е. noindex и nofollow отсутствуют