Eklenti içinde bir düzey derinden plugin_dir_url () yöntemini edinin


13

Yapıyı kullanarak birkaç eklenti yazdım:

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

OO'dan yararlanmak ve kodumu genel olarak yapılandırmak için

Sınıf dosyasından temel eklentinin URL'sini almam gereken zamanlar var ... Aşağıdakileri kullanıyorum, ancak daha iyi bir yol olduğundan eminim:

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

Oynadığım başka bir fikir, eklenti için tüm ayarları saklayan ek bir singleton sınıfına sahip olmak ve sınıf dosyaları aracılığıyla bir soyutlama katmanı eklemekti.

Herhangi bir yardım büyük beğeni topluyor.

Yanıtlar:


17

Eklenti dizininizdeki bir alt dizinde aşağıdaki kodu kullanabilirsiniz:

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

7

Tüm sınıflarınızı gerçek konumlarından bağımsız hale getirmelisiniz, böylece onları kolayca hareket ettirebilir ve belki de diğer projelerde tekrar kullanabilirsiniz.

Diğer sınıflara hangi yolu veya URL'yi kullanacağını söyleyen bir sınıf oluşturabilirim, bir arabirimi uygulayalım, böylece diğer sınıfları belki bir tema içinde veya tamamen WordPress dışında da kullanabilirsiniz.

Arayüz örneği:

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

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

Eklentinizdeki somut uygulama şöyle görünebilir:

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

Şimdi ana eklenti dosyanızda bu sınıfın bir örneğini oluşturuyorsunuz:

$address = new PluginDirectoryAddress( __DIR__ );

Ve diğer tüm sınıfların yapıcılarındaki arayüze sadece bağımlılıkları vardır:

public function __construct( DirectoryAddress $directory ) {}

URL'ye ve yola şimdi yalnızca geçirilen örnekten erişiyorlar.


O zaman class.Plugin_Controller.phpyüksek dizindeki dosya için gerekli olması gerekir, değil mi?
MikeiLL

@MikeiLL Kodu yeniden düzenledim. Sınıfı dahil etmek için bir otomatik yükleyici kullanın. :)
fuxia

Teşekkür ederim. Kendimi eğitmem gerekiyor: php-autoloader.malkusch.de/en . Bu eklentinin yakında yeniden düzenleme yapması bekleniyor. Ve bazı birim testleri.
MikeiLL

1
Deneyin @MikeiLL bu bir . Kod İnceleme ile ilgili açıklamaya bakın .
fuxia
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.