Sidebar
ein-/ausblenden

WordPress Plugin-Pfad

Plugin für WordPress SEO

Anzeige

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?

8 Kommentare zu „WordPress Plugin-Pfad“

  1. 1
    Kommentar von Alex Rabe

    Ich würde da besser auf function_exists() abfragen, anstelle von version_compare(). Sonst definieren mehrere Plugins die gleiche Funktion

  2. 2
    Kommentar von Frank Bültge

    @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.

  3. 3
    Kommentar von Alex Rabe

    Interessant, was bezeichnest du als lahm ? Wo kann man dazu info's finden ?

  4. 4
    Kommentar von Frank Bültge

    @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.

  5. 5
    Kommentar von Alex Rabe

    OK, file_exists() is ja schon was anderes als function_exists(), das sollte man dann schon unterscheiden.

  6. 6
    Kommentar von Frank Bültge

    @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.

  7. 7
    Kommentar von f-j-k

    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.

  8. 8
    Kommentar von Frank Bültge

    @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 );

Kommentare sind geschlossen.