Компактный список обратной связи с фавиконами


В блоге с включенными обратными связями и обратными связями (пингами) я хочу показать только ссылку с текстом ссылки и значок внешнего сайта в компактном списке: без даты, без текста.

Как я могу это сделать?

Author: fuxia, 2013-04-20

1 answers

Первое, что вы делаете: разделяйте регулярные комментарии и отклики. В вашем comments.php задайте параметр типа для обоих:

<ol class="commentlist">
<?php
// show regular comments
wp_list_comments(
    array (
        'type'     => 'comment',
        'style'    => 'ul'
    )
);
?></ol>

<ol class="pinglist">
<?php
// show pingbacks and trackbacks, short: "pings"
wp_list_comments(
    array (
        'type'     => 'pings',
        'style'    => 'ul'
    )
);
?></ol>

Теперь есть проблема: вы не хотите печатать пустое <ol>, если нет утвержденных сообщений.

Поэтому я использую простой счетчик пинга:

/**
 * Count amount of pingbacks + trackbacks for a post.
 *
 * @param int $post_id Post ID for comment query. Default is current post.
 * @return int
 */
function t5_count_pings( $post_id = NULL )
{
    $pings    = 0;
    $comments = FALSE;

    if ( NULL !== $post_id )
    {
        $comments = get_comments(
            array (
                'post_id' => $post_id, # Note: post_ID will not work!
                'status'  => 'approve'
            )
        );
    }
    elseif ( ! empty ( $GLOBALS['wp_query']->comments ) )
    {
        $comments = $GLOBALS['wp_query']->comments;
    }

    if ( ! $comments )
        return 0;

    foreach ( $comments as $c )
        if ( in_array ( $c->comment_type, array ( 'pingback', 'trackback' ) ) )
            $pings += 1;

    return $pings;
}

Теперь мы преобразуем наш список пингов в условный:

if ( $num = t5_count_pings() )
{
?>
<h2 id="pingbacks"><?php
    printf( _n( 'One pingback', '%d pingbacks', $num, 't5_theme' ), $num );
?></h2>
<ol class="pinglist">
<?php
wp_list_comments(
    array (
        'type'     => 'pings',
        'style'    => 'ul'
    )
);
?></ol>
<?php
}

Если t5_count_pings() возвращает 0, PHP прочитает это как FALSE, и контейнер списка не будет напечатан.

Теперь форматирование. wp_list_comments() принимает параметр callback, и мы можем использовать его для отображения содержимого каждого запроса. Я назвал свой t5_list_pings_callback() и добавил его так:

wp_list_comments(
    array (
        'type'     => 'pings',
        'style'    => 'ul',
        'callback' => 't5_list_pings_callback'
    )
);

Содержание этой функции очень простое:

/**
 * Callback for wp_list_comments( array ( 'type' => 'pings' ) )
 *
 * @param  object $comment
 * @return string
 */
function t5_list_pings_callback( $comment )
{
    $url     = esc_url( $comment->comment_author_url );
    $icon    = t5_external_favicon( $url );
    $name    = esc_html( $comment->comment_author );

    print "<li><a href='$url'>$icon $name</a>";
}

Два важных замечания:

  1. Не добавляйте закрывающий </li>. WordPress сделает это за вас.
  2. Нам нужна функция t5_external_favicon(). Давайте спросим у Google.

.

/**
 * Get an img element for a favicon from Google.
 *
 * @param  string $url
 * @param  string $class class attribute
 * @param  int    $size
 * @param  string $alt
 * @return string
 */
function t5_external_favicon( $url, $class = 'icon', $size = 16, $alt = '' )
{
    $host     = parse_url( $url,  PHP_URL_HOST );
    $icon_url = "https://plus.google.com/_/favicon?domain=$host";

    return "<img class='$class' width='$size' height='$size' alt='$alt' src='$icon_url' />";
}

Мы используем пустой атрибут alt, потому что изображения действительно просто украшение. И width и height всегда должны быть установлены, потому что на некоторых сайтах используются действительно большие значки.

И это все. Вот как это выглядит на wpkrauts.com:

screenshot

 3
Author: fuxia, 2013-04-20 22:09:10