Erweiterung der WordPress XML-RPC-Schnittstelle
Ich stand vor kurzem vor dem Problem, dass ich Daten von WordPress in einem anderen Projekt haben wollte. Es ging mir einfach darum die Posts einer Kategorie auszulesen und dort anzuzeigen. Natürlich griff ich damit auf die XML-RPC-Schnittstelle von WordPress zurück, da man nicht den Weg über die Datenbank gehen sollte. Die Datenbanken liegen zwar auf dem gleichen Server, aber irgendwo sollten die Projekte getrennt sein. Es macht auch keinen Sinn die WordPress-Datenbank auszulesen, wenn ein abhängiges Projekt einmal auf einen anderen Server wechseln sollte.
Das Einarbeiten in die Schnittstelle ist recht simpel. WordPress selber bietet dafür zwar wenig Hilfe, aber mit etwas Geschick findet man sie im Netz. Leider ist die Schnittstelle aber nicht gerade ausgereift und liefert allerlei Lücken und Unstimmigkeiten. Zum Beispiel ist die Übertragung von Benutzernamen und Passwort unterschiedlich. Es gibt Funktionen, da muss man erst den Benutzernamen und dann das Passwort übertragen, aber wiederum gibt es Funktionen bei denen man erst eine BlogId (Es war wohl einmal angedacht mehrere Blogs über eine Plattform betreiben zu können) und dann erst Benutzernamen und Passwort übertragen. Dann gibt es auch noch Funktionalitäten, die man eigentlich erwartet, die aber gar nicht Verfügbar sind.
Es gibt keine Funktion in der Schnittstelle um die Posts einer Kategorie abzurufen. Um diese Tücken zu umgehen kann man sich auf einen recht einfachen Wege eine Erweiterung der Schnittstelle entwickeln. Ich habe mich entschlossen dieses über ein Plugin zu tun. Das brachte dann auch schnell den Vorteil mit, dass ich Objektorientiert an die Sache herangehen konnte.
Man beginnt also damit, dass man sich ein Plugin anlegt. Das Grundgerüst dafür sieht einfach aus. Eine PHP-Datei. Diese Datei benötigt einen Kommentierten Kopf, damit WordPress sie als Plugin erkennt.
/*
Plugin Name: Zorta XML-RPC
Plugin URI: http://www.zorta.de
Description: The Plugin adds some functions to the WordPress XML-RPC Library
Author: Denis Zunke
Version: 1.0
Author URI: http://www.zorta.de/
*/
include_once(ABSPATH . WPINC . '/class-IXR.php');
include_once(ABSPATH . WPINC . '/class-wp-xmlrpc-server.php');
class Zorta_XMLRPC extends wp_xmlrpc_server {
public static function zorta_getName()
{
return __CLASS__;
}
}
add_filter('wp_xmlrpc_server_class', array('Zorta_XMLRPC', 'zorta_getName'));
Mit dieser einfachen Datei hat man ein lauffähiges Plugin ohne Funktionalität. Ich habe es nicht ausprobiert, aber würde in diesem Falle davon ausgehen, dass man die XML-RPC-Schnittstelle von WordPress noch nicht überschrieben hat. Sie dürfte also weiter zur Verfügung stehen. Der nächste Schritt war für mich, dass ich eine Art “Hallo Welt”-Funktion einbaue um zu sehen, ob meine Schnittstelle ansprechbar ist. Diese Funktion musste ich aber nun auch offiziell ansprechbar machen, weshalb ich mich entschloss den Konstructor des eigentlichen XML-RPC-Servers zu überschreiben.
public function __construct()
{
parent::__construct();
$methods = array(
'zorta.helloworld' => 'this:zorta_HelloWorld'
);
$this->methods = array_merge($this->methods, $methods);
}
public function zorta_HelloWorld()
{
return 'Hallo Welt!';
}
Diese Funktion aufgerufen war zu erkennen, dass ich alles richtig gemacht habe und mein “Hallo Welt” als Response-Wert bekam. Jetzt konnte ich versuchen über eine weitere Funktion auf die Methodiken von WordPress zuzugreifen um letztendlich meine Kategorien abrufen zu können. Im Handbuch von WordPress nachgeschlagen fand ich auch eine Funktion um das zu tun. Um die Funktion der Schnittstelle bekannt zu machen musste sie zuerst einmal geschrieben werden.
public function zorta_PostsByCategory($args)
{
return get_posts(array('category' => $args[0]));
}
Die Variable $args bezeichnet in diesem Moment die übergebenen Parameter. Dies liest WordPress selbstständig aus dem übergebenen XML aus, da wir die grundlegenden Funktionalitäten des XML-RPC-Servers nicht überschrieben haben. Diese Methodik musste nun aber auch im Konstruktor noch hinzugefügt werden.
$methods = array(
'zorta.helloworld' => 'this:zorta_HelloWorld',
'zorta.postsbycategory' => 'this:zorta_PostsByCategory'
);
Jetzt war es mir möglich von außen meine Posts aus einer beliebigen Kategorie abzurufen. Da dies aber zu unsicher ist brauchte ich auch noch einen Login. Es sollte schließlich nicht jeder auf die Schnittstelle zugreifen können. Auch dafür liefert der WordPress XML-RPC-Server eine Funktionalität, die ich in meiner Klasse verwenden konnte.
if ($this->_zorta_login($args)) {
if (isset($args[2])) {
return get_posts(array('category' => $args[2]));
} else {
return 'There must be a category (2)';
}
} else {
return $this->error;
}
Wie schnell auffällt übergebe ich die kompletten Parameter an eine Funktion, die nicht definiert ist. Eine eigene Login-Funktion. Dies hängt damit zusammen, dass ich eine zentrale Stelle für den Login in meiner Klasse haben wollte. Sie gibt auch vor, dass das erste Argument der Benutzername und das zweite Argument das Passwort sind. Auf diese Weise muss ich dies nicht in jeder neuen Funktion definieren, da ich nur einmal die kompletten Parameter übergebe. Diese Login Funktion ist recht simpel.
private function _zorta_login($args)
{
$username = $args[0];
$password = $args[1];
if ($this->login($username, $password)) {
return true;
} else {
return false;
}
}
Nun sind alle Funktionen beisamen für eine minimale Erweiterung des XML-RPC-Servers. Alles zusammen gefasst ergibt eine einfache Basis zur Erweiterung der Schnittstelle, die WordPress einem bietet. Es gibt viele Gründe warum man das WordPress-Backend für seine eigene Arbeit nutzen kann, schließlich muss man nicht immer alles neu erfinden.
Nun aber auch noch einmal die gesamte Klasse zum Download: zorta-wp-xmlrpc.zip
