Artikel vom 1. Juli 2010

Anzahl der FeedBurner-Abos und Twitter-Follower in WordPress abbilden

Idee

Die Gesamtzahl der Abonnenten – unabhängig vom Social Dienst – lässt sich mit relativ wenig Code auf Blogseiten projizieren. Für diesen Zweck liefert die Blogosphäre eine Vielzahl an Ansätzen. Das Hauptproblem der meisten Techniken ist die mangelhafte bis gänzlich fehlende Zwischenspeicherung der beim Drittserver erfragten Zahl. Blind eingebaut, gleicht der – auf den ersten Blick harmlose – Codeausschnitt den Wert bei jedem Seitenaufruf ab. Performance-Einbussen sind da vorprogrammiert.

Cache alles, was sich bewegt
Dieser Artikel zeigt einen erprobten, professionellen und explizit auf WordPress ausgerichteten Lösungsansatz der automatischen Aktualisierung von Werten. Mit internem Cache-Mechanismus.

Im Einzelnen bedeutet es: In regulären, justierbaren Zeitabständen fordert das in die functions.php gesetzte Script die Gesamtzahl der Follower bzw. Abos über die jeweils verfügbare Schnittstelle des Anbieters an und legt den Rückgabewert anschließend in die Datenbank der WordPress Instanz. Ab dem Zeitpunkt kann der Datensatz aus der DB jederzeit und beliebig oft im Theme-Template verwendet werden, ohne permanent eine ausgehende Verbindung zu Twitter oder FeedBurner herzustellen. Ranking, wir kommen.

Einer für alle(s)
Das Script ist universal, kann sowohl für die Abfrage von Twitter- wie auch FeedBurner-Daten genutzt werden. Beim Funktionsaufruf werden vom Blogger der Typ (also twitter oder feedburner), die ID (bei Twitter der Profilname, für FeedBurner gilt die Feed-ID) und die Cache-Dauer in Stunden als Parameter definiert. Anbei das bis auf die letzte Zeile kommentierte Meisterstück.

Ausgabe der Twitter-Followerzahl im Template

<?php do_action(
  'sm_service_count',
  'twitter',
  'wpSEO', // Twittername
  24 // Cache in Stunden
); ?>

Ausgabe der FeedBurner-Abozahl im Template

<?php do_action(
  'sm_service_count',
  'feedburner',
  '9ocvv4mma9hdhkltp21t32gstc', // Feed-ID
  6 // Cache in Stunden
); ?>

Funktionen zum Abruf und Zwischenspeichern von Daten

<?php
/**
* Zeigt und speichert die Werte
*
* @author  Sergej Müller
*
* @param  str  $type   Typ der Anfrage [twitter || feedburner]
* @param  str  $id     ID des Dienstes [Twitter = Profilname, FeedBurner = Feed-ID]
* @param  int  $hours  Cache-Dauer in Stunden
*/

function sm_show_data($type, $id, $hours = 12) {
  /* Leer? */
  if (empty($id) || empty($type)) {
    return false;
  }

  /* Im Cache? */
  if (!$count = get_transient('sm_count_' .$type)) {
    /* Request */
    $count = sm_get_data($type, $id);

    /* Dauer */
    $expiration = (is_numeric($count) ? 60 * 60 * intval($hours) : 60 * 5);

    /* Cachen */
    set_transient(
      'sm_count_' .$type,
      $count,
      $expiration
    );
  }

  /* Print */
  echo $count;
}

/**
* Ruft werte aus dem Speicher oder der API ab
*
* @author  Sergej Müller
*
* @param  str  $type  Typ der Anfrage
* @param  str  $id    ID des Dienstes
*/

function sm_get_data($type, $id) {
  /* URL */
  if ($type == 'twitter') {
    $url = 'http://api.twitter.com/1/users/show.xml?screen_name=' .$id;
  } else {
    $url = 'https://feedburner.google.com/api/awareness/1.0/GetFeedData?id=' .$id;
  }

  /* Abrufen */
  $response = wp_remote_get($url);

  /* Fehler? */
  if (is_wp_error($response)) {
    return '-';
  }

  /* Kein Inhalt? */
  if (!$body = wp_remote_retrieve_body($response)) {
    return '-';
  }

  /* Parsen */
  $xml = new SimpleXMLElement($body);

  /* Ausgeben */
  if ($type == 'twitter') {
    return intval($xml->followers_count);
  } else {
    return intval($xml->feed->entry['circulation']);
  }
}

/* Hook */
add_action(
  'sm_service_count',
  'sm_show_data',
  10,
  3
);
?>

Hinweise

Sergej Müller

[Der Autor] Sergej Müller ist enthusiastischer Software Engineer mit Schwerpunkten Webentwicklung und WordPress. Seit 2007 programmiert und vertreibt er wpSEO, das weltberühmte und patentierte SEO-Plugin für WordPress-Blogs.

Soziale Werkzeuge

11 Kommentare zum Artikel

63 Tage zuvor | #1 Ellen

Hallo Sergej,

vielen Dank für diese tolle Beschreibung :-) Jetzt kann ich wirklich Schritt für Schritt nachvollziehen, wie man die Feedburner-Zahlen selbst in das Theme einfügen kann. Das der gleiche Code auch noch für Twitter funktioniert ist natürlich genial!

Herzlichen Dank für deine Mühe und viele Grüße,
Ellen

Ellen
63 Tage zuvor | #2 Sergej Müller

Ellen, danke auch dir für die Verknüpfung der Beiträge.

Sergej Müller
63 Tage zuvor | #3 Stephan

Coole Nummer … vielen Dank für diese aussagekräftige Darstellung und Umsetzung auch von meiner Seite.

Gruß Stephan

Stephan
63 Tage zuvor | #4 Jeriko

Müsste es nicht add_action(‘the_service_count’, usw…) heißen? Bzw. do_action(‘sm_service_count’, usw…)?

Jeriko
63 Tage zuvor | #5 Sergej Müller

@Jeriko
Gutes Auge. Natürlich. Habe die Funktionen und Hooks auf der Testumgebung nachträglich umbenannt, hier aber nur die Funktionen korrigiert. Merci.

Sergej Müller
63 Tage zuvor | #6 kingstyler001

Yeah, immerhin einer aus meiner Gegend der Berühmt ist. xD
Wohne nicht weit weg von dir.. um genau zu sein eine Stadt weiter oder so (Elmshorn^^)

mfg

kingstyler001
63 Tage zuvor | #7 Sergej Müller

Hehe, berühmt ist übertreiben. Elmshorn ist mir dagegen ein Begriff ;)

Sergej Müller
63 Tage zuvor | #8 Ritchie

Sergej, muchos gracias! Ich weiß nicht genau, wie du das machst, dass ich bei dir immer genau die Sachen find, die ich dringend suche… bisher ruf ich die Stats live ab, was nicht nur das Performance-Problem bringt, sondern auch, wenn die FB API mal down ist (was nicht sooo selten vorkommt), dass dann “0 zufriedene Leser” dasteht – blöd, wenn die Seite dann grad in dem Moment gecached wird… Insofern kommt mir diese Posting grad extrem gelegen, werd den betreffenden Codeschnippsel gleich mal nach der von dir empfohlenen Methode updaten.

Ritchie
63 Tage zuvor | #9 Sergej Müller

Kein Problem. Die Problematik an einem Live-Update ist auch die, dass bei zu vielen Abfragen pro einen bestimmten Zeitraum, FeedBurner (aber auch Twitter und andere Dienste mit einer API) dann einfach den Zugriff auf die Schnittstelle für eine Weile blockt. Unschön.

Sergej Müller
60 Tage zuvor | #10 Sergej Müller

Habe den Code noch ein wenig optimiert und die Zahl der Minuten bei einer eventuellen Nichterreichbarkeit des Dienstes auf 5 Minuten runtergeschraubt.

Sergej Müller
17 Tage zuvor | #11 Marcus

Ich trau mich jetzt fast gar nicht zu fragen:

Wird das komplette Script jetzt in die Functions.php gepackt? Und wie rufe ich es ab.

Das kriege ich einfach nicht geregelt….

Danke und Gruß

Marcus

Marcus

1 Verlinkung auf den Artikel

› So optimierst du deinen WordPress RSS-Feed mit Feedburner | Elma [...]

Kommentar verfassen