Компактный список обратной связи с фавиконами
В блоге с включенными обратными связями и обратными связями (пингами) я хочу показать только ссылку с текстом ссылки и значок внешнего сайта в компактном списке: без даты, без текста.
Как я могу это сделать?
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>";
}
Два важных замечания:
- Не добавляйте закрывающий
</li>
. WordPress сделает это за вас. - Нам нужна функция
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
: