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';