Eroare fatală: Clasa nu a fost găsită în
Lucrez la un plugin pentru 'conectarea' unui furnizor suplimentar de plăți într-un sistem de checkout.
Am o clasă gtpCheckoutData în fișierul meu function.php care calculează prețurile.
În plugin-ul meu vreau să folosesc date din această clasă gtpCheckoutData, dar când fac asta primesc:
Eroare fatală: Clasa gtpCheckoutData nu a fost găsită în
Codul plugin-ului meu:
class gtpMollieGateway {
private $mollie, $price;
function __construct() {
$this->mollie = new Mollie_API_Client;
// ACEASTA ESTE 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() );
}
}
}
Clasa mea gtpCheckoutData din 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;
}
}
}

Plugin-urile se încarcă înaintea temelor. Primele hook-uri disponibile pentru plugin-uri sunt plugins_loaded
(sau muplugins_loaded
pentru mu-plugins), în timp ce temele rulează pe hook-urile after_setup_theme
și cele ulterioare. Așadar, este mai bine să încarci fișierul [care conține clasa] pe un anumit hook în plugin-ul tău. Probabil cel mai bine este să-l încarci cu o prioritate mai mică decât cea implicită 10
. Mai jos folosesc 5
pentru a o face disponibilă pentru callback-urile care rulează cu prioritatea implicită. Acest lucru este mai sigur pentru utilizatorii tăi, deoarece aceștia s-ar putea să nu adauge o prioritate și, prin urmare, callback-ul va rula pe 10
și eroarea va fi aruncată (din nou).
add_action( 'after_setup_theme', function()
{
require plugin_dir_path( __FILE__ ).'src/your-class.php`;
}, 5 );
Apoi, în fișierul functions.php
al temei tale, poți pur și simplu să te bazezi pe clasă. De asemenea, evită duplicarea codului tău (și întreținerea lui în două locuri) și nu necesită verificări inutile class_exists
care doar reduc performanța. De asemenea, este predictibil unde clasa ta este disponibilă și gata de utilizare.
Ține minte că actualul standard FIG PSR-4 nu permite mai mult de o clasă pe fișier (și nimic altceva acolo). Urmând acest standard, configurația ta va fi mai viabilă în viitor, deoarece codul tău este gata pentru namespace-uri. (Versiunea curentă a PHP este 5.6, iar 5.3 a ajuns la sfârșitul vieții).

Mulțumesc pentru răspunsul excelent! Singura problemă pe care o am atunci este că get_gtp_option() este o funcție creată în functions.php. Așa că apoi primesc din nou o eroare.

Plugin-urile sunt încărcate înainte de functions.php. Ar trebui să incluzi clasa în plugin-ul tău dacă este posibil.
Am întâlnit scenarii în care o clasă făcea parte din temă, dar era necesară și într-un plugin unde nu puteai presupune că clasa era inclusă în temă. În acele cazuri, pur și simplu am inclus clasa în ambele locuri și am închis-o într-o verificare "class exists".
Ca acesta:
if(!class_exists('My_Class'))
{
class My_Class{
// Metode și Proprietăți ale Clasei
}
}
Ai putea de asemenea include clasa o singură dată în MU Plugins, care este încărcat înaintea celorlalte plugin-uri.
