Come usare le classi dichiarate in un altro plugin?


10

Sto sviluppando un plugin per Wordpress Woocommerce. Nel mio ambiente locale funziona benissimo ma ho problemi durante l'aggiunta del plugin a una replica dell'ambiente prod. Sono nuovo di WordPress e non ho molta familiarità con gli sviluppatori Web (sono un programmatore Java).

Nel file del plugin, istanzio una classe dal pacchetto del plugin Woocommerce in questo modo:

$coupon = new WC_Coupon($some_code);

Nell'ambiente locale (php 5.4.10, Woocommerce 2.0.13, Wordpress 3.6) va bene. Nell'ambiente di produzione (php 5.4.10, Woocommerce 1.6.5.2, Wordpress 3.4.2) ho il seguente errore:

Fatal error: Class 'WC_Coupon' not found

Ho provato ad includere il file in cui è definita la classe WC_Coupon ma l'errore diventa

Fatal error: Cannot redeclare class WC_Coupon

Quindi qual è il modo corretto di usare le classi dichiarate in un altro plugin?

Nota: al momento l'aggiornamento non è un'opzione.

Risposte:


10

Devi verificare se la classe esiste, ma prima devi aspettare che tutti i plugin siano caricati: nessuno può assicurare che il tuo plugin sia caricato dopo WooCommerce.

Per eseguire un codice dal plugin quando tutti i plugin sono caricati hook in plugins_loadedhook.

Tenere presente che non è possibile utilizzare questo hook in un tema, perché quando il caricamento del tema quel hook è già stato attivato.

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')
    );
}

Non sono sicuro se in quel caso plugins_loadedè il gancio corretto. Si dovrà cercare quando è disponibile esattamente quella classe e collegarsi dopo . Comunque +1
Kaiser

In questo caso particolare, mi collego al gancio di disattivazione register_deactivation_hook( __FILE__, 'deactivate');. Quindi non vedo l'ora. Posso chiedere a wordpress di caricare la classe se non è stata ancora caricata?
znat,

2
Grazie @kaiser. Il WC_Couponviene caricato __constructdelle principali WooCommerceclassi (in realtà dal includes()metodo direttamente chiamato da __construct) e WooCommerceclasse è instanziate (come Singleton) non appena plugin è caricato. Quindi, plugins_loadedin questo caso, il gancio è corretto;)
gmazzap

Anonimo prima dei carichi core? Ben fatto Woo, ben fatto.
Kaiser

@NathanZ Check class_exists( 'WC_Coupon' ). Inoltre, ti preghiamo di affermare che lo stai utilizzando durante la disattivazione ... avrebbe potuto salvare la folla di risposta tonnellate di tempo ...
Kaiser

6

È troppo tardi, ma vorrei condividere come utilizzare il woocommerce e le sue classi senza che non sia stata trovata una classe di errore.

Il primo è verificare se woocommerce è installato e utilizzare il woocommerce_loadedgancio di azione.

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

}

Spero che questo aiuti qualcuno.


3

Il modo corretto sarebbe:

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

È meglio controllare se esiste una classe prima di usarla, evita errori fatali se il plugin è disabilitato.

Non puoi dichiarare una classe non consentita in PHP.

Puoi anche estendere la classe:

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

Ma la maggior parte delle volte e in questo caso con WooCommerce faresti meglio a trovare un gancio nella documentazione che gestirà il lavoro.


1
Se estendi la tua classe tramite un hook, la nuova classe non esisterà solo nell'ambito del hook della funzione?
alexg
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.