Errore fatale: Classe non trovata in
Sto lavorando su un plugin per 'agganciare' un provider di pagamento aggiuntivo in un sistema di checkout.
Ho una classe gtpCheckoutData nel mio functions.php che calcola i prezzi.
Nel mio plugin voglio utilizzare i dati da questa classe gtpCheckoutData, ma quando lo faccio ottengo:
Errore fatale: Classe gtpCheckoutData non trovata in
Il codice del mio plugin:
class gtpMollieGateway {
private $mollie, $price;
function __construct() {
$this->mollie = new Mollie_API_Client;
// QUESTO È IL PROBLEMA
$this->price = new gtpCheckoutData;
add_action( 'init', array( $this, 'gtpCreatePayment' ) );
}
function gtpCreatePayment() {
if( isset( $_POST['checkout_submit'] ) ) {
$payment = $this->mollie->payments->create(array(
'amount' => $this->price->getPrice( 'inclusive' ),
));
header( "Location: " . $payment->getPaymentUrl() );
}
}
}
La mia classe gtpCheckoutData in functions.php
class gtpCheckoutData {
private $tax, $price;
public function __construct() {
$this->tax = get_gtp_option( 'gtp_tax' ) / 100;
$this->price = $_SESSION['shopping_cart']['total_price'] + $_SESSION['shopping_cart']['shipping_price'];
$this->shipping = $_SESSION['shopping_cart']['shipping_price'];
}
public function getPrice( $type ) {
if( isset( $type ) ) {
switch( $type ) {
case 'exclusive' :
$totalPrice = $this->price;
break;
case 'tax' :
$totalPrice = $this->price * $this->tax;
break;
case 'inclusive' :
$totalPrice = $this->price * ( $this->tax + 1 );
break;
}
return $totalPrice;
}
}
}

I plugin si caricano prima dei temi. Gli hook più precoci disponibili per i plugin sono plugins_loaded
(o muplugins_loaded
per i mu-plugin), mentre i temi vengono eseguiti sugli hook after_setup_theme
e successivi. Quindi è meglio caricare il file [che contiene la classe] su un hook specifico nel tuo plugin. Probabilmente è meglio caricarlo con una priorità inferiore a quella predefinita 10
. Di seguito uso 5
per renderlo disponibile alle callback in esecuzione con la priorità predefinita. Questo è più sicuro per i tuoi utenti perché potrebbero non aggiungere una priorità e quindi la callback verrebbe eseguita su 10
e l'errore verrebbe generato (di nuovo).
add_action( 'after_setup_theme', function()
{
require plugin_dir_path( __FILE__ ).'src/your-class.php`;
}, 5 );
Poi, nel file functions.php
del tuo tema puoi semplicemente fare affidamento sulla classe. Inoltre evita di duplicare il tuo codice (e mantenerlo in due posti) e non necessita di inutili controlli class_exists
che riducono solo le prestazioni. Inoltre è prevedibile dove la tua classe è disponibile e pronta per l'uso.
Tieni presente che l'attuale standard FIG PSR-4 non consente più di una classe per file (e nient'altro al suo interno). Seguire questo rende il tuo setup più futuro-proof in quanto il tuo codice è pronto per i namespace. (L'attuale versione di PHP è la 5.6 e la 5.3 è alla fine del suo ciclo di vita).

Grazie per la tua ottima risposta! L'unico problema che ottengo è che get_gtp_option() è una funzione creata in functions.php. Quindi ricevo di nuovo un errore.

I plugin vengono caricati prima del functions.php. Se possibile, dovresti includere la classe nel tuo plugin.
Mi sono trovato in situazioni in cui una classe faceva parte del tema, ma era necessaria anche in un plugin dove non potevo dare per scontato che la classe fosse inclusa nel tema. In questi casi, ho semplicemente incluso la classe in entrambi i posti e l'ho racchiusa in un controllo "class_exists".
In questo modo:
if(!class_exists('My_Class'))
{
class My_Class{
// Metodi e Proprietà della Classe
}
}
Potresti anche includere la classe una sola volta negli MU Plugins, che vengono caricati prima degli altri plugin.
