Come utilizzare le classi dichiarate in un altro plugin?
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.
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')
);
}

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

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?

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

È 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.

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.

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.
