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

Раздельный вывод пингбеков и комментриев в WordPress Вот удивительная вещь, друзья, публикаций про вывод пингбеков (трекбеков) отдельно от комментариев для WordPress хоть пруд пруди, но все они для старых версий ниже 2.7. Прочитав комментарии на разных блогах на эту тему, понял, что все ищут, а найти не могут, или сталкиваются с различными проблемами.

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

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

Однако, приступим. Давайте взглянем на исходный код:

<?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:

Находим:

<?php comments_template(); ?>

Заменяем на:

<?php comments_template('', true); ?>

Это изменение говорит comments_template создать массив для $comments_by_type, который мы используем дальше.

Редактируем comments.php:

Находим:

<?php if ( have_comments() ) : ?>

Сразу ниже добавляем:

<?php if ( ! empty($comments_by_type['comment']) ) : ?>

Находим:

<?php wp_list_comments(); ?>

Заменяем на:

<?php wp_list_comments('type=comment'); ?>

После вывода функции wp_list_comments мы должны видеть тег

</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; ?>

сразу же после endif'а который добавляли после тега ol.

В итоге, видим такую картину:

<?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
 
Оптимизация сайта

Профессиональный технический аудит и оптимизация вашего сайта.
Тот самый необходимый «фундамент» для успешного продвижения.

от 10 000 руб.
Продвижение сайта

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

от 15 000 руб.
Консультация

У вас недостаточно знаний?
Нужен ответ на ряд вопросов?
Хотите узнать мнение эксперта?
Вы задаете вопрос — я на него отвечаю!

1 500 руб./час
 
Получай новости блога АлаичЪ'а на e-mail:
 
Другие посты из категории WordPress:
Что нового на форуме:
  1. Other (1 комм.)

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

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

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

    Ответить
    • АлаичЪ

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

      Ответить
  2. Человек Артем (3 комм.)

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

    Ответить
    • АлаичЪ

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

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

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

        Ответить
        • АлаичЪ

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

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

          Ответить
  3. Alex (2 комм.)

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

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

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

    Ответить
    • АлаичЪ

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

      Ответить
      • Alex (2 комм.)

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

        Ответить
  4. Дмитрий Жуков (1 комм.)

    Ну о-о-очень полезная статья! Я тоже являюсь сторонником прописывания кода ручками, что бы не грузить плагинами БД и прочее, и что бы — ничего лишнего, и всё было изящно.

    В инете встречал много описаний способов отделения трекбеков от комментов, но этот — пожалуй, самый грамотный и изящный. Автору — огромный респект!

    Ответить
  5. Мурад (1 комм.)

    Это, конечно, всё хорошо, но меня больше интересует, как сделать, чтобы форма ванда находилась наверху, а сами комментарии были ниже?

    Ответить
  6. Виктор Ковалев (1 комм.)

    Отлично! У меня все получилось — огромное спасибо за подробное изложение. Только тут смог найти решение, а на других ресурсах информация устаревшая.

    Ответить
Оставь комментарий или спроси через Twitter →

· Малоинформативные комментарии или комментарии, не содержащие вопрос, удаляются.
· В поле URL оставляйте ссылку только на свой сайт/блог. Эта ссылка для админа, посетители ее не увидят.
· Любой html-код отображается в виде текста, любые ссылки неактивны.
· Для спаммеров - БЛОГ НЕ DOFOLLOW!!!