Bu eklentiden bireysel bir işlevi çağırırken php koşullu ifadeleri kullanmadan bir wp temasında gerekli eklentiyi nasıl yapabilirim?


10

Wordpress temalarımdan birinin düzgün çalışması için birkaç üçüncü taraf eklentisi gerekiyor.

Çoğu zaman, aşağıdaki gibi koşullu ifadeleri kullanarak üçüncü taraf eklentilerin işlevlerini çağırırdım

    if(function_exist('plugin_function')) {
             plugin_function() // do something
    }

benim tema birçok dosya aracılığıyla kapsamlı bir eklenti kullanmam gerekiyor olsa da ... birçok IF koşullarını kullanmaktan kaçınmak istiyorum ... WP yüklü belirli belirli eklenti veya daha iyi yüklemek için uygun bir yolu var mı temayı etkinleştirmeden önce eksiklerse?

Teşekkürler

Yanıtlar:


7

is_plugin_active()oldukça kırılgan: eklenti yazarı ana dosyayı yeniden adlandırdığında veya kullanıcı eklentinin dizinini veya ana dosyasını yeniden adlandırdığında kırılır. Belirli bir ortak işlevin var olup olmadığını kontrol etmek daha iyidir.

Eklentinin işlevlerinden bazılarına her ihtiyacınız olduğunda bu denetimi yapmak zorunda kalmamak için, yönetici alanında bir mesaj gösterebilirsiniz:

add_action( 'admin_notices', 'my_theme_dependencies' );

function my_theme_dependencies() {
  if( ! function_exists('plugin_function') )
    echo '<div class="error"><p>' . __( 'Warning: The theme needs Plugin X to function', 'my-theme' ) . '</p></div>';
}

Başka bir alternatif de http://tgmpluginactivation.com/ gibi bir şey kullanmaktır.


Eklenti yazarı 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.
kaiser

Oyları önemsiyorsanız, Q'nun kendisini iyi değerlendirmeniz gerekir.
Kaiser

Eklenti yazarı işlev adını değiştirirse, dosya adını değiştirmekten çok daha fazla kullanıcıdan şikayet alır.
scribu

Ve cevabınızı reddettim çünkü IMO sorusunu ele almadı. Yoksa hiçbir açıklama yapılmadan gizlice oy vermemeyi tercih eder misiniz?
scribu

Sadece yorumdan bahsetmiyorum, yorumdan değil. Bu konunun tartışılması gereken bir şey olduğu için yorumun kendisi tamam. Bunun arkasındaki düşüncelerim yorum uzunluğunu aşacağı için başka bir cevap ekleyeceğim. Lütfen yanıtı düzenleyin, böylece tartışma sonuçlarını herkesin izleyeceği revizyonlarda tutabiliriz. Teşekkürler.
Kaiser

1

Bu, eklenti devre dışı bırakıldığında temanın kesilmesini engellemese de, "Gerekli Temalar için Yönetici Bildirimi Nasıl Görüntülenir" eklentisi hakkındaki bu kaygan makaleye bakarım . Bir eklentiyi yüklenmeye zorlayan bir tema fikriyle hiç rahat olmadım ve bu da bir sonraki en iyi seçenek gibi görünüyor.

Başka bir hızlı düşünce: Bunu hiç denemedim, ama merak ediyorum, tek bir koşulda birden fazla kanca barındırmanın akıllıca bir yolunu bulabilir misiniz? Belki de tüm koşullu işlevleri farklı bir dosyada ayırabilir ve yalnızca if( function_exists( 'plugin_function' ) )döndürürse gerekli olabilir true(bunun kusursuz bir denetim olduğunu anlayarak).


0

Sadece bir eklenti sayfasına ihtiyacınız varsa, o zaman var is_plugin_active(). Dışarıda ihtiyacınız varsa, temel işlevi temanıza kopyalayıp yapıştırmanız ve daha sonra tekrar kullanmanız gerekir:

if ( ! is_admin() )
{
/**
 * Check whether the plugin is active by checking the active_plugins list.
 *
 * @since 2.5.0
 *
 * @param string $plugin Base plugin path from plugins directory.
 * @return bool True, if in the active plugins list. False, not in the list.
 */
function is_plugin_active( $plugin ) {
    return in_array( $plugin, (array) get_option( 'active_plugins', array() ) ) || is_plugin_active_for_network( $plugin );
}
}

Koşullu, işlevi iki kez tanımlayan hataları önler.


Bu soruya gerçekten cevap vermiyor. Bu sadece değiştirir if(function_exist('plugin_function'))ileif(is_plugin_active('plugin-file.php'))
scribu

0

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.

  1. (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
  2. (normal) Bir alt eklenti etkinleştirildiğinde genişletilmiş işlevselliğe sahip bir eklenti. Örnek: jQueryAttachmentCarousel »jQuerySlideDeck
  3. (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.


Kayıt için bu, sitenin işlevselliğini kullanmanın alışılmışın dışında bir yoludur. Bu hatırlatıyor c2.com/cgi/wiki
scribu

Evet öyle. Ancak daha sonraki okuyuculardan gizlemeden tartışmaya nasıl devam edebileceğimiz hakkında hiçbir fikrim yoktu.
kaiser

Soruyu yayınlamanın bir tartışma yaratacağını fark etmem :) Ama gerçekten ilginç ve hem çabalarınız hem de zaman ayırdığınız için tavsiye ve düşünceli bir tartışma yaptığınız için teşekkür ederim. Scribu (TGM Aktivasyon sınıfını kullanma) tavsiyesinin cevabım için en azından sadece pratik bir bakış açısıyla bir çözüm sunabileceğini düşünüyorum, buna bakacağım. Ancak, yine de tüm tartışmayı izliyorum çünkü önerilen diğer yöntemler de belirli senaryolarda mantıklı ve okumak benim için çok ilginç, teşekkürler!
unfulvio
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.