Warum alle WordPress-zu-Twitter-Plugins doof sind. Und wie man’s besser macht.
Die Aufgabe scheint so simpel, dass man meinen könnte, die perfekte Lösung sei längst gebaut: Wer bloggt und twittert, möchte seine Twitter-Follower auf neue Blog-Artikel hinweisen. Ganz automatisch, sobald der Artikel veröffentlicht ist. Es gibt zahllose Plugins, die dieses Feature für das Blog-System WordPress umsetzen. Aber all diese Plugins konnten mich nicht überzeugen. Aus mehreren Gründen:
- Die Plugins bieten noch zig andere Funktionen an, die ich nicht brauche. Ich will einfach nur meine Blog-Artikel via Twitter verlinken.
- Der Plugin-Code ist fürchterlich aufgebläht, weil die Entwickler offenbar noch weniger PHP beherrschen als ich und auch nicht gewillt sind, performance-sparende WordPress-Funktionen zu benutzen.
- Die Plugins verhalten sich idiotisch, weil die Entwickler viele Umstände nicht berücksichtigt haben, unter denen Artikel in WordPress veröffentlicht werden können: passwort-geschützte Artikel, terminierte Veröffentlichungen in der Zukunft, Artikel, die nicht über die übliche Browser-Oberfläche veröffentlicht werden (sondern etwa via iPhone).
Es hilft also alles nichts, das Rad muss mal wieder neu erfunden werden. Aber diesmal richtig! ;)
function jtts($post_ID = 0) {
$twitter_usr = ''; // Dein Benutzername bei Twitter
$twitter_pwd = ''; // Dein Passwort bei Twitter
$bitly_usr = ''; // Dein Benutzername bei bit.ly
$bitly_key = ''; // Dein API-Key bei bit.ly
$post = get_post($post_ID);
if ($post_ID == 0 || $post->post_type != 'post' || $post->post_password != '') return $post_ID;
$title = substr($post->post_title, 0, 102);
$url = trim(wp_remote_retrieve_body(wp_remote_get('http://api.bit.ly/v3/shorten?login=' . $bitly_usr . '&apiKey=' . $bitly_key . '&uri=' . urlencode(get_permalink($post_ID)) . '&format=txt')));
$status = 'Frisch gebloggt: ' . $title . ' ' . $url;
wp_remote_post('http://' . $twitter_usr . ':' . $twitter_pwd . '@twitter.com/statuses/update.xml?status=' . urlencode($status));
return $post_ID;
}
Diese 18 Zeilen sind der Kern unseres WordPress-zu-Twitter-Plugins; diese Funktion wird aufgerufen, sobald ein Artikel veröffentlicht wird. Ich habe sie „jtts“ getauft, steht für „Just Tweet That Shit“. Genau das macht sie auch. Und zwar intelligent:
- In Zeile 9 sortieren wir schon mal alle Seiten aus (denn wir wollen ja nur die Artikel). Und auch mit den passwortgeschützten Artikel werden die Twitter-Follower kaum was anfangen können.
- In Zeile 11 stutzen wir die Überschrift zurecht, sollte sie zu lang für den höchstens 140-Zeichen-langen Tweet sein. Hier berücksichtigen wir natürlich, wie viele Zeichen durch die textliche Gestaltung des Tweets und den Link draufgehen (vgl. Zeile 13, ggf. die 102 Zeichen anpassen). Wer extra Fleißpunkte sammeln will, postet in die Kommentare, was wir tun müssen, um bei zu langen Überschriften den Überhang durch drei Punkte … zu ersetzen.
- In Zeile 12 kürzen wir die Artikel-URL mittels bit.ly, damit sie nicht zu viele Zeichen im Tweet beansprucht. Dazu nehmen wir Kontakt zur bit.ly-API auf, mithilfe der beiden Funktionen
wp_remote_get()undwp_remote_retrieve_body(), die WordPress bereitstellt. Diese Funktionen ersparen uns viele Zeilen Code! Auch hier könnt ihr wieder Fleißpunkte sammeln: Wer auf Nummer sicher gehen will, baut noch eine Notlösung ein, sollte bit.ly ausnahmsweise mal nicht erreichbar sein. - In Zeile 13 bestimmen wir, wie der automatische Tweet nachher aussehen soll.
- In Zeil 15 schließlich ist es auch schon so weit: Wir veröffentlichen unseren Tweet über die Twitter-API. Auch hier hilft uns eine zeilen-, zeit- und ressourcensparende WordPress-Funktion:
wp_remote_post().
So schnell kann’s gehen. Jetzt noch schnell die Funktion einbinden:
add_action('publish_post', 'jtts');
Halt! Das war doof! Diese Anweisung, die man massenhaft in WordPress-zu-Twitter-Plugins findet, hat den großen Nachteil, dass unsere Funktion jetzt jedesmal durchlaufen wird, wenn ein Artikel veröffentlicht wird – das bedeutet, auch wenn er bereits veröffentlicht ist und nur eine spätere Änderung gespeichert wird.
Um diese unerwünschten Mehrfach-Tweets zu verhindern, gehen die verschiedenen Plugins unterschiedlich vor. Viele müllen die WordPress-Datenbank zu mit Hinweisen darauf, welche Artikel schon auf Twitter verlinkt wurden. Andere fragen ab, ob der „Publizieren“-Button auf der Browser-Oberfläche geklickt wurde, was aber natürlich nicht der Fall ist, wenn man mit seiner iPhone-App bloggt oder die Veröffentlichung eines Blog-Artikels vordatiert.
Die einzig richtige Methode wird in kaum einem Plugin konsequent durchgezogen. Dabei ist die notwendige Vorgehensweise ausführlich dokumentiert. Also:
if (function_exists('add_action') && function_exists('wp_remote_get')) {
add_action('draft_to_publish', 'jtts');
add_action('private_to_publish', 'jtts');
add_action('future_to_publish', 'jtts');
add_action('pending_to_publish', 'jtts');
add_action('new_to_publish', 'jtts');
}
In Zeile 1 überprüfen wir noch, ob die Funktion von oben, wp_remote_get(), bekannt ist, schließlich gibt es sie erst seit Version 2.7. Anschließend sagen wir WordPress, dass es unsere Funktion immer dann durchlaufen soll, wenn sich der Artikel-Status in „veröffentlicht“ (*_to_publish) ändert.
Den Code ins Plugin-Verzeichnis packen, aktivieren, testen, freuen. Oder in den Kommentaren meckern.
Willkommen,
Trackbacks & Pingbacks
9 Kommentare
byteorder schrieb:
IMHO ist die von dir eingesetzte Twitter-API nicht mehr lange gültig und nutzbar, da Twitter glaube ich komplett auf OAuth umschwenken möchte. Dann wird dein Plugin leider nicht mehr ganz so schlank bleiben fürchte ich…
Ansonsten danke für die Anregungen und den kleinen Einblick in die WordPress-API.
Gruß,
Andreas
Marcel schrieb:
Hi Andreas, vielen Dank für deinen Hinweis! OAuth klingt in der Tat alles andere als schlank. Wenn’s soweit ist, werde ich mich damit mal auseinandersetzen und das Ergebnis hier präsentieren.
Und vielen, vielen Dank an die Leute, die diesen Artikel geflattrt haben!!!
byteorder schrieb:
Hallo Marcel, ich hab eben nochmal in der Twitter API-Dokumentation nachgesehen.
„Basic Authentication sends user credentials in the header of the HTTP request. This makes it easy to use, but insecure. OAuth is the Twitter preferred method of authentication moving forward – come June 2010, we‘ll be turning off Basic Auth from the API.“
http://apiwiki.twitter.com/Authentication
So wie es aussieht soll das alte Authentifikations-Verfahren schon nächsten Monat abgeschaltet werden. So ganz begeistert bin ich darüber allerdings auch nicht.
Marcel schrieb:
Es bleiben noch gut fünf Wochen, in denen die hier vorgestellte Variante funktioniert.
http://countdowntooauth.com/
Ich werde hier im Laufe des Junis ein neues Skript vorstellen, das dann auf OAuth setzt.
Micha schrieb:
Exakt wonach ich seit Wochen gesucht habe! Allerdings habe ich noch nicht ganz raus, wo ich die Funktion einbaue und wo sie abgerufen werden soll? Allerdings warte ich wohl lieber auf die neue Version, dann kann ich meinen Twitteraccount hoffentlich bald live füttern :)
Würde mich sehr freuen, wenn du das neue Script nach Umstellung bald zur Verfügung stellst.
Gruß, Micha
Marcel schrieb:
Hi Micha, du kannst den Code entweder in eine eigene Plugin-Datei packen (also z.B. eine
twitter.phpunter/wp-content/plugins) oder direkt in diefunctions.phpdeines WordPress-Themes.Bin schon am neuen Skript dran und werde es auf jeden Fall noch vor der Umstellung veröffentlichen können. Allerdings sieht im Moment alles danach aus, dass ich das neue Skript direkt als fertiges Plugin zur Verfügung stellen werde, weil das OAuth sonst zu unhandlich wird …
Marcel schrieb:
Kleiner Zwischenstand: Das neue Plugin kommt Anfang kommender Woche. :) Es läuft schon, aber ich werde es in den nächsten Tagen noch intensiv testen.
Marcel schrieb:
Und noch ein Update: Twitter will die alte Autorisierungsmethode nun erst zum 16. August abschalten. Mir egal – Version 0.1 meines Plugins Just Tweet That Shit wird morgen erscheinen. :)
Marcel schrieb:
Ach ja – tada: http://www.marcelpauly.de/just-tweet-that-shit/ ;)
Kommentar schreiben