web-dev-qa-db-fra.com

Liste de pingback compacte avec favicons

Sur un blog avec pingbacks et rétroliens (pings) activés, je souhaite afficher uniquement un lien avec du texte de lien et un favicon du site externe dans une liste compacte: pas de date, pas de texte.

Comment puis je faire ça?

1
fuxia

La première chose que vous faites: séparez les commentaires réguliers et les pingbacks. Dans votre comments.php, définissez le paramètre type pour les deux:

<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>

Maintenant, il y a un problème: vous ne voulez pas imprimer un <ol> vide s'il n'y a pas de pings approuvés.

Je laisse donc utiliser un simple compteur de 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;
}

Maintenant, nous emballons notre liste de ping dans un conditionnel:

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
}

Si t5_count_pings() renvoie un 0, PHP le lira comme un FALSE et le conteneur de liste ne sera pas imprimé.

Maintenant la mise en forme. wp_list_comments() accepte un paramètre callback, que nous pouvons utiliser pour afficher le contenu de chaque ping. J'ai nommé mien t5_list_pings_callback() et l'ajoute comme ceci:

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

Le contenu de cette fonction est très simple:

/**
 * 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>";
}

Deux notes importantes:

  1. N'ajoutez pas le </li> de fermeture. WordPress le fera pour vous.
  2. Nous avons besoin d'une fonction t5_external_favicon(). Demandons à 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' />";
}

Nous utilisons un attribut alt vide car les images ne sont que des décorations. Et width et height devraient toujours être définis, car certains sites utilisent de très grandes icônes.

Et c'est tout. Voici à quoi ça ressemble sur wpkrauts.com:

screenshot

3
fuxia