Pobierz plugin_dir_url () z jednego poziomu głęboko we wtyczce


13

Napisałem kilka wtyczek przy użyciu struktury:

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

Aby skorzystać z OO i ogólnej strukturyzacji mojego kodu

Z poziomu pliku klasy są chwile, kiedy muszę uzyskać adres URL wtyczki podstawowej ... Korzystałem z następujących opcji, ale jestem pewien, że jest lepszy sposób:

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

Innym pomysłem, z którym się bawiłem, było posiadanie dodatkowej klasy singleton, która przechowuje wszystkie ustawienia wtyczki i dodawanie warstwy abstrakcji poprzez pliki klas.

Każda pomoc jest mile widziana.

Odpowiedzi:


16

W podkatalogu w katalogu wtyczek możesz użyć następującego kodu:

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

7

Powinieneś uniezależnić wszystkie swoje klasy od ich rzeczywistej lokalizacji, abyś mógł je łatwo przenosić i być może ponownie wykorzystać w innych projektach.

Stworzyłbym klasę, która mówi innym klasom, jakiej ścieżki lub adresu URL użyć, pozwól mu zaimplementować interfejs, abyś mógł ponownie użyć innych klas, może nawet w motywie lub całkowicie poza WordPress.

Przykład interfejsu:

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

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

Konkretna implementacja wtyczki może wyglądać następująco:

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

Teraz tworzysz instancję tej klasy w głównym pliku wtyczki:

$address = new PluginDirectoryAddress( __DIR__ );

Wszystkie pozostałe klasy mają po prostu zależność od interfejsu w swoim konstruktorze, na przykład:

public function __construct( DirectoryAddress $directory ) {}

Teraz uzyskują dostęp do adresu URL i ścieżki tylko z przekazanej instancji.


W takim class.Plugin_Controller.phprazie plik w wyższym katalogu musiałby być wymagany, prawda?
MikeiLL

@MikeiLL Właśnie zreformowałem kod. Użyj autoloadera, aby uwzględnić klasę. :)
fuxia

Dziękuję Ci. Muszę się kształcić: php-autoloader.malkusch.de/en . Wkrótce ta wtyczka zostanie poddana refaktoryzacji. I niektóre testy jednostkowe.
MikeiLL

1
@MikeiLL Wypróbuj ten . Zobacz wyjaśnienie na temat recenzji kodu .
fuxia
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.