Dapatkan plugin_dir_url () dari kedalaman satu level di dalam plugin

13

Saya telah menulis beberapa plugin menggunakan struktur:

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

Jadi untuk mengambil keuntungan dari OO dan keseluruhan penataan kode saya

Dari dalam file kelas ada saatnya saya perlu mendapatkan URL dari plugin dasar ... Saya telah menggunakan yang berikut ini, tapi saya yakin ada cara yang lebih baik:

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

Gagasan lain yang saya mainkan adalah memiliki kelas singleton tambahan yang menyimpan semua pengaturan untuk plugin dan menambahkan lapisan abstraksi melalui file kelas.

Setiap bantuan sangat dihargai.

setterGetter
sumber

Jawaban:

16

Dalam subdirektori dalam direktori plugin Anda, Anda dapat menggunakan kode berikut:

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

Anda harus membuat semua kelas Anda independen dari lokasi mereka yang sebenarnya, sehingga Anda dapat memindahkannya dengan mudah dan mungkin menggunakannya kembali di proyek lain.

Saya akan membuat kelas yang memberi tahu kelas lain apa jalur atau URL yang akan digunakan, biarkan ia mengimplementasikan antarmuka sehingga Anda dapat menggunakan kembali kelas-kelas lain bahkan mungkin dalam suatu tema atau sepenuhnya di luar WordPress.

Contoh untuk antarmuka:

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

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

Implementasi konkret di plugin Anda bisa terlihat seperti ini:

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

Sekarang Anda membuat instance kelas itu di file plugin utama Anda:

$address = new PluginDirectoryAddress( __DIR__ );

Dan semua kelas lain hanya memiliki ketergantungan pada antarmuka di konstruktor mereka, seperti ini:

public function __construct( DirectoryAddress $directory ) {}

Mereka mengakses URL dan path hanya dari instance yang diteruskan sekarang.

fuxia
sumber
Maka class.Plugin_Controller.phpakan perlu diminta oleh file di direktori yang lebih tinggi, benar?
MikeiLL
@MikeiLL Saya baru saja refactored kode. Gunakan autoloader untuk memasukkan kelas. :)
fuxia
Terima kasih. Perlu mendidik diri sendiri: php-autoloader.malkusch.de/en . Plugin ini akan segera dikembalikan. Dan beberapa tes unit.
MikeiLL
1
@MikeiLL Coba yang ini . Lihat penjelasan tentang Tinjauan Kode .
fuxia