带有图标的紧凑回送列表

时间:2013-04-20 作者:fuxia

在一个启用了pingback和trackbacks(pings)的博客上,我只想在一个紧凑的列表中显示一个带有链接文本的链接和一个外部站点的favicon:没有日期,没有文本。

我该怎么做?

1 个回复
最合适的回答,由SO网友:fuxia 整理而成

首先要做的是:分离常规注释和pingback。在您的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> 如果没有批准的ping。

因此,我们使用一个简单的ping计数器:

/**
 * 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;
}
现在,我们将ping列表包装成一个条件:

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() 返回a0, PHP会像FALSE 并且不会打印列表容器。

现在开始格式化。wp_list_comments() 接受参数callback, 我们可以使用它来渲染每个ping的内容。我给我的命名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>";
}
两个重要注意事项:

不要添加结束符</li>. WordPress会帮你做的t5_external_favicon(). 让我们问问谷歌。

/**
 * 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 属性,因为图像实际上只是装饰。以及widthheight 应该始终设置,因为有些网站使用非常大的图标。

就这样。这就是它的样子wpkrauts.com:

screenshot

结束