Performance ist nicht gleich Performance

Ich bin kein großer Fan von Performance-Tests, dass sage ich gleich vorweg. Der Grund ist schlichtweg der, dass man vergleichbare Umgebungen voraussetzen muss um die Ergebnisse übertragbar zu machen. Wenn ich Plugin auf System A teste, rennt es noch wie doof. Teste ich es aber auf System B, hinkt und hakt es wie ein lahmer Gaul.
Der Grund dafür liegt in der Optimierung der Systeme, sofern sie optimiert sind. Als Beispiel möchte ich nur die Anbindung an den MySQL-Server nennen. Hier gibt es etliche verschiedene Konfigurationen für die unterschiedlichsten Anwendungsfälle. Werden viele kleine Datensätze abgefragt, optimiert man den MySQL-Server anders als wenn man ihn für wenige große Datensätze benötigt. Somit würde das gleiche Plugin auf beiden Systemen unterschiedlich performant sein, alleine deshalb weil die Anbindung an die Datenbank anders ist.
Nicht viel anders sieht es beim Server selber aus. Auch hier gibt es unzählige Optimierungsvarianten. Hinzu kommt noch unterschiedliche Server-Software, Betriebssysteme auf denen der Server läuft bis hin zu der Hardware die einen sehr wesentlichen Teil der Performance ausmacht. Wie soll man da einen gemeinsamen Nenner finden den man als Grundlage des Vergleichs heranziehen kann?

Viele Tests messen einfach das, was man einfach messen kann. Das wäre dann z.B. der Speicherverbrauch. Dann wird auch gerne die Ausführungszeit gemessen, was aber aufgrund der unterschiedlichen Systeme schon kaum noch Aussagekraft hat. Reicht das alles nicht, kommen gerne noch so obskure Faktoren wie Codezeilen oder Anzahl der verwendeten Hooks und Filter hinzu.
Selten bis gar nicht wird die Code-Qualität bewertet. Dies ist für mich aber ein sehr wichtiges Kriterium. Denn ein schlampig programmiertes Plugin läuft oft auch schlampig, wirft Fehlermeldungen und ist nicht zukunftssicher. Häufig sieht man Plugins die über die Jahre gewachsen sind bis der Autor selber den Überblick verliert. Entweder wird das Plugin dann von Grund auf neu programmiert und weiter gepflegt. Oder aber, was häufiger vorkommt, man lässt das Plugin so wie es ist und kümmert sich nicht mehr darum.
Nun ist Code-Qualität nicht ganz so einfach zu “messen”. Man muss den Code bewerten und hierzu eine Reihe von Kriterien heranziehen. das kostet Zeit und Mühe, weshalb es wohl niemand macht. Ein Kriterium wären zum Beispiel die Übersichtlichkeit. Das kann eigentlich jeder bewerten der sich den Code anschaut. Oder aber auch ob der Code ein Wust aus wilden Zeilen darstellt die kaum entzifferbar sind. Ist der Code gut kommentiert damit auch jemand der nicht so viel Ahnung von Programmierung hat versteht was da vor sich geht. Hält der Code sich an gewisse Programmierrichtlinien. Nur um mal einige wenige Kriterien zu nenne die man verwenden kann.
All das kann man mit Noten bewerten, sogar relativ objektiv. Nun werden einige sagen “Hauptsache es rennt!“. Das ist natürlich auch ein Argument. Also zieht man noch die Anzahl an Fehlern, Notices usw. heran die das Plugin wirft wenn man es einsetzt. Auch grausam geschriebener Code kann fehlerfrei laufen. So kommt man schon zu einen recht guten und nachvollziehbaren Ergebnis.
Kennt man sich bei der Programmierung ein wenig besser aus, dann kann man auch noch einzelne Code-Abschnitte genauer unter die Lupe nehmen. Ist der Code gemäß den empfohlenen Vorgaben geschrieben? Wenn nicht, macht es Sinn von den Vorgaben abzuweichen? Gibt es “merkwürdige” Programmiertechniken im Code oder ist alles auf den ersten Blick verständlich?

Für mich sind dies deutlich wichtigere Faktoren als Millisekunden Laufzeit und Megabyte Speicherverbrauch. Denn dies sind Faktoren die ich erklären kann, so dass auch jemand der weniger Ahnung hat versteht wie ich zu meinen Testergebnis gekommen bin. Und vor allem wird schnell deutlich wo noch Potenzial für Verbesserungen besteht. Code der leicht verständlich ist, wird auch gerne von anderen gepflegt, so dass er sich recht schnell verbreitet und mit der Zeit (hoffentlich) besser wird.

Ein ziemlich merkwürdiger Test macht hingegen gerade auf Google+ die Runde. Es geht um den Plugin-Test von MillaN. Sergej Müller hat sich wohl zurecht gefragt wie MillaN auf seine Ergebnisse kommt. Getestet wurden 35 Plugins aus den unterschiedlichsten Kategorien und mit einem Wert von 1 (schlecht) bis 5 (sehr gut) bewertet. Nur wie dieser Wert zustande kommt, bleibt vielen vollkommen unergründlich.
Vielleicht ist weniger Speicherverbrauch besser als mehr? Also FPW Post Instructions bekommt eine 4 bei einem konstanten Speicherverbrauch von 0,1MB. GD Press Tools Pro verbraucht zwar 29 mal so viel Speicher (2,9MB), bekommt aber die Bestnote 5. Es scheint also etwas mit dem Speicherverbrauch im Frontend bzw. Backend zu tun zu haben. Denn GD Press Tools Pro verbraucht im Frontend “nur” 2MB Speicher, während FPW Post Instructions sowohl vorne wie hinten den gleichen Speicherverbrauch hat. So wirklich schlüssig ist das Konzept jedoch nicht. Denn Event Manager bekommt die schlechteste Note 1 bei einem Speicherverbrauch von 5 bzw 3,7MB (Front-/Backend). GD Custom Posts And Taxonomies Tools Lite bekommt für die gleiche Leistung (1,5/1,3MB) eine noch ganz gute 4 verpasst. Event Manager ist also schlechter obwohl es mehr Speicher einspart?
Ich könnte jetzt noch weiter rätseln ob es vielleicht an der Ausführungszeit liegt oder an der Anzahl der verwendeten Hooks. Vielleicht auch am Mondstand beim Test des Plugins. Man weiß es nicht und der Autor trägt auch nicht zur Aufklärung bei.

Grade 2 plugins have only some elements of optimization, but they are close to grade 1. Adminimize plugin shouldn’t even load on the front end except for some elements, and that needs to be optimized.

Das soll also der Grund sein warum einige Plugins schlechter sind als andere? Adminimize soll z.B. im Frontend nur das laden was es benötigt, was es im Prinzip auch macht, dies sollte aber optimiert werden? Hö? Es scheint also darum zu gehen was ein Plugin im Front- bzw. Backend lädt. Da ist es wohl egal welche Aufgabe es hat, wenn es nicht den geheimen Richtlinien des Autors entspricht, ist es schlecht.

Na dann schauen wir uns doch mal eins dieser supertollen Grade-5 Plugins an. Ich habe mich für GD Unit Converter entschieden und es mal unter die Lupe genommen. Was mir beim ersten Blick auffiel, waren folgende Codezeilen:

$this->script = $_SERVER["PHP_SELF"];
$this->script = end(explode("/", $this->script));

Und? Sinn erkannt? Also ich habe erst mal längere Zeit gerätselt was da passiert bis ich den Code kopiert und getestet habe. OK, ich schreibe es mal ein wenig um:

$this->script = basename(__FILE__);

So einfach kann PHP sein. Der nächste Horror folgt sofort:

    private function plugin_path_url() {
        $this->plugin_url = plugins_url("/gd-unit-converter/");
        $this->plugin_path = dirname(dirname(__FILE__))."/";

        define("GDUNITCONVERTER_URL", $this->plugin_url);
        define("GDUNITCONVERTER_PATH", $this->plugin_path);
    }

Da werden also zwei globale Variablen definiert die zwanzig Zeilen später bei einem wp_enqueue_script() wieder verwendet werden. Klar, man hätte auch einfach auf $this->plugin_url zurück greifen können (OOP, u know!?). Aber warum sparsam mit dem Speicher umgehen wenn man doch so schön sinnlos welchen durch Verwendung globaler Variablen verschwenden kann?
Ach ja. Weil man anderen gerne vorschreibt sie sollen doch bitte schön sparsam mit dem Speicher umgehen:

I am sure that many developers will say that these results are not important, but considering that most of the WordPress users are on shared hosting with limited memory and resources available to them, this is most important thing to have plugins they need and still have server running fine.

Also Wasser predigen und Wein saufen. Contactform 7 bekommt übrigens nur eine schwache 2, dafür aber eine extra Erwähnung:

All tested plugins, but one, used the internal WordPress AJAX handling. Contact Form 7 uses own handler and that is not something I can recommend. Using WP handler is best solution considering that it is already written with security concerns in mind and it is very easy to use, making plugin fit better with WP development concepts.

Muss ich extra erwähnen das GD Unit Converter seinen eigenen Caching-Mechanismus mitbringt und mal ganz elegant auf den in WordPress bereits eingebauten Caching-Mechanismus pfeift?
Natürlich darf auch der eigene Logger nicht fehlen, der zwar nicht genutzt wird aber dennoch geladen werden muss (require_once). Über solch lustige Konstrukte wie folgenden wundert man sich dann schon gar nicht mehr.

$js_url = defined("SCRIPT_DEBUG") && SCRIPT_DEBUG ? "js/src/unit-converter.js" : "js/unit-converter.js";

Wenn SCRIPT_DEBUG definiert ist, sollen die JavaScripte aus dem nicht vorhandenen Verzeichnis js/src/ geladen werden. Das gibt lustige Fehlermeldungen wenn man sein Blog im Debug-Modus startet. So lustig, das man das Plugin sofort deaktiviert.

Es ist einfach schlau daher zu reden und dann selber solch einen Mist zu veröffentlichen. Gefühlt die Hälfte des Codes die das Plugin umfasst ist sinnlos, wird nicht benötigt, verstößt gegen Coding Guidelines oder ist schlichtweg Speicherverschwendung. Hier sollte der Herr MilanN vielleicht selber noch mal Hand anlegen und das Plugin um fluffige 90% Code reduzieren bevor er ihm die Bestnote 5 verpasst. Ich habe mich vorhin mal eine Stunde lang hingesetzt und versucht das Plugin von Scratch (also ohne Vorlage) nachzubauen. Nach einer Stunde hatte ich bereits brauchbare Ergebnisse und kam mit einem Zehntel an Code aus. Der Speicherverbrauch dürfte noch sparsamer sein, da ich nicht total unnützes Zeug lade, sondern mich darauf beschränke das zu nutzen, was ich benötige.

Solche Tests die nicht klar machen wie eine Bewertung zu Stande kommt und bei denen der Autor sich die Testbedingungen so zurecht biegt das er sich selbst Bestnoten verpassen kann, kann man getrost außer Acht lassen. Hier muss sich jeder selber fragen wie objektiv der Test sein kann wenn die eigenen Plugins den Maßstab vorgeben. Da sollte man sich als Autor nicht wundern wenn andere einen auf den Zahn fühlen und zeigen wo der Mops die Locken hat.

Fazit

Gute Tests sind objektiv und vergleichen nicht eigene Arbeit mit der von Fremden. Wird die eigene Arbeit dennoch im Test mit einbezogen, dürfen die Testkriterien nicht auf die eigene Optimierung hin zugeschnitten sein.
Die Testkriterien sollten klar und verständlich sein. Was man als Leser nicht nachvollziehen kann, ist nichts wert. Ist es fraglich wie eine Bewertung zu Stande gekommen ist, ist der ganze Test wertlos. Moinka Thon-Soun hat auf Texto in einen Artikel beschrieben wie ein schlecht gemachter Test auf einen Laien wirkt. Nämlich verwirrend, sonst nichts.
Die Tests sollten nachprüfbar sein. Dazu müssen Testscripte zugänglich sein und die Testumgebung erläutert werden.
Test sollten nicht auf einen einzelnen Aspekt fokussiert sein. Jeder Test hat einen Schwerpunkt, dies rechtfertigt jedoch nicht eine schlechte Bewertung weil ein Testkandidat eben nicht genau den Schwerpunkt trifft. Ein guter Tests umfasst mehrere Aspekte und bildet aus den Einzelergebnissen eine Bewertung. Jedes Plugin hat seine Stärken und Schwächen. Ein Plugin das optisch gut gestylt daher kommt, verbraucht eben mehr Speicher (mehr Grafiken, mehr CSS, mehr Code) als ein Plugin welches sehr spartanisch gestaltet ist. Was nützt einem aber ein Plugin das am falschen Ende spart, wenn es durch seinen Purismus nur schwer bedienbar ist?
Tests sollten sich auf das beschränken, was unter anderen Systemen ähnliche (vergleichbare) Ergebnisse liefert. Eine systemunabhängiger Wert sind z.B. Fehlermeldungen (auch Notices und Deprecated Meldungen) . Die werden auf jeden System gleich sein, denn falsch ist hier wie da falsch.
Test sollten realitätsnah sein. Im Labor gelten andere Regeln als in der Wildnis. Selbst wenn ein Plugin im Test wunderbar abschneidet, kann es dadurch versagen das es andere Plugins behindert oder gar komplett ausschaltet. Man kann nicht alle Kombinationen von Plugins prüfen, jedoch gibt es eine Reihe von Regeln für ein friedliches Miteinander die man beachten sollte.

Also bitte nicht jeden Test blauäugig Glauben schenken. Lieber einmal mehr als einmal zu wenig an den Ergebnissen zweifeln. Wir wissen doch alle: Die Statistik die man selber gefälscht hat, ist immer noch die beste ;)


Quick-Tipp: Benutzer nach Anzahl der Beiträge sortieren

Seit WordPress3.1 lassen sich einige Tabellen im Backend durch einen Klick auf die Spaltenüberschrift sortieren. Auf der Benutzer-Seite lassen sich so z.B. die Benutzer nach Name, E-Mail oder Benutzername sortieren.
Wer ein Blog mit vielen Autoren betreibt, möchte vielleicht auch mal die Benutzer nach Anzahl der geschriebenen Beiträge sortieren lassen. Dies ist jedoch nicht möglich, da nur die ersten drei Spalten sortierbar sind. Mit ein paar Zeilen PHP kann man dies jedoch ändern.

Dazu filtern wir das Array mit den sortierbaren Spalten und fügen den Spalten-Schlüssel ‘posts‘ hinzu. Den Spalten-Schlüssel finden wir in den Core-Dateien, genauer gesagt in der Klasse WP_Users_List_Table (wp-admin/includes/class-wp-list-users-table.php; Zeile 160 – 174) (direkt da drunter finden wir dann übrigens auch gleich die sortierbaren Spalten).
Der Name des benötigten Filters setzt sich aus einem Muster und den Screennamen zusammen: manage_xxx_sortable_columns. xxx ist dabei durch den Screennamen zu ersetzen. Dies funktioniert auch mit anderen Seiten im Backend, sofern dort eine Tabelle mit WP_List_Table erstellt wurde. Dazu ein anderes mal mehr.

Der Wert für den entsprechenden Eintrag im Array kann entweder ein String oder ein Array sein. Übergibt man lediglich einen String, so legt man nur fest wonach sortiert werden soll. In diesen Fall wird dann die Standardsortierung asc (Ascending = Aufsteigend) verwendet. Möchte man eine absteigende Reihenfolge (desc = Descending = Absteigend), so muss man anstatt eines String ein Array übergeben. Der erste Wert im Array ist dabei der Schlüssel nach dem sortiert werden soll und der zweite Wert die Reihenfolge (asc/desc).
In unseren Fall ist es ganz sinnvoll absteigend zu sortieren damit die Benutzer mit den meisten Beiträge als erstes aufgelistet werden. Wir übergeben also ein Array. Da wir nach Anzahl der Beiträge sortieren wollen, ist der erste Wert demnach ‘post_count‘ und der zweite Wert ‘desc‘.

Das modifizierte Array mit return zurück geben und schon sind wir fertig. Im großen und Ganzen ist das alles eine recht interessante Sache da man auch Spalten hinzufügen bzw. entfernen kann. Dieser Code-Schnipsel ist lediglich ein kleiner Einstieg, ich werde demnächst noch etwas zu den Thema “Spalten in Tabellen” schreiben. Hier noch das komplette Plugin (wer es nicht als Plugin haben will, kopiert sich den Filter und die Funktion in die functions.php. Mit PHP5.3 ist das übrigens alles sehr kompakt und ein schöner Fall für eine anonyme Funktion).

<?php
/*
Plugin Name: Sortable post column
Description: Make posts column on users screen sortable
Version: 0.0.1
Author: Ralf Albert
Author URI: http://yoda.neun12.de
*/

// make posts-column sortable
add_filter( 'manage_users_sortable_columns', 'register_user_post_column_sortable' );

function register_user_post_column_sortable( $columns ){
$columns['posts'] = array( 'post_count', 'desc' );
return $columns;
}

/* PHP5.3 style */
/*
add_filter( 'manage_users_sortable_columns',
function( $columns ){
$columns['posts'] = array( 'post_count', 'desc' );
return $columns;
}
);
*/


XML mit poEdit übersetzen

Vor einiger Zeit stand ich vor dem Problem das ich XML-Dateien hatte die zu übersetzende Zeichenketten enthielten. Mein erster, wahrscheinlich auch naheliegendster, Gedanke war, die zu übersetzenden Zeichenketten einfach in ein __() zu packen und zu hoffen das poEdit dies erkennt. Das Problem daran war aber, dass __() eine PHP-Funktion ist und die XML-Dateien mit simplexml verarbeitet wurden. Die PHP-Funktion würde also erst gar nicht ausgeführt werden, selbst wenn poEdit die Zeichenketten erkennen würde. Unter Zuhilfenahme von Suchmaschinen lies sich aber recht schnell eine Lösung für das Problem finden.

In poEdit muss man einen neuen Parser anlegen (Datei -> Einstellungen -> Parser):

  • Sprache: XML
  • Durch Semikola getrennte Liste der Dateiendungen (z.B. .cpp;.h): *.xml
  • Parser Befehl: xgettext --force-po -o %o %C %K %F -L glade
  • Ein Eintrag in der Schlüsselwortliste: -k%k
  • Ein Eintrag in der Eingabedatei-Liste: %f
  • Zeichensatz des Quellcodes: --from-code=%c

Erzeugt man nun einen neuen Katalog, so fügt man in den Katalogoptionen unter Schlüsselwörter noch ein zusätzliches Schlüsselwort ein. Diesen kann man relativ frei wählen, ich habe mich hier für translate entschieden.
In der XML-Datei muss man nun noch die zu übersetzenden Zeichenketten mit seinen gewählten Schlüsselwort umschließen:

<root>
  <title><translate>My headline</translate></title>
  <text><translate>This is the text</translate></text>
  <options>
   <font>strong</font>
   <color>black</color>
  </options>
</root>

poEdit ist nun in der Lage die in der XML-Datei mit translate gekennzeichneten Zeichenketten zu übersetzen.

Unter Windows kann es vorkommen das man noch eine Fehlermeldung erhält das glade und/oder expat nicht unterstützt werden. Das liegt an der mit poEdit ausgelieferten Version von gettext. In diesen Fall sollte man sich das vom gnuwin32 Projekt bereit gestellte gettext-Paket runterladen.
Die in dem Paket enthaltenen Dateien kopiert man sich dann in poedit/bin/ (vorher das Verzeichnis sichern). In einigen Quellen wird angegeben das man lediglich die gettext.exe kopieren muss, andere sagen man kopiert sich die gettext.exe, startet sie und schaut welche Abhängigkeiten/Bibliotheken (.dll Dateien) noch fehlen. Ich habe einfach das komplette Paket kopiert (WinXP / Win7) und es funktioniert einwandfrei.


WP_Editor mit externen Seitenaufrufen verwenden

Frank hat auf WordPress Deutschland schon vom neuen Editor in WordPress 3.3 berichtet. Die Verwendung der Klasse WP_Editor ist mit der Funktion wp_editor() denkbar einfach. Im einfachsten Fall übergibt man der Funktion einen String für den Content und eine ID für die Textarea. Beide Angaben sind Pflichtangaben, einen leeren Editor – was wohl die Standardsituation sein dürfte – muss man also mit der Übergabe eines leeren Strings oder ein Boolean FALSE erzwingen.

Die genaue Konfiguration der Editor-Klasse soll aber nicht Gegenstand des Beitrages sein. Denn beim Testen der neuen Editor-Klasse bin ich auf ein ganz anderes Problem gestoßen zu dem ich hier ein paar Worte schreiben will.

Mein Wunsch war es nämlich, den Editor in einer Thickbox zu öffnen, dazu sollte der Editor mittels einem Ajax-Request in die Thickbox geladen werden. Was auf den ersten Blick recht simple erscheint, birgt ein paar Stolperfallen in sich. Denn der alleinige Aufruf von wp_editor() erzeugt zwar das benötigte HTML, jedoch nicht die ebenfalls benötigten JavaScripte.

Die Ausgangssituation ist folgende: Ich habe für den TinyMCE ein Plugin welches eine Thickbox öffnet und den Inhalt der Datei editor_popup.php in die Thickbox lädt. Die Datei editor_popup.php hat anfangs folgenden schlichten Inhalt:

<?php
// get wp-load
$abspath = isset( $_GET['abspath'] ) ? $_GET['abspath'] : '';
if( '' != $abspath )
	require_once $abspath.'/wp-load.php';
else
	die('No abspath submitted!');
?>
<!DOCTYPE html>

<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
		<title>Thickbox test</title>
	</head>

	<body>

		<div id="editorwrapper">
			<form action="display.php" method="get" target="_blank">
<?php 
	wp_editor( '<p>Some more content</p>', 'editortest' );
?>
				<input type="submit" value="Submit" />
			</form>
		</div>

	</body>
</html>

Den ABSPATH übergebe ich als GET-Request, somit ist es ein Leichtes wp-load.php einzubinden um an die WordPress-Funktionen zu gelangen. Der Rest ist ein bisschen HTML und der Aufruf der Funktion wp_editor().
Dies führte jedoch zu keinem Ergebnis, denn es fehlt so ziemlich alles an JavaScript was benötigt wird damit der Editor überhaupt betriebsbereit ist.

Schaut man sich die Klasse WP_Editor einmal etwas genauer an, so findet man zwei Methoden die das Einbinden und die Ausgabe des benötigten JavaScriptes übernehmen. Dies sind zum einen enqueue_scripts() und editor_js(). Diese Methoden übernehmen die Ausgabe bzw. das Einreihen des benötigten JavaScriptes und werden in den Hooks ‘admin_print_footer_scripts‘ / ‘wp_print_footer_scripts‘ bzw. ‘admin_footer‘ und ‘wp_footer‘ eingehakt.
Da wir in unserer Testseite weder den einen noch den anderen Hook automatisch ausführen, müssen wir dies von Hand machen. Dazu fügen wir einfach vor dem schließenden </body> ein <?php do_action( 'wp_footer' ); ?> ein. Um noch das passende Loook&Feel von WordPress zu bekommen, nutzen wir das Admin-CSS und optional noch z.B. das Stylesheet ‘colors-fresh‘ um ein paar Buttons zu stylen.

<?php
add_filter( 'show_admin_bar', '__return_false' );

$styles = array( 'wp-admin', 'colors-fresh'  );
wp_print_styles( $styles );
?>

Dieser Code kommt vor dem schließenden </head>. Nebenbei habe ich noch die Admin-Bar entfernt, da diese in einem kleinen Popup eher suboptimal dargestellt wird und obendrein eher nutzlos ist.

Et voilá! Da ist der funktionierende Editor. Und hier noch einmal das komplette Script zusammen:

<?php
// get wp-load
$abspath = isset( $_GET['abspath'] ) ? $_GET['abspath'] : '';
if( '' != $abspath )
	require_once $abspath.'/wp-load.php';
else
	die('No abspath submitted!');
?>
<!DOCTYPE html>

<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
		<title>Thickbox test</title>

<?php
add_filter( 'show_admin_bar', '__return_false' );

$styles = array( 'wp-admin', 'colors-fresh'  );
wp_print_styles( $styles );
?>	
	</head>

	<body>

		<div id="editorwrapper">
			<form action="display.php" method="get" target="_blank">
<?php 
wp_editor( '<p>Some content</p>', 'editortest' );  //, $settings );
?>
				<input type="submit" value="Submit" />
			</form>
		</div>
<?php
do_action( 'wp_footer' );
?>
	</body>
</html>

Wenn wir dieses Script nun in der Datei wp-content/plugins/editor_popup.php abspeichern, dann können wir sie z.B. mit http://example.com/wp-content/plugins/editor_popup.php?abspath=c:/htdocs/wordpress in einem Ajax-Request aufrufen und z.B. in einer Thickbox darstellen.

Wie man dann den Editor an seine Bedürfnisse anpasst, ist genug Stoff für einen eigenen Artikel. Ich hoffe dem einen oder anderen schon vor Erscheinen von WordPress 3.3 eine kleine Hilfe gegeben zu haben wie man solch ein Problem lösen kann.


Vollbild oder vollblöd?

Derzeit wird ein neues “Killerfeature” in WordPress-Kreisen diskutiert: Distraction-free writing mode
Ablenkungsfreies Schreiben scheint zu einem kleinen Hype in der WP-Gemeinde zu mutieren. Zumindest was die Entwickler angeht, den Kommentaren zu den Thema kann man entnehmen, dass die Nutzer eher wenig Begeisterung dafür entwickeln können.

Im Grunde genommen geht es dabei lediglich um einen Vollbildmodus für den TinyMCE. Für kleine Displays wie z.B. Netbooks oder Smartphones bestimmt eine interessante Alternative. Wenn nur wenig Platz vorhanden ist, sollte man so viel Unnötiges wie möglich ausblenden können.
Aber für den gewöhnlichen WP-Nutzer dürfte es eher verwirrend als hilfreich sein. Mir stellt sich hierbei gleich die Frage, wenn es denn ein so unverzichtbares Feature ist das man dafür gleich ein Ticket aufmachen muss, warum ist der Wunsch danach nicht schon viel früher aufgetaucht? Und warum gibt es dafür nicht schon längst eine ganze Reihe an Plugins die dies umsetzen?

Ich gehe davon aus das es nur eine sehr kleine Gruppe gibt die diese Funktion nutzen würde. Allerdings ist diese kleine Gruppe recht stimmgewaltig innerhalb der WP-Szene, so das der Eindruck entsteht es wäre eine gute Idee diese Funktion in den Core zu übernehmen.

Nun gibt es ja bereits dieses eine Plugin im Trac. Sollte man es nicht dabei belassen anstatt den Code mit Funktionen die nur sehr wenige nutzen würden unnötig aufzublähen? Ein Ziel von WP 3.2 soll ja schließlich eine Verschlankung und Entschlackung des Codes sein.
Meiner Meinung nach wäre es deutlich sinnvoller eine Editor-API zu entwickeln, so dass Plugin den Standrad-Editor TinyMCE unproblematisch gegen einen anderen Editor austauschen können. Vor allem wäre diese Lösung deutlich zukunftssicherer, denn wer weiß ob TinyMCE zukünftig noch alle Bedürfnisse erfüllen kann. Es wäre dann wesentlich einfacher einen Editor der nur lose ans System gekoppelt ist gegen einen besseren auszutauschen.

Leider scheint die Entwickelung von WordPress auch in diesen Punkt eher in Richtung Klickibunti anstatt Stabilität und Zukunftssicherheit zu gehen. Schade drum, wieder einmal eine Chance vertan WordPress einen guten Schritt nach vorne zu bringen.