Bagaimana cara menggunakan kelas yang dideklarasikan di plugin lain?

10

Saya sedang mengembangkan plugin Wordpress Woocommerce. Di lingkungan lokal saya berfungsi dengan baik tetapi saya memiliki masalah ketika menambahkan plugin ke replika lingkungan prod. Saya baru mengenal wordpress dan tidak terlalu mengenal web dev (saya seorang programmer Java).

Di file plugin, saya membuat instance kelas dari paket plugin Woocommerce seperti ini:

$coupon = new WC_Coupon($some_code);

Di lingkungan lokal (php 5.4.10, Woocommerce 2.0.13, Wordpress 3.6) tidak masalah. Dalam lingkungan produksi (php 5.4.10, Woocommerce 1.6.5.2, Wordpress 3.4.2) Saya memiliki kesalahan berikut:

Fatal error: Class 'WC_Coupon' not found

Saya telah mencoba memasukkan file di mana kelas WC_Coupon didefinisikan tetapi kemudian kesalahan menjadi

Fatal error: Cannot redeclare class WC_Coupon

Jadi apa cara yang tepat untuk menggunakan kelas yang dideklarasikan di plugin lain?

Catatan: meningkatkan bukanlah suatu pilihan saat ini.

znat
sumber

Jawaban:

10

Anda harus memeriksa apakah kelasnya ada, tetapi sebelum itu Anda harus menunggu bahwa semua plugin dimuat: tidak ada yang bisa memastikan bahwa plugin Anda dimuat setelah WooCommerce.

Untuk menjalankan kode dari plugin ketika semua plugin dimasukkan ke dalam plugins_loadedhook.

Ketahuilah bahwa Anda tidak dapat menggunakan pengait ini dalam sebuah tema, karena ketika tema memuat pengait itu sudah diaktifkan.

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')
    );
}
gmazzap
sumber
Tidak yakin apakah dalam kasus plugins_loadeditu kait yang tepat. Seseorang harus mencari kapan kelas itu tersedia dan terhubung setelah itu. Pokoknya +1
kaiser
Dalam kasus khusus ini, saya terhubung ke kait penonaktifan register_deactivation_hook( __FILE__, 'deactivate');. Jadi saya tidak sabar. Bisakah saya meminta wordpress untuk memuat kelas jika belum dimuat?
znat
2
Terima kasih @iser. The WC_Coupondimuat oleh __constructsatu utama WooCommercekelas (benar-benar oleh includes()metode langsung disebut oleh __construct) dan WooCommercekelas instanziate (sebagai tunggal) segera setelah plugin dimuat. Demikian plugins_loadedjuga kaitan yang tepat dalam kasus ini;)
gmazzap
Anonim sebelum inti dimuat? Bagus sekali, Woo, bagus sekali.
kaiser
@NathanZ Periksa class_exists( 'WC_Coupon' ). Juga tolong sebutkan bahwa Anda menggunakan ini selama penonaktifan ... bisa menghemat waktu menjawab kerumunan banyak ...
kaiser
6

Ini sudah terlambat tetapi saya ingin berbagi cara menggunakan woocommerce dan kelas-kelasnya tanpa kelas kesalahan tidak ditemukan.

Pertama adalah memeriksa apakah woocommerce diinstal dan menggunakan woocommerce_loadedhook tindakan.

/**
 * 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 
    });

}

Saya harap ini membantu seseorang.

jameshwart lopez
sumber
3

Cara yang tepat adalah:

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

Lebih baik untuk memeriksa apakah kelas ada sebelum menggunakannya, itu menghindari kesalahan fatal jika plugin dinonaktifkan.

Anda tidak dapat mendeklarasikan ulang kelas yang tidak diizinkan di PHP.

Anda juga dapat memperluas kelas:

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

Tetapi sebagian besar waktu dan dalam hal ini dengan WooCommerce Anda sebaiknya menemukan kait dalam dokumentasi yang akan menangani pekerjaan.

JMau
sumber
1
Jika Anda memperluas kelas Anda melalui hook, bukankah kelas baru hanya ada di lingkup hook fungsi?
alexg