Başka bir eklentide bildirilen sınıflar nasıl kullanılır?


10

Bir Wordpress Woocommerce eklentisi geliştiriyorum. Yerel ortamımda iyi çalışıyor ancak eklentiyi eşya ortamının bir kopyasına eklerken sorun yaşıyorum. Wordpress'te yeniyim ve web dev'e çok aşina değilim (ben bir Java programcısıyım).

Eklenti dosyasında, Woocommerce eklenti paketinden böyle bir sınıfı başlatırım:

$coupon = new WC_Coupon($some_code);

Yerel ortamda (php 5.4.10, Woocommerce 2.0.13, Wordpress 3.6) sorun yok. Üretim ortamında (php 5.4.10, Woocommerce 1.6.5.2, Wordpress 3.4.2) Aşağıdaki hatayla karşılaşıyorum:

Fatal error: Class 'WC_Coupon' not found

WC_Coupon sınıfının tanımlandığı dosyayı dahil etmeyi denedim ancak hata oluştu

Fatal error: Cannot redeclare class WC_Coupon

Peki, başka bir eklentide bildirilen sınıfları kullanmanın doğru yolu nedir?

Not: yükseltme şu anda bir seçenek değildir.

Yanıtlar:


10

Sınıfın var olup olmadığını kontrol etmelisiniz, ancak bundan önce tüm eklentilerin yüklenmesini beklemek zorundasınız : hiç kimse eklentinizin WooCommerce'den sonra yüklenmesini sağlayamaz.

Tüm eklenti kancaya yüklendiğinde eklentiden bir kod çalıştırmak için plugins_loaded.

Bu kancayı bir temada kullanamayacağınızı unutmayın, çünkü tema yüklendiğinde o kanca zaten tetiklenmiştir.

add_action('plugins_loaded', 'my_coupon_init');

function my_coupon_init() {
  if ( class_exists('WC_Coupon') ) {
    $coupon = new WC_Coupon($some_code);
    // some code here
  } else {
    add_action('admin_notices', 'wc_not_loaded');
  }
}

function wc_not_loaded() {
    printf(
      '<div class="error"><p>%s</p></div>',
      __('Sorry cannot create coupon because WooCommerce is not loaded')
    );
}

Bu durumda plugins_loadeduygun kanca olup olmadığından emin değilim . Bu sınıfın tam olarak ne zaman kullanılabilir olduğu araştırılmalı ve bundan sonra takılmalıdır. Neyse +1
kaiser

Bu özel durumda, deaktivasyon kancasını takıyorum register_deactivation_hook( __FILE__, 'deactivate');. Bu yüzden bekleyemem. Henüz yüklenmediyse wordpress'ten sınıfı yüklemesini isteyebilir miyim?
znat

2
Teşekkürler @kaiser. WC_CouponTarafından yüklenen __constructana ait WooCommercesınıfı (gerçekten tarafından includes()doğrudan tarafından çağrılan yöntemin __constructve) WooCommercesınıfına yakında eklentisi yüklendiğinde kadar (singleton olarak) instanziate olduğunu. Bu plugins_loadeddurumda uygun kanca da öyle;)
gmazzap

Çekirdek yüklerden önce isimsiz mi? Aferin Woo, aferin.
kaiser

@NathanZ Check class_exists( 'WC_Coupon' ). Ayrıca, bunu devre dışı bırakma sırasında kullandığınızı belirtin ... yanıtlayan kalabalık tonlarca zamandan tasarruf etmiş olabilir ...
kaiser

6

Bu çok geç ama ben bulunamadı bir hata sınıfı olmadan woocommerce ve sınıflarını kullanmayı paylaşmak istiyorum.

Birincisi, woocommerce'in kurulu olup olmadığını kontrol etmek ve woocommerce_loadedeylem kancasını kullanmaktır .

/**
 * Check if WooCommerce is active
 **/
if ( in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {
    // Put your plugin code here

    add_action('woocommerce_loaded' , function (){
         //Put your code here that needs any woocommerce class 
         //You can also Instantiate your main plugin file here 
    });

}

Umarım bu birine yardımcı olur.


3

Doğru yol şöyle olurdu:

 if( class_exists('WC_Coupon') ) $coupon = new WC_Coupon($some_code);

Sınıfı kullanmadan önce var olup olmadığını kontrol etmek daha iyidir, eklenti devre dışı bırakılırsa ölümcül hatayı önler.

PHP'de izin verilmeyen bir sınıfı yeniden bildiremezsiniz.

Ayrıca sınıfı genişletebilirsiniz:

class My_WC_Coupon extends WC_Coupon {
   //some code
   //some hook
}

Ancak çoğu zaman ve bu durumda WooCommerce ile işi halledecek belgelerde bir kanca bulmanız daha iyi olur.


1
Sınıfınızı bir kanca aracılığıyla genişletirseniz, yeni sınıf yalnızca işlev kancası kapsamında mevcut olmaz mı?
alexg
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.