Not: Bu yanıt @scribu ve @kaiser arasındaki tartışmayı kolaylaştırmak için burada. Modlar: Lütfen silmeyin. Kullanıcılar / Okuyucular: Lütfen oy vermeyin. Tartışmayı takip etmek istiyorsanız, düzeltme / düzenleme günlüğüne bir göz atın. Tartışmaya katılmak istiyorsanız, Cevabı düzenleyin. Tartışmanın bir sonucu varsa, bu şekilde işaretlenir. Teşekkür ederim.
Senaryolar
Eklenti bağımlılığına sahip olabileceğiniz farklı ağırlıklara sahip farklı senaryolar da vardır. (Örnekler sadece kurgusaldır). "(Üst) Eklentisi" kelimesi, üst bakış açısından "Tema" ile değiştirilebilir.
- (sabit) Yalnızca mevcut bir eklentinin işlevselliğini artıran veya görüntüsünü (ve benzerlerini) değiştiren ve bu nedenle üst öğe olmadan var olmayan bir alt eklenti. Örnek: BuddyPress »BuddyPress-FunkyCommentDisplay
- (normal) Bir alt eklenti etkinleştirildiğinde genişletilmiş işlevselliğe sahip bir eklenti. Örnek: jQueryAttachmentCarousel »jQuerySlideDeck
- (yumuşak) Sadece bir özellik ekleyen bir eklenti. Örnek: DisneyWonderlandTheme »MickeysSocialLinks
Aşağıda "diğer" eklentiyi güncellediğinizde neler olduğunu çizmeye çalışıyorum ve kontrol artık çalışmıyor.
- Reklam 1) Eklenti BuddyPress etkinleştirilmeden var olamazdı »Sayfalar tamamen bozuk.
- Reklam 2) Eklenti Carousel'den SlideDeck'e geçme seçeneği sunamadı »Kablolu görüntüler (Stillerin SlideDeck olarak değiştirildiğini varsayıyorum).
- Reklam 3) MickeysSocialLinks kaybolur.
Kontrol
Bir eklentinin etkin olup olmadığını öğrenmek istiyorsanız, kontrol etmek için imho üç olasılık vardır:
- A. Klasör var mı?
- B. Ana dosya - seçenek
'active_plugins'
- var mı?
- C. Belirli bir işlev var mı?
Şimdi Dahili Bağlantı Denetleyicisi Eklentimi örnek olarak alırsam , bu hiçbir ortak API sunmaz ve genişletilmesi amaçlanmazsa, dahili işlev adlandırma isteğinde veya sadece irade değiştirmek için hiçbir neden göremiyorum (yazar olarak) . Birisi bu eklentide piggyback yapmaya çalışırsa, güncelleme sırasında işler sadece (işlevsellik ve grup sıkılığına bağlı olarak) kırılır. Aynı şey dosya adları için de geçerlidir. Dosya adını değiştirmemek için gerçek bir nedenim yok (eklentinin güncellemede devre dışı bırakılacağı dışında). Beni klasör adını değiştirmekten alıkoyan tek şey, güncelleme kontrolünün ve bildiriminin dosya adına karşı çalışmasıdır - resmi repoda barındırılıyorsa.
Bu yüzden (ebeveyn) bir eklentinin en zayıf (değiştirmek kolay) en sert (çok değişime karşı konuşmak) bir parçası olacağını söyleyebilirim:
işlev »ana dosya adı» klasör
Bir işlev kontrolünü kullanmaktan daha az kırılgan olduğunu is_plugin_active()
söylediğimde, söz konusu işlevin eklenti yazarının açıkça teşvik ettiği bir işlev olduğunu varsaydım. Bunun nihai örneği wp_pagenavi()
, WP-PageNavi eklentisi tarafından sunulan şablon etiketi olacaktır .
Bağımlılıkları tanımlamanın zorluğu, dosya adlarını içermeyen eklentileri benzersiz bir şekilde tanımlamanın standart bir yolu olmamasıdır.
Konu hakkında daha fazla düşünce:
http://wordpress.org/support/topic/plugin-plugin-dependencies-unreliable-plugin-namingidentifying-scheme
Sanırım şu ana kadar üç noktada özetleyebiliriz:
- Biraz farklı konulardan bahsettik
- Konunun olacağını düşündüğüm şeyi atlatmanın kurşun geçirmez bir yolu olmadığına katılıyoruz
- Soruyu anlamanızdan geçerli bir yol önerdiniz
Bazı (çok daha az) eklentilerde gördüğüm (şimdiye kadar) en akıllıca yol:
// inside the plugin file:
add_action( 'plugin_custom_hook', 'plugin_trigger' );
// inside some template:
do_action( 'plugin_custom_hook' );
Bu konuda çok fazla düşünmeden, ancak bildiriminizi 'hepsi' filtresinde bir kontrole bağlayabilir ve kancadayken tetiklendiğinde mevcut filtrenin içinde kontrol edebilirsiniz shutdown
...?
Kanca kullanmak, 'normal' ve 'zayıf' bağımlılıklar için iyi çalışır. Tek dezavantajı, hala kullanmanız gerekeceği function_exists()
veya is_plugin_active()
bağımlılığın karşılanmaması durumunda durdurmak istiyorsanız. Bunun için 'tümü' filtresini kullanmak çok pahalı IMO olacaktır.
@scibu Bu, "sizin" konusunuzu hedef aldı. (Zaten benim hakkımda konuşmayı bıraktım). :)
Temel olarak, bir bağımlılığa ihtiyacınız varsa - ve güzel bir yazarınız varsa - o zaman bir şablon etiketi yerine / kanca olarak sunabilir. Çünkü eklenti sadece kanca mevcutsa ya da hiçbir şey yapmazsa içine asılır. Ve diğer tarafta, eklentiler mevcut olmadığında bir hatayla karşılaşmazsınız.
İşte zor kısmı (veya bir Q'nun daha fazlası): Kullanıcıyı "DisneyWonderLinks« "'i kurmanız gerekiyor" konusunda bağımlılık hakkında bilgilendirmek için bir yönetici bildirimi yazmak için işaretleyebilirsiniz array_keys( $GLOBALS['wp_filter']['template_tag_like_hook'] )
. Bu işe yarayacak mı emin değilim, ama afaik dizi (kamu / yönetici) tarafında erişilebilir olmalıdır.
Bu işe yaramaz. Bir çağrının kancaya kaydedilmesi, çağrının beklendiğinde tetikleneceği anlamına gelmez. Bir tür çalışma yapacak tek şey, daha önce bahsettiğiniz 'kapanma' kancasını kullanmaktır:
add_action( 'shutdown', function() {
if ( !did_action( 'template_tag_like_hook' ) )
echo 'Problem.';
} );
Tabii ki, bu, </html>
etiketin ardından en altta, ön uçta (şablon etiketlerinin normal olarak kullanıldığı yer olduğu için) çok fazla kullanılmaz.
İletiyi wp_options içinde depolayıp daha sonra yönetici alanında görüntülemeyi deneyebilirsiniz, ancak bu yepyeni bir solucan kutusu açar: geçersiz kılma, önbellek eklentileri vb.
function_exists
, sorguladığınız bir işlev adını değiştirirse , normal bir kullanıcı, başka bir eklentinin dayandığı eklentiyi yüklemediğini bildirir. Sorun kullanıcı aslında yani, olacak eklentisi yüklü ve sonra sadece neden onu merak işin doens't . Oh, ve ben değil bunun için sana downvote olacak.