Artikel vom 1. Juli 2010
Anzahl der FeedBurner-Abos und Twitter-Follower in WordPress abbilden
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
- FeedBurner-API liefert erst dann einen gültigen Wert zurück, wenn Awareness API im Menüpunkt Publicize aktiviert ist.
- Feed-ID ist die Zeichenfolge nach dem Parameter id (feedburner.google.com/fb/a/dashboard?id=xxx), wenn Feed-Einstellungen im FeedBurner-Account aufgerufen werden.
- Ist der zuständige Dienst mal nicht erreichbar oder liefert unvollständige Daten zurück, so nimmt die Anwendung die Kommunikation in 5 Minuten erneut auf, um den aktuellen Null-Wert so schnell wie möglich los zu werden.
- WordPress 2.8 und PHP5 als Voraussetzungen
[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.
WordPress App für iPad: Posts und Kommentare unterwegs verwalten
11 Kommentare zum Artikel
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, danke auch dir für die Verknüpfung der Beiträge.
Coole Nummer … vielen Dank für diese aussagekräftige Darstellung und Umsetzung auch von meiner Seite.
Gruß Stephan
Müsste es nicht add_action(‘the_service_count’, usw…) heißen? Bzw. do_action(‘sm_service_count’, usw…)?
@Jeriko
Gutes Auge. Natürlich. Habe die Funktionen und Hooks auf der Testumgebung nachträglich umbenannt, hier aber nur die Funktionen korrigiert. Merci.
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
Hehe, berühmt ist übertreiben. Elmshorn ist mir dagegen ein Begriff ;)
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.
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.
Habe den Code noch ein wenig optimiert und die Zahl der Minuten bei einer eventuellen Nichterreichbarkeit des Dienstes auf 5 Minuten runtergeschraubt.
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
1 Verlinkung auf den Artikel
› So optimierst du deinen WordPress RSS-Feed mit Feedburner | Elma [...]