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 Reaktionen zu “Hinweis für WordPress-Plugin-Programmierer”

  1. Arno Simon sagt:

    Moin Ingo,

    viellеiсht noch den Hinweis einfügen, das man

    1. wie Du es mit „plw123_…“ schon demonstriert hast, einen eigenen prefix (wird dennoch nicht immer eindeutig sein, minimiert das risiko doppelten codings aber schon ungemein) vor die bezeichner seiner funktionen und klassen setzen sollte

    und

    2. man in seiner eigenen auslieferung sowie der dokumentation darauf hinweisen sollte aufrufe der plugin-funktionen in den themes mit „if(function_exists(’123_deinefunktion’) {….};“ kapseln sollte, damit es später in der ausgabe nicht unbedingt zu verrissen durch php-fehlermeldung kommt. evtl. kann man noch einen alternativ-text angeben, der ausgegeben wird, wenn die funktion nicht gefunden wurde.

    ansonsten: PLUGINDIR war mir auch noch nicht bekannt. kannste mal sehen, das man sich alles immer nur bezogen auf die eigenen probleme ansieht ;) vor allem wenn man sich nicht hauptberuflich mit der software auseinander setzt.

    vG

    Arno

  2. Stimmt, das mit dem eindeutigen Präfix vor Funktionen und globalen Variablen ist wichtig, kann man nicht oft genug sagen. Habe ich auch glеiсh von Anfang an bei mir so gehandhabt, ich hatte auch estmal ein bißchen im Codex gelesen, bevor ich losgelgt hatte :-)
    http://codex.wordpress.org/Wri...Plugin_Development_Suggestions
    http://codex.wordpress.org/WordPress_Coding_Standards

    Zu 2., naja, also eine Dokumentation in dem Sinne gibt es zu meinen Plugins bisher sowieso nicht. Allerdings halte ich mich selber auch nicht immer so dran, mit dem function_exist(…). Das führ dann manchmal zu Problemen mit meiner internen Debug-Funktion, falls ich vergesse, sie vor der Veröffentlichung rauszunehmen.

    Viellеiсht könnte ja mal auf WordPress-Deutschland so eine Seite mit Programmier-Richtlinien entstehen. Aber wahrscheinlich liest das dann eh wieder keiner…

  3. Björn sagt:

    MoinMoin,

    bin durchzufall der verzweiflung hier gelandet und bin begeistert. bin irgendwann mal auf wp gestossen u. hatte es dann verworfen.. nun möchte ich es für meine kleine haben…

    backround:

    wir haben ihr eine seite eingerichtet unter http://www.jennybeads.de
    sie macht glasschmuck und sie braucht halt eine seite… ich habe mal 1-2 html kurse gemacht und würde mit viel reinlesen auch wieder reinkommen… damit ist mir aber nicht geholfen… denn sie sollte das schon alleine machen.. und zack da kam mir wp in den sinn… einfach strukturiert und eigentlich lеiсht verständlich…

    nun eigentlich.. nachdem ich mich den ganzen nachmittag damit auseinander gesetzt habe, habe ich nun heraus gefunden… das mein webpaket bei strato anscheinend nicht reicht…

    welches brauche ich denn nun?

    ich habe : STRATO Webvisitenkarte Advanced

    würde ich mit STRATO PowerWeb Basic 2008 auskommen?

    wieviele SQL-Daten braucht man denn? PHP? vorallem wenn ich mir auch noch mal eine Domain dazunehmen möchte… möchte ich nicht alles zweimal bezahlen …?

    über einen rat wäre ich dankbar…

    per kontakt konnt ich das leider nicht senden….

    thanxs

  4. Hallo Björn,

    für WordPress benötigst Du auf jeden Fall eine MySQL-Datenbank und PHP, das „STRATO PowerWeb Basic 2008“ – Paket ist dafür ausreichend. Viellеiсht kannst Du ja von der „Webvisitenkarte Advanced“ auf „PowerWeb Basic 2008“ updaten.

    Ansonsten ist ein guter Einstieg in WordPress auch Worpress-Deutschland. Da wird alles gut erklärt und bei Problemen findet man dort auch meist schnelle und kompetente Hilfe im Forum.

  5. Björn sagt:

    @Schnurpselchen thanxs…

    ja ein upgrade gibt es werde, mich morgen mal daran machen…

    habe heute viele hilfereich beiträge von dir im forum gelesen…. dadurch bin ich auf dieser seite gelandet…. deine blog seite gefällt mir auch sehr.. gut… ich glaube ich habe jetzt schon eine neue liebe mit wordpress entdeckt…

    wenn ja dann online bin.. schicke ich dir mal den… linxs

    gruss björn

  6. Frank sagt:

    kleine Erweiterung für die Zukunft, da 2.6 das Auslagern nun zulässt. Konstante ist dann WP_PLUGIN_DIR.
    Insofern sollte man also diese abfragen und für ältere Installationen sicher zu sein.

  7. Aydin sagt:

    Ich bin auf der Suche nach einem Programmierer, der für mich ein WordPress Plugin umsetzt.

    Du solltest dich mit der Umsetzung von WordPress-Plugins und der Synchronisation von XML-Dateien gut auskennen.
    Zudem benötige ich das Plugin eigentlich ziemlich dringend, sodass aktuelle freie Ressourcen super wären.

    schreib mir bitte eine Mail an seslisehir@hotmail.de

  8. Sandro sagt:

    Super Beitrag, sehr hilfreich! Vielen Dank dafür!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

 Hier kein Häkchen setzen
 Ich bin kein Spambot

Hinweis: Kommentare von bisher unbekannten Schreibern (Name und eMail) oder mit mehr als einem Link werden moderiert.