it-swarm.com.de

Kompakte Pingback-Liste mit Favoriten

In einem Blog mit aktivierten Pingbacks und Trackbacks (Pings) möchte ich nur einen Link mit Linktext und ein Favicon der externen Site in einer kompakten Liste anzeigen: kein Datum, kein Text.

Wie kann ich das machen?

1
fuxia

Das erste, was Sie tun: Trennen Sie regelmäßige Kommentare und Pingbacks. Stellen Sie in Ihrem comments.php den Typparameter für beide ein:

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

Jetzt gibt es ein Problem: Sie möchten keinen leeren <ol> drucken, wenn keine genehmigten Pings vorhanden sind.

Ich verwende also einen einfachen Ping-Zähler:

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

Jetzt wickeln wir unsere Ping-Liste in eine Bedingung:

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
}

Wenn t5_count_pings() einen 0 zurückgibt, liest PHP das wie eine FALSE und der Listencontainer wird nicht gedruckt.

Nun die Formatierung. wp_list_comments() akzeptiert einen Parameter callback und wir können diesen verwenden, um den Inhalt jedes Pings zu rendern. Ich habe meine t5_list_pings_callback() genannt und füge sie folgendermaßen hinzu:

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

Der Inhalt dieser Funktion ist sehr einfach:

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

Zwei wichtige Hinweise:

  1. Fügen Sie den schließenden </li> nicht hinzu. WordPress erledigt das für Sie.
  2. Wir brauchen eine Funktion t5_external_favicon(). Fragen wir 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' />";
}

Wir verwenden ein leeres alt-Attribut, da die Bilder eigentlich nur Dekoration sind. Und die width und height sollten immer gesetzt sein, da einige Sites sehr große Symbole verwenden.

Und das ist es. So sieht es auf wpkrauts.com aus:

screenshot

3
fuxia