Symlinked dizinlerdeki eklentiler?


20

Eklentiler geliştirdiğimde, eklenti dizinimi farklı wp-contentdizinlerde işaretleyerek WordPress'in birden fazla sürümünde test ediyorum . Ben sadece bir kez dosyaları düzenlemek zorunda çünkü bu harika, ama benim eklenti kaynaklara referanslar oluşturmak için önemli bir yapı kırar: __FILE__fiziksel eklenti konumu, değil bir anlamına gelir wp-content. Bunu nasıl çözmeliyim?

Dizin yapım şöyle:

  • /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 yukarıdaki eklentiye bir sembolik bağlantı olarak
      • 3.1-multi-dir/
        • wp-content/
          • plugins/
            • monkeyman-rewrite-analyzer yukarıdaki eklentiye bir sembolik bağlantı olarak
      • 3.1-multi-domain/
        • wp-content/
          • plugins/
            • monkeyman-rewrite-analyzer yukarıdaki eklentiye bir sembolik bağlantı olarak

Ben JavaScript dosyasını enqueue istiyorsanız, kullanmalıyım plugins_url( 'monkeyman-rewrite-analyzer.js', [base file] )ama kullanan __FILE__gerçek dosya yolu olacaktır, çünkü burada işi olacak /path/to/wordpress/development/dir/plugin-development/monkeyman-rewrite-analyzer/monkeyman-rewrite-analyzer.phpdeğil, /path/to/wordpress/development/dir/versions/*/wp-content/plugins/monkeyman-rewrite-analyzer/monkeyman-rewrite-analyzer.phpWordPress ilk bölümü çıkarmaz ve WordPress kurulumu için bir URL göreli üretemez, bu yüzden.

Yanıtlar:


6

Sorun kısmen plugins_urlfiltreye takılması gereken bir eklenti ile giderilebilir .

Ve co plugin_basename()gibi kullanılan diğer tüm durumları işlemez register_activation_hook().

Daha fazla bilgi: http://core.trac.wordpress.org/ticket/16953


WP_PLUGIN_URLYöneticilerin bu belirli eklentinin dizininin adını değiştirmesine izin verilmesi gerektiği için kullanılması önerilmez, ancak bundan kaçınmak için başka bir neden var mı? Ve aslında, biletiniz basit bir çözüm olacaktır.
Jan Fabry

Aksine. WP_PLUGIN_URL yalnızca doğrudan 'plugins' dizinini gösteren URL'yi içerir. Güncellenmiş cevaba bakınız.
scribu

@scribu: Ama eklentilerim yaşıyor /external/folder/banana-plugin/ancak yönetici bu dizine şu şekilde bağlanıyorsa /httpd-root/wp-content/plugins/apple-plugin/? O zaman gitmeye çalışacak /wp-content/plugins/banana-plugin/, değil mi? Ve yönetici bireysel eklenti dizin adlarını seçmek için özgür olması gerektiğine inanıyorum?
Jan Fabry

Artık sizinle bu konuda tartışmayacağım, çünkü çözümü buldum: 'plugins_url' filtresi. Yanıt tekrar güncellendi.
scribu

FWIW bu çözüm hata eğilimli olabilir ve tüm eklentiler yüklendikten sonra sadece plugins_url () kullanarak eklenti geliştiricilerine bağlıdır, aksi takdirde işlev çağrılmadan önce bir filtre kaydedemezsiniz. Akismet eklentisi ve diğer birçoklarının bu sorunu var.
jerclarke

3

Şu anda WordPress göreli dosya konumunu almak için bir hile kullanın: wp_get_active_and_valid_plugins()dosya yollarını döndürür ve wp_settings.phpbunların üzerinde döngüler ve dosyaları içerir . Yani global $plugindeğişken geçerli eklentinize atıfta bulunacaktır (elbette sadece eklenti yüklendiğinde, bu yüzden ön ekli bir global değişkene kaydederim):

$monkeyman_Rewrite_Analyzer_file = $plugin;

Eklentiler, zorunlu kullanım veya ağ eklentileri olarak da yüklenebildiğinden ve bu döngüler başka değişken adları kullandığından , tam kod şöyle görünür:

$monkeyman_Rewrite_Analyzer_file = __FILE__;
if ( isset( $mu_plugin ) ) {
    $monkeyman_Rewrite_Analyzer_file = $mu_plugin;
}
if ( isset( $network_plugin ) ) {
    $monkeyman_Rewrite_Analyzer_file = $network_plugin;
}
if ( isset( $plugin ) ) {
    $monkeyman_Rewrite_Analyzer_file = $plugin;
}

Geri dönüş hala devam ediyor __FILE__, bu yüzden birisi gelecekte döngü değişkeni adını değiştirirse, kodumun tüm kurulumların% 99'u için çalışması gerekir, sadece geliştirme kurulumum başarısız olur ve yeni bir sürümü kolaylıkla yayınlayabilirim.


@Jan harika bir çözüm. İşlevleri çağırarak ve döngü yaparak benzer bir şey uyguladım çünkü bu değişkenlerin erişilebilir olduğunu unuttum global. Buradaki göreviniz sayesinde çok daha basit yapabileceğimi fark ettim. BTW, ben de false === strpos( __FILE__, WP_CONTENT_DIR )if ifadelerini çalıştırmadan önce test ediyorum çünkü eklenti içinde olup WP_CONTENT_DIRolmadığını varsayalım symlinked; Bunun geçerli bir mantık olduğunu umuyorum.
MikeSchinkel

0

46260 hatasını içeren bir yorum, $_SERVER["SCRIPT_FILENAME"]bunun yerine kullanılmasını önerir __FILE__. Bu çalışıyor mu?


1
Hayır, bu dahil edilen dosyalarda değişmez. Yani eğer index.phpiçerir library.php, $_SERVER['SCRIPT_FILENAME']içinde library.phpirade yine de index.php. Ama hata referansı için teşekkürler, yakından takip edeceğim!
Jan Fabry

0

$_SERVER["SCRIPT_FILENAME"]doğru kullanırsanız çalışır. Bir temel yol ayarlamak için kullanmanız ve ardından dosyalarınızı bu temel yola göre bir yol kullanarak eklemeniz gerekir.

Gibi bir şey:

$plugin_dir = dirname($_SERVER["SCRIPT_FILENAME"]);
$myFile = $plugin_dir."/includes/js/myJavascriptFile.js";

Not: wp-blog-header.php dosyasına henüz erişiminiz olmadığında bu daha yararlıdır (ör. Ajax tabanlı bir form isteğini işlerken)

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.