Ketika saya mengembangkan plugin saya mengujinya di beberapa versi WordPress dengan menghubungkan direktori plugin saya di direktori yang berbeda wp-content
. Ini bagus karena saya hanya perlu mengedit file satu kali, tetapi merusak konstruksi penting untuk menghasilkan referensi ke sumber daya di plugin saya: __FILE__
merujuk ke lokasi plugin fisik, bukan yang ada di wp-content
. Bagaimana saya mengatasi ini?
Struktur direktori saya terlihat seperti ini:
/path/to/wordpress/development/dir/
plugin-development/
monkeyman-rewrite-analyzer/
monkeyman-rewrite-analyzer.php
js/
monkeyman-rewrite-analyzer.js
versions/
3.1/
wp-content/
plugins/
monkeyman-rewrite-analyzer
sebagai symlink ke plugin di atas
3.1-multi-dir/
wp-content/
plugins/
monkeyman-rewrite-analyzer
sebagai symlink ke plugin di atas
3.1-multi-domain/
wp-content/
plugins/
monkeyman-rewrite-analyzer
sebagai symlink ke plugin di atas
Jika saya ingin membuat file Javascript, saya harus menggunakan plugins_url( 'monkeyman-rewrite-analyzer.js', [base file] )
, tetapi menggunakan di __FILE__
sini tidak akan berfungsi, karena jalur file yang sebenarnya adalah /path/to/wordpress/development/dir/plugin-development/monkeyman-rewrite-analyzer/monkeyman-rewrite-analyzer.php
, tidak /path/to/wordpress/development/dir/versions/*/wp-content/plugins/monkeyman-rewrite-analyzer/monkeyman-rewrite-analyzer.php
, sehingga WordPress tidak dapat menghapus bagian pertama dan menghasilkan URL relatif terhadap instalasi WordPress.
sumber
WP_PLUGIN_URL
tidak dianjurkan karena administrator harus diizinkan untuk mengubah nama direktori plugin khusus ini, tetapi apakah ada alasan lain untuk menghindarinya? Dan memang, tiket Anda akan menjadi solusi sederhana./external/folder/banana-plugin/
tetapi admin menautkan ke direktori itu/httpd-root/wp-content/plugins/apple-plugin/
? Maka itu akan mencoba untuk pergi/wp-content/plugins/banana-plugin/
, bukan? Dan saya yakin admin harus bebas memilih masing-masing nama direktori plugin?Saat ini saya menggunakan trik untuk mendapatkan lokasi file relatif-WordPress:
wp_get_active_and_valid_plugins()
mengembalikan path file, danwp_settings.php
loop atas mereka dan termasuk file . Jadi$plugin
variabel global akan merujuk ke plugin Anda saat ini (tentu saja hanya ketika plugin dimuat, jadi saya menyimpannya dalam variabel global yang diawali):Karena plugin juga dapat dimuat sebagai plugin yang harus digunakan atau jaringan dan loop ini menggunakan nama variabel lain , kode lengkapnya terlihat seperti ini:
Fallback masih
__FILE__
, jadi jika seseorang mengubah nama variabel loop di masa depan kode saya harus tetap bekerja untuk 99% dari semua instalasi, hanya pengaturan pengembangan saya akan gagal dan saya dapat merilis versi baru dengan mudah.sumber
global
. Berkat posting Anda di sini, saya sadar saya bisa membuatnya lebih sederhana. BTW, saya juga mengujifalse === strpos( __FILE__, WP_CONTENT_DIR )
sebelum menjalankan pernyataan if Anda karena saya berasumsi jika plugin ada diWP_CONTENT_DIR
dalamnya tidak terhubung; Saya berharap itu logika yang valid.Komentar dalam bug 46260 menyarankan untuk digunakan
$_SERVER["SCRIPT_FILENAME"]
sebagai ganti__FILE__
. Apakah ini berhasil?sumber
index.php
termasuklibrary.php
,$_SERVER['SCRIPT_FILENAME']
dilibrary.php
kehendak masihindex.php
. Tapi terima kasih untuk referensi bug, saya akan mengikutinya dengan cermat!$_SERVER["SCRIPT_FILENAME"]
berfungsi jika Anda menggunakannya dengan benar. Anda hanya perlu menggunakannya untuk menetapkan jalur dasar, dan kemudian memasukkan file Anda menggunakan jalur relatif ke jalur dasar itu.Sesuatu seperti:
Catatan, ini lebih berguna ketika Anda belum memiliki akses ke wp-blog-header.php (yaitu dalam memproses permintaan formulir berbasis ajax)
sumber