Come utilizzare le classi dichiarate in un altro plugin?

19 ago 2013, 15:46:14
Visualizzazioni: 34.7K
Voti: 12

Sto sviluppando un plugin WordPress WooCommerce. Nel mio ambiente locale funziona correttamente ma ho problemi quando aggiungo il plugin a una replica dell'ambiente di produzione. Sono nuovo su WordPress e non ho molta familiarità con lo sviluppo 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) funziona 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 a includere il file dove è definita la classe WC_Coupon ma poi l'errore diventa:

Fatal error: Cannot redeclare class WC_Coupon

Quindi qual è il modo corretto per utilizzare le classi dichiarate in un altro plugin?

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

0
Tutte le risposte alla domanda 4
5
11

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

Per eseguire un codice dal plugin quando tutti i plugin sono caricati, agganciati all'hook plugins_loaded.

Tieni presente che non puoi utilizzare questo hook in un tema, perché quando il tema viene caricato questo 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);
    // qualche codice qui
  } else {
    add_action('admin_notices', 'wc_not_loaded');
  }
}

function wc_not_loaded() {
    printf(
      '<div class="error"><p>%s</p></div>',
      __('Mi dispiace, non posso creare il coupon perché WooCommerce non è caricato')
    );
}
19 ago 2013 16:24:46
Commenti

Non sono sicuro che in quel caso plugins_loaded sia l'hook appropriato. Bisognerà verificare esattamente quando quella classe è disponibile e agganciarsi dopo quel momento. Comunque +1

kaiser kaiser
19 ago 2013 16:48:53

In questo caso specifico, mi sto agganciando all'hook di disattivazione register_deactivation_hook( __FILE__, 'deactivate');. Quindi non posso aspettare. Posso chiedere a WordPress di caricare la classe se non è ancora stata caricata?

znat znat
19 ago 2013 17:01:04

Grazie @kaiser. La classe WC_Coupon viene caricata dal __construct della classe principale WooCommerce (in realtà dal metodo includes() chiamato direttamente da __construct) e la classe WooCommerce viene istanziata (come singleton) non appena il plugin viene caricato. Quindi plugins_loaded è l'hook corretto in questo caso ;)

gmazzap gmazzap
19 ago 2013 17:28:31

Anonimo prima del caricamento del core? Ben fatto Woo, ben fatto.

kaiser kaiser
19 ago 2013 17:45:42

@NathanZ Controlla class_exists( 'WC_Coupon' ). Per favore specifica anche che stai usando questo durante la disattivazione... avresti potuto risparmiare un sacco di tempo a chi risponde...

kaiser kaiser
19 ago 2013 17:46:31
0

È un po' tardi ma vorrei condividere come utilizzare WooCommerce e le sue classi senza incorrere nell'errore "class not found".

Prima di tutto bisogna verificare se WooCommerce è installato e utilizzare l'hook di azione woocommerce_loaded.

/**
 * Verifica se WooCommerce è attivo
 **/
if ( in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {
    // Inserisci qui il codice del tuo plugin

    add_action('woocommerce_loaded' , function (){
         //Inserisci qui il codice che necessita di qualsiasi classe WooCommerce 
         //Puoi anche istanziare il tuo file principale del plugin qui 
    });

}

Spero che questo possa aiutare qualcuno.

15 apr 2016 18:31:54
1

Il modo corretto sarebbe:

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

È meglio verificare se la classe esiste prima di utilizzarla, così si evita un errore fatale se il plugin è disabilitato.

Non puoi ridefinire una classe, non è consentito in PHP.

Puoi anche estendere la classe:

class My_WC_Coupon extends WC_Coupon {
   //qui del codice
   //qui degli hook
}

Ma nella maggior parte dei casi, e in questo specifico caso con WooCommerce, è meglio trovare un hook nella documentazione che gestisca il lavoro.

19 ago 2013 16:06:58
Commenti

Se estendi la tua classe tramite un hook, la nuova classe non esisterà solo nell'ambito della funzione hook?

alexg alexg
29 dic 2015 20:05:59
0

Un'intestazione "Requires Plugins" è stata aggiunta nel 2024, Introduzione alle dipendenze dei plugin in WordPress 6.5

/**
 * Plugin Name: Express Payment Gateway Checkout for Shop
 * Requires Plugins: shop, payment-gateway
 */

Ciò consente a un plugin di dipendere dall'attivazione di un altro plugin. L'ordine di caricamento rimane comunque una preoccupazione, e altre risposte forniscono soluzioni che attendono il caricamento di tutti i plugin e verificano ulteriormente se le classi attese esistono.

15 set 2024 08:05:58