Für Menschen · Seien Sie begeistert und Sie werden begeistern !
Bei der Arbeit an einem Plugin ist aufgefallen, dass der Pfad zu zugehörigen Dateien nicht immer vollständig ist, was an der Version von WordPress liegt.
Mit WordPress Version 2.8 wurde die Funktion plugins_url() erweitert und sie lässt sich nun sauberer einbinden, keine Pflege des Ordners, in dem das Plugin steckt. Ein Beispiel soll es verdeutlichen und eventuell hilft der kleine Hinweis dem einen oder anderen Autor bei der Arbeit.
In den Artikeln „JavaScript-Bibliotheken in und aus WordPress nutzen“, „Menu Seite ab WordPress 2.7 hinzufügen“ und „WordPress Verzeichnisse bestimmen“ habe ich oft die Funktion plugins_url() eingesetzt, da sie eine sehr schöne Übergabe des des Pfades ermöglicht.
Ab WordPress Version 2.8 kann die Funktion zwei Parameter aufnehmen:
/**
* @param string $path Optional. Path relative to the plugins url.
* @param string $plugin Optional. The plugin file that you want to be relative to - i.e. pass in __FILE__
* @return string Plugins url link with optional path appended.
*/
function plugins_url($path = '', $plugin = '')
Bisher konnte man nur den $path-Parameter übergeben, der damit eine eigene Definition oder die Übergabe des Ordners verlangte.
$style = plugins_url( 'my_plugin_folder/css/style-frontend.css' );
Mit der Erweiterung ab Version 2.8 von WordPress kann das wie folgt geschehen:
$style = plugins_url( 'css/style-frontend.css', __FILE__ );
Die Nutzung sollte damit einfacher und klarer sein. Stellt sich nun nur wieder die Frage, wie mache ich damit die Abwärtskompatibilität des Plugins. Dazu kann man entweder die Version abfragen:
if ( version_compare( $wp_version, '2.8dev', '>' ) )
und ergänzt dann jeweils oder schreibt eine eigene Funktion für den Ersatz:
// function for WP < 2.8
function plugins_url($path = '', $plugin = '') {
if ( function_exists('is_ssl') )
$scheme = ( is_ssl() ? 'https' : 'http' );
else
$scheme = 'http';
$url = WP_PLUGIN_URL;
if ( 0 === strpos($url, 'http') ) {
if ( function_exists('is_ssl') && is_ssl() )
$url = str_replace( 'http://', "{$scheme}://", $url );
}
if ( !empty($plugin) && is_string($plugin) )
{
$folder = dirname(plugin_basename($plugin));
if ('.' != $folder)
$url .= '/' . ltrim($folder, '/');
}
if ( !empty($path) && is_string($path) && strpos($path, '..') === false )
$url .= '/' . ltrim($path, '/');
return apply_filters('plugins_url', $url, $path, $plugin);
}
Das nur als Alternative, die Möglichkeiten sind vielfältig - vielleicht hat der eine oder andere eine schönere Idee und Lösung?
bueltge.de [by:ltge.de] wird von Frank Bültge geführt, administriert und gestaltet. Alle Inhalte sind persönlich von mir ausgewählt und erstellt, nach bestem Gewissen und Können, was die Möglichkeit von Fehlern nicht ausschließt.
Das Weblog wird angetrieben von WordPress und aktuell gibt es 980 Beiträge, 18722 Kommentare in 14 Kategorien und 464 Tags.
Das Blog wird liebevoll mit xHTML & CSS in Handarbeit gestaltet. Erstellt mit ♥ zum Befüllen und Erhalten.
Design und Code ist unter Copyright
© 2001 - 2012 bueltge.de [by:ltge.de]
22. April 2009 um 18:03
Ich würde da besser auf function_exists() abfragen, anstelle von version_compare(). Sonst definieren mehrere Plugins die gleiche Funktion
22. April 2009 um 19:08
@Alex: ich nutze die Funktion innerhalb meiner Klasse, daher habe ich das Problem nicht so; außerdem ist
function_exists()so lahm, musste ich die Tage via WordPress Entwickler lernen.22. April 2009 um 20:56
Interessant, was bezeichnest du als lahm ? Wo kann man dazu info's finden ?
22. April 2009 um 21:46
@Alex: ich habe auch noch nichts direkt gefunden, es war eine Diskussion im Trac von WP, siehe Eintrag, lese mal den letzten Kommentar von Denis-de-Bernardy.
22. April 2009 um 22:06
OK, file_exists() is ja schon was anderes als function_exists(), das sollte man dann schon unterscheiden.
23. April 2009 um 07:57
@Alex:
ja, sorry - ist mir heute Nacht dann auch noch eingefallen, aber mein Rechner war schon aus. Natürlich hast du Recht und
file_exists()ist das Problem.2. Januar 2010 um 03:14
schön wäre einmal so etwas wie themes_url ... kann ja nicht sein, dass es da echt immer nur was für plugins gibt. das ärgert mich jetzt schon seit 2 stunden, dass ich in wp_enqueue_script keinen relativen pfad rein bekomme.
2. Januar 2010 um 12:05
@f-j-k: geht ohne Probleme; weil es für Themes schon lange Werte gibt; ein Beispiel:
// add scripts for frontend in footer
wp_enqueue_script( 'fb_scripts', get_bloginfo('template_directory') . '/js/script.js', '', '', true );