Раздельный вывод Трекбеков и Комментариев в 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
Подписка на новые посты:

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

15 000 руб.

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

25 000 руб.

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

5 000 руб./час

Проведу подробное исследование вашего сайта и основных конкурентов, опубликую материал на блоге для обсуждения и коллективного поиска новых идей.

50 000 руб.

Я начал запись своего обучающего курса по seo-продвижению.

В каждом видео я разбираю какую-то одну важную тему, и делаю это последовательно, в порядке, подходящем для изучения с нуля. Видео выкладываются раз в неделю – по средам. Я думаю, весь курс будет состоять из 50-70 роликов, так до конца еще далеко, а значит самое время подписаться и начать изучение вместе со мной.

В блоке слева всегда будет выводиться самое свежее видео курса. Ссылки: на мой канал, на плейлист обучения.

Комментарии: 12 Написать комментарий
  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 (). Первая отвечает за дату, вторая за время. Вот с ними и колдуйте, перемещайте куда нравится.

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

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

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

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

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

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

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

    Ответить