postShare – WordPress Plugin04 Mrz

Von Julian am 04.03.2010. Es wurden 5 Kommentare hinterlassen. Du kannst einen Kommentar hinterlassen oder trackbacken.

postShare Logo
Download postShare 0.3

Seit Kurzem haben wir nun ja eine Mailingliste für interessierte Leser und Diskussionen rund um Webdevelopment, Serververwaltung, Netzwerke, Linux oder gar Elektrotechnik eingerichtet – alles was bei einer eierlegenden Wollmilchsau wie das GI Project eben so Gesprächsstoff bietet.
Es bot sich also an, aktuelle Artikel auf eben jener Mailingliste anzukündigen, beispielsweise als Alternative zu RSS. Zunächst entstand daraus eine kurz zusammengehackte Funktion, die bei jedem Veröffentlichen eines Blog-Artikels eine Mail versandt hat. Allerdings stolperte ich dann zufällig über Nils Langner pushWP-Plugin und durchstöberte kurzerhand einmal dessen Vorgehensweise und Funktionalität. Von vielen Dingen habe ich mir dann einfach das Prinzip kopiert, jedoch bin ich schon bald auf einige Unstimmigheiten gestoßen, die mir so nicht gefielen.

Zitat von phphatesme.com:

Das Teil kann bis jetzt eigentlich gar nichts, außer bei einem neuen Artikel einen Tweet abzusetzen.

Die Idee ist, dass ich alle Ideen, die ich so zum pushen des Blogs habe in dieses Plugin packe. Als nächstes wird wohl das “vor einem Jahr” Feature einfließen. Da werde ich euch aber natürlich noch informieren. Unsere WordPress Erweiterung kann man also als Ergänzung zu den ganzen SEO Plugins sehen.

Im Prinzip veröffentlicht das Plugin einen neuen Artikel einfach über Twitter. Meiner Meinung nach nicht sehr viel anders, als das was ich brauchte. Allerdings hätte ich das Ganze für eMails doch etwas umschreiben müssen und die Art und Weise, wie ein AddOn in pushWP hinzugefügt wurde, war mir nicht ganz ersichtlich. PushWP besteht aus einer Basis-Plugin-Datei, wie sie WordPress vorschreibt (wp-content/plugins/pushWP/pushWP.php) und einigen zusätzlichen Dateien, wobei beispielsweise in config_page.tpl.php die HTML-Ausgabe des Plugins im AdminCenter steht und ein Unterordner pushWP/AddOn existiert. Das “twitter-AddOn” ist aber nicht vollständig in diesem Verzeichnis gekapselt, sondern besitzt seltsamerweise auch in der Basis-Plugin-Datei einige Zeilen Code. Das war mir dann doch zu verworren, um es anständig erweitern zu können.

Es entstand ein neues Plugin postShare mit folgenden Dateien:

  • postShare.php – die Basis-Plugin-Datei
  • PostShare.php – enthält die Klasse PostShare
  • PostShareAddon.php – enthält die abstrakte Klasse PostShareAddon
  • config.tpl.php – enthält den HTML-Code zur Anzeige der Einstellungen im Admin-Panel
  • addons/ – enthält AddOns

Die Basis-Datei initialisiert das PostShare-Objekt des momentanen Requests. Zudem werden hier Requests (POST) aus dem AdminCenter an das PostShare-Objekt deligiert, beispielsweise um Einstellungen zu ändern oder AddOns zu aktivieren / deaktivieren. Darüber hinaus wird die WordPress-Funktion transition_post_status gehooked und dadurch eine Funktion aufgerufen, die dem PostShare-Objekt mitteilt, dass es einen neuen Artikel zum verteilen gibt.
Das PostShare-Objekt verwaltet sozusagen all seine Plugins, bietet Möglichkeiten verschiedene Aktionen zu loggen und erstellt zu Beginn entsprechende benötigte Tabellen ö.ä. . Wie man sieht, ist das Plugin durch eigene Tabellen bereits wesentlich aufwändiger gestaltet als pushWP, allerdings entsprechend einfach zu erweitern.

Wie sieht nun ein solches AddOn aus?
Ganz einfach! Ein AddOn ist eine Datei im Verzeichnis postShare/addons/ und enthält eine gleichnamige Klasse, die von PostShareAddon vererbt wird. Dabei müssen lediglich noch drei Methoden vervollständigt werden: install(), share($data) und getName(). Wird das AddOn aktiviert, wird seine share-Methode immer bei einer Veröffentlichung eines neuen Artikels aufgerufen. Das Array $data enthält bereits fertig aus dem Post extrahierte Daten:

	$data = array(
		'title' => $title,
		'content' => $content,
		'content_parted' => $content_parted,
		'link' => $link,
		'author' => $author
	);

Damit sollte der Großteil aller Informationen, die geshared werden sollen, abgedeckt sein. Das Post-Objekt habe ich bewusst nicht an die AddOns weitergereicht, damit man nicht jedes mal mühsam die einzelnen Informationen extrahieren muss (bis ich darauf kam, wie man $author extrahiert, hat es schon ganz schön gedauert!).
Das PostShareEmail-AddOn sieht dann beispielsweise so aus:

<?php
/**
 * @package postShare
 * @author Julian Stier
 * @version 0.2
 */
class PostShareEmail extends PostShareAddon {
	public function share($data){
		$from = $this->getOption('from');
		$to = $this->getOption('to');
		$title = $this->getOption('title');
		$message = $this->getOption('message');
 
 
		$message = str_replace('%title', $data['title'], $message);
 
		$message = str_replace('%content', $data['content'], $message);
 
		$message = str_replace('%less', $data['content_parted'], $message);
 
		$message = str_replace('%link', $data['link'], $message);
 
		$message = str_replace('%author', $data['author'], $message);
 
 
		$title = str_replace('%title', $data['title'], $title);
 
		$title = str_replace('%content', $data['content'], $title);
 
		$title = str_replace('%less', $data['content_parted'], $title);
 
		$title = str_replace('%link', $data['link'], $title);
 
		$title = str_replace('%author', $data['author'], $title);
 
		$header = 'From: ' . $from . "\r\n\\";
		wp_mail($to, $title, $message, $header);
		$this->log('EmailAddon shared '.$data['title'].' to "'.$to.'".');
	}
 
	public function install(){
		$this->setOption('from', '');
		$this->setOption('title', '');
		$this->setOption('to', '');
		$this->setOption('message', '');
 
		$this->log('EmailAddon options resetted (<em>from</em>, <em>title</em>, <em>to</em>, <em>message</em>).');
	}
 
	public function getName(){
		return 'PostShareEmail';
	}
}
 
?>

An einigen Stellen mit Sicherheit noch verbesserungswürdig, aber im Großen und Ganzen eigentlich sehr übersichtlich. Man muss lediglich beachten, in der Methode install() alle später verwendeten Variablen (die konsistent bleiben sollen) zu initialisieren und möglichst Fehlermeldungen im Plugin selbst zu unterdrücken – über die Log-Methode kann man entsprechende Fehler sicher ins Admin-Interface reichen.

postShare Einstellungen

postShare Einstellungen im Admin-Center

postShare ermöglicht automatisch Einstellungen für alle in einem AddOn verwendeten Variablen. Hier würde es sich für spätere Versionen noch anbieten zwischen Einstellungs-Typen zu unterscheiden, um Passwörter in angemessenen Passwort-Feldern unterzubringen oder Beschreibungen dahinter zu verfassen. So muss man nun eben wissen, dass im eMail-AddOn beispielsweise Platzhalter wie %title, %author, %content, %less oder ähnliches zur Verfügung stehen. Ausbaumöglichkeiten sind also reichlich gegeben. postShare zeichnet sich aber durch einfache Erweiterbarkeit aus, auch wenn der Basis-Code an vielen Stellen doch sehr verworren ist – davon müssen die AddOns aber ja nichts wissen.
Nun kann man viele weitere AddOns, wie zum Beispiel ein Twitter-AddOn schreiben. Es sind stets nur zwei bzw. drei Methoden zu implementieren und der eigentliche “Request” durchzuführen – schon verbreitet sich der Artikel per eMail, Twitter, Facebook, Jabber, .. – oder sogar über eine eigene Anwendung.

Download postShare 0.3

5 Kommentare zu "postShare – WordPress Plugin"

  1. Nils sagt:

    Moin,
    finde ich toll, dass du mein Plugin verwendet hast. Besteht die Möglichkeit, dass du die Änderungen wieder zurückfließen lässt und wir ein erweitertes pushWP draus machen?
    Gruß,
    Nils

  2. Julian sagt:

    Hi!
    Der Vorschlag eines zusammengelegten Plugins ist durchaus sinnvoll und gefällt mir. Allerdings wären dann vermutlich auf beiden Seiten große Änderungen notwendig. An was hattest du genau gedacht?

    Viele Grüße

  3. Nils sagt:

    Sowas wie: Du baust es um und ich veröffentliche es :) Bin aber auch für jede andere Idee zu haben.

  4. Julian sagt:

    Scheint mir etwas einseitig. Wie wäre es mit SVN, Entwurf der Funktionalität und gemeinsame Entwicklung? Dann hätte das Ganze auch entsprechende Größe.
    Die beiden Plugins so zu mergen, macht ja nicht viel Sinn, denn sie haben ja beinahe die selbe Funktionalität ;)

  5. [...] laden weiterhin zu regen Erweiterungen ein. Vielleicht ergibt sich ja auch etwas Neues in Sachen postShare oder anderen kleinen [...]

Hinterlasse einen Kommentar

© 2009 GlobalIndustry-Project Blog