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

Звичайно варіант зробити «по-старому» теж працює, але в такому випадку ми позбавляємося деяких принад виведення коментарів у нових версіях. З смачних речей в нових версіях можна виділити, наприклад, AJAX форму коментування. Тому, все ж, я настійно рекомендую використовувати новий метод поділу, який я опишу нижче.

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

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

if ( have_comments() ) : ?>

comments_number(‘Немає коментарів’, ‘Один коментар’, ‘% Коментарів’ );?> для “ the_title(); ?>

wp_list_comments(); ?>
previous_comments_link() ?>
next_comments_link() ?>
else : // this is displayed if there are no comments so far ?>
if (‘open’ == $post->comment_status) : ?>
else : // comments are closed ?>

<p class=“nocomments”>Коментарі закриті.
endif; ?>
endif; ?>

для “”

comment_status) : ?>

Коментарі закриті.

Відразу видно, що тепер все набагато простіше виглядає, ніж раніше, ніяких премудростей. А найголовніше зміна — функція wp_list_comments ();

Щоб видалити висновок трекбеков/пингбеков нам треба зробити два дрібних зміни.

Перше з них — зміна single.php:

Знаходимо:

comments_template(); ?>

Замінюємо на:

comments_template(, ‘true’); ?>

Це зміна каже comments_template створити масив $comments_by_type, який ми використовуємо далі.

Редагуємо comments.php:

Знаходимо:

if ( have_comments() ) : ?>

Відразу нижче додаємо:

if ( ! empty($comments_by_type[‘comment’]) ) : ?>

Знаходимо:

wp_list_comments(); ?>

Замінюємо на:

wp_list_comments(‘type=comment’); ?>

Після виведення функції wp_list_comments ми повинні бачити тег

</ol>

Відразу ж після нього додаємо:

endif; ?>

Останнє потрібно для того, щоб нічого не розвалилося, якщо раптом у публікації коментарів немає, а тільки трекбеки.

Все просто, чи не правда? 😉

Для виведення пингбеков і трекбеков нам треба додати:

if ( ! empty($comments_by_type[‘pings’]) ) : ?>

Trackbacks/Pingbacks

wp_list_comments(‘type=pings’); ?>
endif; ?>

Trackbacks/Pingbacks

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

У підсумку, бачимо таку картину:

if ( have_comments() ) : ?>
if ( ! empty($comments_by_type[‘comment’]) ) : ?>

comments_number(‘Немає коментарів’, ‘Один коментар’, ‘% Коментарів’ );?> для “ the_title(); ?>

wp_list_comments(‘type=comment’); ?>
endif; ?>
if ( ! empty($comments_by_type[‘pings’]) ) : ?>

Trackbacks/Pingbacks

wp_list_comments(‘type=pings’); ?>
endif; ?>
previous_comments_link() ?>
next_comments_link() ?>
else : // this is displayed if there are no comments so far ?>
if (‘open’ == $post->comment_status) : ?>
else : // comments are closed ?>

<p class=“nocomments”>Коментарі закриті.
endif; ?>
endif; ?>

для “”

Trackbacks/Pingbacks

comment_status) : ?>

Коментарі закриті.

Круто! Пингбеки і трекбеки тепер виводяться відразу ж під коментарями.

Але тут є косяк, виводяться вони в такому ж вигляді як коментарі. Це зовсім не красиво, особисто для мене. Тому продовжимо війну з кодом.

Відкриваємо наш файл functions.php, який йде разом з темою оформлення, і вставляємо туди, наприклад, в самий початок:

1
2
3
4
5
6

function list_pings($comment, $args, $depth) {
$GLOBALS[‘comment’] = $comment;
?>

  • comment_author_link(); ?>
    } ?>
  • Потім замінюємо:

    1
    2
    wp_list_comments(‘type=pings’); ?>

    На це:

    1
    2
    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
    if ( have_comments() ) : ?>
    if ( ! empty($comments_by_type[‘comment’]) ) : ?>

    comments_number(‘Немає коментарів’, ‘Один коментар’, ‘% Коментарів’ );?> для “ the_title(); ?>

    wp_list_comments(‘type=comment’); ?>
    endif; ?>
    if ( ! empty($comments_by_type[‘pings’]) ) : ?>

    Trackbacks/Pingbacks

    wp_list_comments(‘type=pings&callback=list_pings’); ?>
    endif; ?>
    previous_comments_link() ?>
    next_comments_link() ?>
    else : // this is displayed if there are no comments so far ?>
    if (‘open’ == $post->comment_status) : ?>
    else : // comments are closed ?>

    <p class=“nocomments”>Коментарі закриті.
    endif; ?>
    endif; ?>

    для “”

    Trackbacks/Pingbacks

    comment_status) : ?>

    Коментарі закриті.

    Це все! Хоча…ви можете мені сказати, що тут є недопрацювання, і будете праві! Вона є.

    Тільки для естетів. Відкриваємо functions.php і додаємо туди, так само в самий початок:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

    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

    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 .=
    . comment_author_link() .
    ;
    }

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

    Вдалих вам модифікацій, і до зустрічі.

    З повагою, Олександр Алаєв