Das Putzlowitsch Test- und SEO-Blog

WordPress 2.5 – Shortcode und die Bildergalerie

Neue Features

In WordPress ab Version 2.5 wurde die Attachment-Verwaltung erheblich erweitert und verbessert. Sie firmiert nun unter dem Schlagwort Mediathek. Eine wesentliche Erleichterung ist meiner Meinung nach die Möglichkeit, mehrere Dateien (z.B. Bilder) auswählen und in einem Rutsch hochladen zu können. Ein weiteres Highlight sind die sogenannten Shortcodes, kleine Textbausteine, die bei der Ausgabe in viele schöne Sachen verwandelt werden können. Die Shortcodes sin aber eher etwas für Plugin-Entwickler, der normale Nutzer hat erstmal nichts davon.
Einen solchen Shortcode liefert WordPress aber bereits mit, es ist eine einfache Bilder-Galerie.

Die Worpress-Bildergalerie

Aus Anwendersicht ist das mit den Shortcodes ganz einfach, man fügt das gewünschte Kürzel, gegebenfalls mit Parametern, einfach in eckigen Klammern an der Stelle im Text ein, wo die Ausgabe erfolgen soll. Für die WP-Bildergalerie sieht das z.B. so aus:

[gallery columns='2']

Bei der Anzeige das Artikels wird dann dieser Shortcode z.B. durch eine Bildergalerie ersetzt:

So könnte es aussehen. Die Ausgabe läßt sich durch ein paar Parameter steuern, so legt der Parameter ‚columns‘ z.B. fest, wieviele Spalten die Galerie verwenden soll (Standardwert ist 3). Im Beispiel habe ich 2 Spalten eingestellt.
Alle Parameter und die Verwendung des Gallery-Shortcodes sind im WP-Codex beschrieben.

Erweiterung – Der Link

Eine wie ich meine wichtige Sache haben die Entwickler aber vergessen. In der Standard-Galerie wird vom Vorschaubild immer auf die Bilderseite (Beispiel Bild 1) verlinkt, nicht auf das Bild selbst. Das ist so im PHP-Quelltext fest „verdrahtet“. Dabei wäre es kein großes Sache gewesen auch dafür einen Parameter vorzusehen. Aber was nicht ist, kann man glücklicherweise mit einem Plugin nachrüsten. So habe ich einfach die originale gallery_shortcode-Funktion genommen und um den Parameter attlink erweitert. Das Plugin selbst und eine Kurze Beschreibung findet man auf meiner Plugin-Seite „123 Extended Gallery„.

Und noch etwas habe ich verändert. Im Originalcode wird der CSS-Teil zur Formatierung der Galerie direkt in den Artikel geschrieben. Das ist alles andere als HTML-konform. So habe ich den CSS-Teil rausgezogen und in den Header verlegt, dahin wo soetwas hingehört. Einziger kleiner Nachteil, die CSS-Sachen werden immer im Header ausgegeben, auch wenn später im Artikel gar keine Galerie vorhanden ist. Aber damit kann ich leben.

Ein Kommentar »

Mit WordPress per E-Mail bloggen

Mit meinem schon etwas betagten Handy Siemens S 65 kann ich im Web surfen, allerdings nur auf WAP-Seiten. Um mal eben schnell einen kurzen Blogartikel zu verfassen, ist der integrierte Mini-Browser nicht geeignet. Ich kann mit dem Handy aber auch E-Mails verschicken und WordPress kann Artikel per E-Mail einlesen. Für kleine Texte ist das also ein durchaus gangbarer Weg, um die geneigte Leserschaft auch von Unterwegs auf dem Laufenden zu halten.

So funktionierts

Man schickt eine E-Mail an eine konfigurierte E-Mail-Adresse, WordPress fragt diese ab und stellt neue Mails als Artikel im Blog ein. Eigentlich ganz einfach, man sollte jedoch einige Dinge beachten.

Damit nicht jeder einfach per E-Mail auf dem Blog Artikel veröffentlichen kann, sollte man eine neue, geheime E-Mail-Adresse einrichten. Diese kann dort liegen, wo auch das Blog gehostet ist, muß sie aber nicht. In jedem Fall sollte sie einen möglichst „kryptischen“ Namen haben, damit dieser nicht einfach zu erraten ist. Also nicht etwa mailblog@schnurpsel.de, sondern besser SuXiy2zt8k@schnurpsel.

Konfiguration in WordPress

Nun können die Daten für den neu erstellten E-Mail-Account bei den Einstellungen->Schreiben im Bereich „Via E-Mail schreiben“ eingetragen werden:

Neben den E-Mail-Daten kann man hier auch eine Kategorie festlegen, in der die Artikel erscheinen sollen. Man könnte sich ja z.B. eine spezielle Kategorie „Unterwegs“ anlegen, die dann die E-Mail-Artikel aufnimmt und vielleicht gar nicht auf der Hauptseite angezeigt wird.

Artikel per E-Mail bloggen

Jetzt kann es losgehen, einfach eine E-Mail an die konfigurierte E-Mail-Adresse schicken. Das was als Betreff (Subject) in der E-Mail steht, wird zum Titel des Artikels. Der eigentlich Inhalt der Mail wird, ja richtig, zum Inhalt des Artikels im Blog.
Da WordPress aber von sich aus nicht merkt, daß ein neuer Artikel via E-Mail angekommen ist, muß es zum Abrufen der E-Mails aufgefordert werden. Das geht im einfachsten Fall manuell durch Aufrufen der Datei wp-mail.php im WordPress-Wurzelverzeichnis. Bei mir wäre das also z.B. schnurpsel.de/wp-mail.php. Falls neue Artikel vorhanden waren, wird dies etwa wie folgt bestätigt:

Author: 1
Posted title: Ein Beitrag per E-Mail
Mission complete, message 1 deleted.

Wenn nichts angekommen ist, gibt es nur ein einfaches:

There doesn’t seem to be any new mail.

Das Abrufen der E-Mails durch WP kann man auch zeitgesteuert automatisieren, eine umfangreiche englische Beschreibung findet man hier: Post to your blog using email

Neu ab WordPress 2.5

Bis zu WordPress 2.3.x war es egal, woher die Artikel-E-Mail gekommen ist, also welche Absender-Adresse im From: steht, der Artikel erschien unmittelbar auf dem Blog.
Mit WordPress 2.5 ist das nicht mehr so. Von der Absender-E-Mail-Adresse hängt es ab, ob der Artikel direkt veröffentlicht wird (Status: ‚publish‘) oder nur als Enwurf (Status: ‚pending‘) gespeichert wird.

WordPress versucht an Hand der Absender-Adresse einen registrierten Nutzer zu finden, der dieselbe E-Mail-Adresse hat. Wird ein solcher gefunden und dieser ist zudem berechtigt, Artikel zu veröffentlichen, dann erscheint der Artikel mit dem Nutzer als Autor direkt auf dem Blog. Gibt es jedoch keinen passenden Nutzer, landet der Artikel nur im Backend und erscheint in der Artikelliste mit dem Status „Ausstehender Review“.

Damit wurde die Hürde für einen Mißbrauch der E-Mail-To-Blog-Funktion ein klein wenig höher gelegt, den der „Angreifer“ muß nicht nur die kryptische WP-Blog-E-Mail-Adresse kennen, sondern zudem noch die eines befugten Autors.

Fazit

Bloggen von Unterwegs z.B. mit dem Handy ist durchaus möglich. Aus Sicherheitsgrunden sollte man aber einige Punkte beachten. Beim Unstieg auf WordPress 2.5 von einer älteren Version sollte man das geänderte Veröffentlichungsverhalten beachten.

61 Kommentare »

Neue WordPressversion 2.5

Der eine oder andere wird es schon bemerkt haben, ich habe von WordPress 2.3.3 auf Worpress 2.5 upgedated. Da bin ich auch relativ unbeschwert rangegangen, da das hier sowieso mehr ein Testblog ist, welches zudem mit den Unzulänglichkeiten des Strato-Webhostings kämpfen muß. Dabei sind es schon erheblich weniger Schwierigkeiten geworden, was Strato und WordPress anbelangt.

So konnte ich hier erstmal testen, ob meine eigenen Plugins funktionieren. Ja, das tun sie. Wobei ich das eine oder andere an die neuen Möglichkeiten von WordPress 2.5 anpassen werde oder schon angepaßt habe. Zudem ist mir grad ein nettes Feature aufgefallen, wenn man Tags (Stichwörter) eingeben will. Dann klappt nach Eingabe von mindestens zwei Zeichen eine Auswahlliste auf, aus der man dann einfach ein passendes, schon vorhandenes Stichwort auswählen kann. Fein Sache, das.

Keine Kommentare »

Hinweis für WordPress-Plugin-Programmierer

Das einfachste Plugin für WordPress besteht nur aus einer PHP-Datei, da gibt es auch keine Probleme. Wenn man aber das Plugin modular gestaltet, eventuell noch Grafiken, Stylesheets oder JavaScript-Dateien laden will, fangen die Schwierigkeiten an.

Das Nachladen von PHP-Modulen ist noch relativ einfach, sofern sich die Dateien im selben Verzeichnis wie das Hauptmodul befinden. Da reicht ein einfaches

include( 'modul-2.php');

und man muß sich keine Gedanken über Pfade und Verzeichnisse machen.

Anders ist es bei Grafik-, CSS- oder Javascript-Dateien. Hier wird eine gültige URL benötigt, also muß man das Verzeichnis wissen, in dem sich das Plugin befindet. Und zwar nicht den absoluten Pfad auf dem Server, sondern den Pfad bezogen auf die Webseiten-Adresse. Häufig sieht man dann so etwas:

$css = get_option( 'siteurl' ).'/wp-content/plugins/my-plugin/my-style.css';

Es wird also einfach davon ausgegangen, daß Plugins immer im Verzeichnis ‚wp-content/plugins‘ liegen. Das müssen sie aber nicht, denn in WordPress ist dafür extra die Konstante PLUGINDIR vorgesehen.

Diese wird in der wp-settings.php wie folgt definiert:

if ( !defined('PLUGINDIR') )
	define('PLUGINDIR', 'wp-content/plugins'); // no leading slash, no trailing slash

Das if ( !defined(‚PLUGINDIR‘) ) läßt erahnen, daß es durchaus vorgesehen ist, hier auch vorab ein anderes Verzeichnis zu definieren. Ganau davon mache ich Gebrauch, indem ich ein abweichendes Plugin-Verzeichnis in der wp-config.php definieren. Das ist eine einfache Möglichkeit, sich ein wenig vor Angriffen auf Schwachstellen in Plugins zu schützen. Denn auch die meisten Angreifer gehen davon aus, daß sie Plugins in Verzeichnis ‚wp-content/plugins‘ liegen, sofern sie überhaupt so intelligent sind.

Wenn nun ein Plugin selbst einfach ‚wp-content/plugins‘ anstelle von PLUGINDIR verwendet, sind Schwierigkeiten vorprogrammiert. Deshalb, liebe Plugin-Programmierer, verwendet bitte immer PLUGINDIR, um Pfade zusammenzusetzen. Für das obige Beispiel könnte das etwa so aussehen:

$css = get_option( 'siteurl' ).'/'. PLUGINDIR.'/my-plugin/my-style.css';

Ich verwende z.B. folgende Funktion, damit ich auch unabhängig davon bin, in welchem Unterverzeichnis innerhalb des Pluginverzeichnisses die Dateien liegen:

// ermittelt das Pluginverzeichnis
function plw123_plugin_basedir( $file ) {
	$file = str_replace('\\','/',$file); // Windows Verzeichnistrenner "umkippen"
	$file = preg_replace('|/+|','/', $file); // doppelte Schrägstriche entfernen
	$file = preg_replace('|^.*/' . PLUGINDIR . '/|','',$file); // relativen Pfad zum Plugin-Dir ermitteln
	return '/'.PLUGINDIR."/$file/";
}

...

$pluginPath = plw123_plugin_basedir( dirname(__FILE__) );
$css = get_option( 'siteurl' ).$pluginPath.'my-style.css';
8 Kommentare »

GROUP BY auf ein Unique Field kann durchaus sinnvoll sein

Kürzlich hatte ich einen Beitrag zu dem Problem mit WordPress und der Sortierreihenfolge bei MySQL 5.0.51 (wie es derzeit bei Strato verwendet wird) geschrieben und mich dort über das vermeintlich unsinnige GROUP BY mit einem eindeutigen Feld (ID) ausgelassen. Für eine einfache SQL-Abfrage, wie dort beim ersten Beispiel, ist das auch durchaus richtig, da ist das „GROUP BY id“ tatsächlich sinnfrei.

Bei WordPress ab Version 2.1 wurde das dann auch geändert, hier wird dieses GROUP BY mit der ID nur noch dann eingefügt, wenn es tatsächlich benötigt wird, nämlich wenn man die Abfrage auf bestimmte Kategorien oder Tags einschränken will. Das könnte z.B. etwa so aussehen:

<?php  query_posts( $query_string.'&cat=1,2,3' ); ?>

Hier will man zum Beispiel nur Artikel anzeigen, die in Kategorie 1, 2 oder 3 enthalten sind. Wenn nun ein Artikel mehreren Kategorien zugeordnet ist, würde das dazu führen, daß dieser Artikel auch mehrmals in der Liste steht und das will man ja nicht. Genau hier bewirkt das GROUP BY id, daß jeder Artikel nur einmal auftaucht. Man hätte das zwar ebenso mit DISTINCT erreicht, aber WP macht es halt mit GROUP BY. Letztendlich ergibt sich daraus ein Problem, welches aber einer fehlerhaften Implementierung von MySQL 5.0.51 zuzuschreiben ist.

Da ich bei mir nicht mit Kategorien oder Tags in den Abfragen arbeite, war mir das bisher auch nicht klar. Erst ein Beitrag im wordpress.org Forum hat mir die Augen geöffnet (Dank an Otto42 für die erhellenden Worte :-).

Was bedeutet das nun für die Praxis? Ganz klar, das Problem kann nur durch ein Update von MySQL behoben werden, da ist dann der Webhoster in der Pflicht. Nun ist es aber nicht ganz einfach, goße Hoster wie Strato dazu zu bewegen, zumal es MySQL 5.0.53 wohl auch noch nicht gibt.
In der Zwischenzeit kann erstmal mein Plugin helfen, welches das GROUP BY id in ein GROUP BY post_date „verbiegt“. Einen kleinen Nachteil hat das aber. Wenn es zwei oder mehrere Artikel mit auf die Sekunde übereinstimmendem Veröffentlichungszeitpunkt gibt, wird nur einer von diesen dargestellt.

Keine Kommentare »