Holen Sie sich plugin_dir_url () von einer Ebene tief im Plugin


13

Ich habe mehrere Plugins mit der Struktur geschrieben:

/plugins/myplugin/myplugin.php /plugins/myplugin/class/class-myclass.php

Um OO zu nutzen und meinen Code insgesamt zu strukturieren

In der Klassendatei muss ich manchmal die URL des Basis-Plugins abrufen ... Ich habe Folgendes verwendet, aber ich bin mir sicher, dass es einen besseren Weg gibt:

$this->plugin_location = substr(plugin_dir_url(__FILE__),0, strrpos(plugin_dir_url(__FILE__), "/",-2)) . "/";

Eine andere Idee, mit der ich spielte, war eine zusätzliche Singleton-Klasse, die alle Einstellungen für das Plugin speichert und eine Abstraktionsschicht über die Klassendateien hinzufügt.

Jede Hilfe wird sehr geschätzt.

Antworten:


15

In einem Unterverzeichnis in Ihrem Plugin-Verzeichnis können Sie den folgenden Code verwenden:

$this->plugin_location = plugin_dir_url(dirname(__FILE__));

7

Sie sollten alle Ihre Klassen unabhängig vom tatsächlichen Standort machen, damit Sie sie problemlos verschieben und möglicherweise in anderen Projekten wiederverwenden können.

Ich würde eine Klasse erstellen, die den anderen Klassen mitteilt, welchen Pfad oder welche URL sie verwenden sollen, und eine Schnittstelle implementieren lassen, damit Sie die anderen Klassen möglicherweise sogar in einem Thema oder vollständig außerhalb von WordPress wiederverwenden können.

Beispiel für die Schnittstelle:

interface DirectoryAddress
{
    /**
     * @return string Dir URL with trailing slash
     */
    public function url();

    /**
     * @return string Dir path with trailing slash
     */
    public function path();
}

Die konkrete Implementierung in Ihrem Plugin könnte so aussehen:

class PluginDirectoryAddress implements DirectoryAddress
{
    private $path;

    private $url;

    public function __construct( $dirpath )
    {
        $this->url  = plugins_url( '/', $dirpath );
        $this->path = plugin_dir_path( $dirpath );
    }

    /**
     * @return string Dir URL with trailing slash
     */
    public function url() {
        return $this->url;
    }

    /**
     * @return string Dir path without trailing slash
     */
    public function path() {
        return $this->path;
    }
}

Jetzt erstellen Sie eine Instanz dieser Klasse in Ihrer Haupt-Plugin-Datei:

$address = new PluginDirectoryAddress( __DIR__ );

Und alle anderen Klassen haben nur eine Abhängigkeit von der Schnittstelle in ihrem Konstruktor, wie folgt:

public function __construct( DirectoryAddress $directory ) {}

Sie greifen jetzt nur von der übergebenen Instanz auf die URL und den Pfad zu.


Dann class.Plugin_Controller.phpmüsste das von der Datei im übergeordneten Verzeichnis verlangt werden, oder?
MikeiLL

@MikeiLL Ich habe den Code gerade überarbeitet. Verwenden Sie einen Autoloader, um die Klasse einzuschließen. :)
fuxia

Vielen Dank. Müssen mich weiterbilden : php-autoloader.malkusch.de . Dieses Plugin wird demnächst überarbeitet. Und einige Unit-Tests.
MikeiLL

1
@ MikeiLL Versuchen Sie dieses . Siehe die Erklärung zur Codeüberprüfung .
fuxia
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.