WordPress: Mit PHP und XML-RPC bloggen

WordPress stellt neben dem WordPress-Backend noch eine weitere Administrationsmöglichkeit zur Verfügung: das XML-RPC Interface. Es handelt sich hierbei um eine Schnittstelle, die die Kommunikation zwischen einer externen Anwendung und einem WordPress-Blog ermöglicht. Die Blogeditoren MarsEdit und Windows Live Writer machen beispielsweise davon Gebrauch.

Mit einfachen Mitteln kann man diese Schnittstelle auch mit einem PHP Script ansprechen. So lässt sich ein Blogeintrag hinzufügen oder bestehende Einträge auslesen und weiterverarbeiten. Freundlicherweise liefert WordPress eine fertige Klasse für den Zugriff gleich mit. Man muss diese also nur mit dem passenden Befehl füttern und bekommt das gewünschte Ergebnis zurück.

Im folgenden Beispiel beschreibe ich kurz wie man einen Beitrag verfasst und per XML-RPC übermittelt. Zuerst einmal muss man die Schnittstelle im Blog aktivieren. Dafür setzt man im WordPress-Backend unter EinstellungenSchreiben einen Haken bei “WordPress, Movable Type, MetaWeblog und Blogger XML-RPC Schnittstelle aktivieren“.

Über den Befehl require() bindet man die XML-RPC Klasse aus dem WordPress-Unterverzeichnis wp-includes ein. Als Parameter wird die URL zur Schnittstellendatei an das erstellte Objekt übergeben. Die URL setzt sich aus der kompletten Adresse des Blogs und der Datei xmlrpc.php im Wurzelverzeichnis zusammen.


<?php
// Klasse für XML-RPC Schnittstelle einbinden und aufrufen
require('./wordpress/wp-includes/class-IXR.php');
$rpc = new IXR_Client('http://example.com/wordpress/xmlrpc.php');

Über die Variable $post werden alle Daten des Beitrags übergeben. Tags werden durch Kommata getrennt, Kategorien müssen in einen Array.


// das Post construct:
// Metadaten
$post['title'] 		= 'Beitragstitle';
$post['categories'] 	= array('Kategorie 1', 'Kategorie 2');
$post['mt_keywords'] 	= 'tag1, tag2, tag3';

// Posttext
$post['description'] 	= 'Hier könnte Inhalt stehen';

Es können noch weitere Parameter mit der $post-Variable übergeben werden. Eine Auflistung ist im WordPress Codex zu finden. Der Inhalt darf natürlich über mehrere Zeilen gehen und mit HTML gestaltet werden.

Übermittelt werden die Daten über den Befehl query() der Klasse. Der Erste Parameter ist der Name der gewählten Methode. Die Blog ID ist in der Regel 1, Benutzername und Passwort müssen zu einem Benutzer passen, dem das Verfassen von Beiträgen gestattet ist. Als viertes wird die $post-Variable übergeben und zuletzt lässt sich steuern ob der Artikel veröffentlicht (true) oder als Entwurf (false) abgelegt werden soll.


// query
$status = $rpc->query(
    'metaWeblog.newPost',	// Methode
    1,				// Blog ID, in der Regel 1
    'admin',   			// Benutzer
    'password',			// Passwort
    $post,			// Post construct
    true			// Veröffentlichen?
);

Abschließend kann auf Erfolg geprüft werden und gegebenenfalls eine Fehlermeldung ausgegeben werden.


// Ergebnis überprüfen und ggf. eine Fehlermeldung ausgeben
if(!$status) {
    echo 'Error ('.$rpc->getErrorCode().'): '.$rpc->getErrorMessage();
    exit;
}

// Sonst: ID des neuen Posts ausgeben
echo 'New Post ID: '.$rpc->getResponse();
?>

Läuft alles fehlerfrei durch, wird die ID des neu erstellten Beitrags zurückgegeben. Mit dem fertigen Script kann man jetzt beispielsweise regelmäßig Inhalt von einer Seite abgreifen, aufbereiten und als Blogeintrag veröffentlichen. So lassen sich – cronjob vorausgesetzt – wöchentliche Linklisten von delicious erstellen.

Weiterführende Informationen

14 thoughts on “WordPress: Mit PHP und XML-RPC bloggen”

    1. Der Codex ist an dieser Stelle leider etwas dürftig. Ich habe Tags und Categories von irgendeiner anderen Seite, die ich damals ergoogelt habe. Der Rest sollte unter dem Link aufgeführt sein.

      Google mal ach “metaWeblog.newPost”, da finden sich in einigen Foren noch weitere Felder. Im Codex ist halt leider nur die newPage angegeben und Seiten unterscheiden sich ja ein wenig von Posts.

      1. Hi danke für deine Antwort. Konnte in Foren zwar einiges ähnliches finden. Mir hat aber nichts wirklich weitergeholfen. Die Doku ist hier echt miserabel. Ich hab es nun genau einmal so gemacht, wie du. Nur bekomm ich immer folgende Fehler Exception von meinem WordPress XML RPC Server zurück “Error (403): Falsche Benutzer/Passwort-Kombination.”. Dabei habe ich die Daten mehrmals geprüft. Ps. Dein Webseitenurl ist fehlerhaft und somit hast du in fast jedem deiner Kommentare ein Link zu ner 404 Seite. Ein “l” fehlt 😉 .

  1. Hab es nun soweit, dass alles funktioniert. Bei dem Passwort hatte mir der Firefox statt des I ein kleines L angezeigt. Wenn ich allerdings ein Veröffentlichungsdatum angeben will, kommt folgende Fehlermeldung: “Error (-32700): parse error. not well formed”. $post[‘dateCreated’] = ‘2010-03-04’;. Ich verstehe nicht was der hat. Ist doch ISO 8601 konform… :(

    1. Wie formatierst du denn das Datum? Ich glaube es muss in folgender Form sein: “2007-06-27 00:00:31”. Probier es auch mal mit “date_created_gmt” als Key.

      Und danke für den Hinweis mit der URL :)

  2. Danke für die Anweisung, geht ja einfach. Leider habe ich noch bei einer automatischen übergabe in einer Schleife das Problem das bei einigen Posts der Fehler kommt das es nicht angelegt werden konnte. Kann es sein das die rpc-xml schnittstelle nicht gerade die schnellste ist?

  3. So ja ich schon wieder…
    Anfangs hat das super geklappt… 21 Artikel wurden übernommen… Aber der Rest ist angeblich “32700 : parse error. not well formed” warum das auf einmal?

    ‘date_created_gmt’ => new IXR_Date($zeit)

    führ ich aus… wie gesagt hat auch Anfangs funktioniert…

  4. Ich hab mittlerweile herausgefunden das es wohl am text liegt… wenn ich jetzt richtig bin wenn ich richtg bin ist das problem die html tags bzw > und <

    (Nur als Info falls das irgendwann noch jemand bemerkt…
    und ich meld mich wahrscheinlich wieder wenn ich das hinbekommen habe)

  5. Ich kann dein Problem irgendwie nicht so ganz nachvollziehen. Ich schreibe hier im Blog über ein Script die letzten Links von Delicious.com automatisiert in einen neuen Artikel.

    Das funktioniert bei mir über folgendes Script: https://gist.github.com/826691

    Bei mir ist also massig HTML im Beitragsfeld. Oder verstehe ich dich falsch?

Comments are closed.