Serie: Effizienteres Bloggen mit WordPress dank XML-RPC
- Teil 1: Vorstellung einer neuen Serie
- Teil 2: Das Grundgerüst des XML-RPC-Scripts
- Teil 3: Blogpost-Metadaten auslesen
- Teil 4: Bilder hochladen und problematischen Code ersetzen
- Teil 5: Blogpost absenden und ein notwendiger Hack
- Teil 6: Skript Multi-Blog fähig und konfigurierbar machen
So, auf in die erste “richtige” Runde zum Erstellen eines Scripts für den automatischen Upload eines Blogposts. Wie bereits angekündigt arbeite ich für den Aufruf mit Keyboard Maestro (fortan: KM). Für alle, die damit nichts anzufangen wissen: KM ist ein Programm für OS X, mit dem sich wiederholende Aufgaben automatisieren lassen. Das reicht von einfachen Abfolgen von Tastenkombination über Bildbearbeitung und Spielereien mit der Zwischenablage bis hin zur Aktivierung verschiedener Skripte. Letzteres werden wir benutzen. KM ist hierfür nicht zwingend notwendig, dazu weiter unten mehr.
Das KM-Makro in der Übersicht
Schaut euch mal das angelegte Makro an:
Es besteht lediglich aus 2 Komponenten: dem Speichern der Zwischenablage, welches nachher unser HTML-Markup für den Blogpost enthalten wird, und dem Aufrufen eines Shell-Scripts.
Voraussetzung ist also an dieser Stelle, dass ihr euren Blogpost fertig geschrieben habt und dieser in HTML-Form in der Zwischenablage liegt. Viele Editoren – egal ob Markdown-basiert oder nicht – haben eine HTML-Export-Funktion an Bord. Den dabei entstehenden Output müsst ihr kopieren. Zur Erinnerung: ich verwende dafür den ⌘⌥C Shortcut in Byword, der mir den HTML-Output direkt in die Zwischenablage schemeißt.
Speichern der Zwischenablage
Wozu die Zwischenablage in einer KM-Variable speichern? Ganz einfach, wir wollen nachher ja irgendwie auf das HTML zugreifen. Die Variablen von KM sind im PHP-Skript über das globale $_SERVER
-Array abrufbar. Da meine Variable in KM also temp heißt, sieht die Zuweisung in PHP nachher folgendermaßen aus:
$htmlString = $_SERVER['KMVAR_temp'];
Aufrufen eines Shell-Scripts
Das Shell-Script ruft eigentlich nur das PHP-Script auf, in meinem Fall:
php /Users/Enno/Sites/xmlrpc/index.php
Dadurch wird die Ausführung des Scripts angestoßen.
Alternativen ohne KM
Der Aufruf eines einfachen Shell-Scripts nach vorherigem Setzen einer Variable ist jetzt nicht die große Kunst der Automation. Es sollte also auch ohne KM zu lösen sein. Wichtig ist, die Variable bzw. den HTML-String in das Skript zu bekommen. KM ist an dieser Stelle für mich am einfachsten.
Möglich wäre allerdings auch ein Aufruf über das Terminal, bei dem dann der HTML-String als Argument angehangen wird:
php /Users/Enno/Sites/xmlrpc/index.php "<h1>cooler HTML String</h1>"
Der Zugriff im PHP-Script würde dann so erfolgen:
$htmlString = $_SERVER['argv'][1];
$_SERVER['argv']
enthält alle an das Script übergebenen Argumente. An Index 0 ist dabei der Pfad des Scripts selbst, Index 1 das erste Argument, Index 2 das zweite etc.
Den Aufruf des Terminal-Scripts könnt ihr auf dem Mac über den Automator sicherstellen. Dazu einfach einen Automator-Workflow anlegen und einen Shortcut vergeben. Um zu verstehen, wie ein solcher Workflow/Arbeitsablauf/whatever angelegt wird, schaut mal hier oder hier. Für Windows-People habe ich dahingehend mangels Kenntnissen leider keine Lösung parat. Sollte aber auch unter dem Microsoft’schem Betriebssystem irgendwie machbar sein. Wer Ideen hat, bitte in die Kommentare. Ich nehme sie dann helfenderweise und unter lebenslanger Tributzollung in diesen Blogpost auf 😉
Weitere Vorbereitungen
Jetzt haben wir schonmal sichergestellt, dass der HTML-Output des Blogposts in unserem PHP-Skript landet. Fein 🙂 Was als nächstes ansteht? Metadaten auslesen, konkret: Titel, Kategorien, Tags, Slug und Auszug. Dazu komme ich im nächsten Teil der Serie. Zur Vorbereitung darauf könnt ihr jetzt noch folgendes machen:
- index.php anlegen (falls nicht schon erledigt)
- Eine Klasse anlegen, die wir in den folgenden Teilen mit ordentlich Code füllen werden.
- Die Klasse für den XML-RPC-Austausch inkludieren.
Die XML-RPC-Klasse könnt ihr euch hier herunterladen. Davon ausgehend, dass ihr sie in einen Unterordner (inc) packt, könnte eure index.php so oder so ähnlich aussehen:
<?php
require_once 'inc/IXR_Library.php';
class EnnoAutoPost
{
public function __construct($htmlString)
{
// do something
}
}
$htmlString = $_SERVER['KMVAR_temp'];
$obj = new EnnoAutoPost($htmlString);
echo "fertig";
Es bietet sich an auch die eigene Klasse (in meinem Fall EnnoAutoPost) in den inc-Ordner zu schieben, so dass ihr nur die Einbindung jener Klasse und die unteren 3 Zeilen in eurer index.php habt:
<?php
require_once 'inc/EnnoAutoPost.php';
$htmlString = $_SERVER['KMVAR_temp'];
$obj = new EnnoAutoPost($htmlString);
echo "fertig";
Klar soweit? Nicht? Dann Fragen bitte in die Kommentare. Ansonsten: bis zum nächsten Teil 😉