Um neue Artikel zu einem WordPress-Blog hinzufügen zu können, wollte ich die XML-RPC-Schnittstelle mittels PHP verwenden.
Zunächst muss hierfür das Kontrollkästchen “Die WordPress, Movable Type, MetaWeblog und Blogger XML-RPC Schnittstelle aktivieren.” im Menü “Einstellungen”/”Schreiben” aktiviert werden.
Nun suchte ich nach einer direkt verwendbaren Lösung im Internet, da ich sicherlich nicht der Erste war, der Ähnliches bewerkstelligen wollte. Wie erwartet gab es auch eine ganze Reihe von PHP-Skripten, die genau das taten, jedoch mit einem Problem:
Ich wollte auch das Veröffentlichungsdatum manuell mit dem PHP-Aufruf setzen und die meisten Skripte, die ich gefunden hatte, versuchten nicht einmal das zu tun.
Wenige Skripte versuchten zwar das Veröffentlichungsdatum zu setzen, aber das Ergebnis war eine Fehlermeldung ähnlich dieser:
Fatal error: Call to a member function getIso() on a non-object in /var/www/wp-includes/class-wp-xmlrpc-server.php on line 2373
Nachdem ich einige Dokumente über dieses seltsame ISO-8601-Datumsformat gelesen hatte, fand ich selbst eine Lösung:
/**
* Führt einen XML-RPC zu einem WordPress-Blog aus und fügt einen Artikel hinzu.
*
* @param string $title Titel des neuen Artikels.
* @param string $body Inhaltstext des neuen Artikels.
* @param string $rpcurl RPC-URL des Blogs (meist xmlrpc.php im Stammverzeichnis).
* @param string $username Benutzername, der zum Hinzufügen des neuen Artikels verwendet wird.
* @param string $password Passwort, das zum Hinzufügen des neuen Artikels verwendet wird.
* @param string $categories Komma-getrennte Liste von Kategorien (stellen Sie sicher, dass diese in Ihrem Blog bereits existieren).
* @param string $keywords Komma-getrennte Liste von Schlüssel-/Schlagwörtern (im Gegensatz zu den Kategorien müssen diese noch nicht existieren).
* @param string $pubdate Veröffentlichungsdatum in ISO 8601 (mittels date('c') in PHP; aktuelle Zeit wird verwendet, wenn leer).
* @param string $draftonly True, um nur als Entwurf abzuspeichern, False um es direkt zu veröffentlichen (Standard).
* @return string Das Ergebnis des XML-RPC.
*/
function wpPostXMLRPC($title, $body, $rpcurl, $username, $password, $categories, $keywords = '', $pubdate = '', $draftonly = false) {
$content = array(
'title' => $title,
'description' => $body,
'mt_allow_comments' => 1,
'mt_allow_pings' => 1,
'post_type' => 'post',
'date_created_gmt' => '%pubdate%', // Nur als Platzhalter hier.
'mt_keywords' => $keywords,
'categories' => array($categories)
);
$params = array(0, $username, $password, $content, !$draftonly);
$request = xmlrpc_encode_request('metaWeblog.newPost', $params);
// Nun müssen wir das eigentliche Veröffentlichungsdatum setzen:
$request = str_replace('<string>%pubdate%</string>',
'<dateTime.iso8601>' . $pubdate . '</dateTime.iso8601>',
$request);
$ch = curl_init();
curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
curl_setopt($ch, CURLOPT_URL, $rpcurl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 1);
$results = curl_exec($ch);
curl_close($ch);
return $results;
}
Wie Sie sehen können, habe ich die für das korrekte ISO-8601-Datumsformat benötigte Datenstruktur einfach direkt selbst in den XML-Aufruf eingefügt. Das mag vielleicht nicht die eleganteste Lösung sein, sie funktioniert jedoch einwandfrei.
Sind Sie selbst auch bereits auf dieses Problem gestoßen?