Je travaille actuellement sur un plug-in permettant de "connecter" un fournisseur de paiement supplémentaire à un système de paiement.
J'ai une classe gtpCheckoutData dans mon function.php qui calcule les prix.
Dans mon plugin, je veux utiliser les données de cette gtpCheckoutData class, mais si je le fais, je reçois un:
Erreur fatale: La classe gtpCheckoutData n’a pas été trouvée dans
Mon code de plugin:
class gtpMollieGateway {
private $mollie, $price;
function __construct() {
$this->mollie = new Mollie_API_Client;
// THIS IS THE PROBLEM
$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() );
}
}
}
Mon gtpCheckoutData class dans 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;
}
}
}
Les plugins sont chargés avant functions.php. Vous devriez inclure la classe dans votre plugin si possible.
J'ai eu des scénarios où une classe faisait partie du thème, mais avait également besoin d'un plugin où vous ne pouviez pas supposer que la classe était incluse dans le thème. Dans ces cas, j’ai simplement inclus la classe aux deux endroits et l’a enveloppée dans un contrôle "class existe".
Comme ça:
if(!class_exists('My_Class'))
{
class My_Class{
// Class Methods and Properties
}
}
Vous pouvez également inclure la classe une seule fois dans MU Plugins, qui est chargé avant les autres plugins.
Les plugins se chargent avant les thèmes. Les premiers hooks disponibles pour les plugins sont plugins_loaded
(ou muplugins_loaded
pour mu-plugins), tandis que les thèmes fonctionnent sur les hooks after_setup_theme
et ultérieurs. Vous feriez donc mieux de simplement charger le fichier [contenant la classe] sur un hook spécifique de votre plugin. Il est probablement préférable de le charger avec une priorité inférieure à la valeur par défaut 10
. Ci-dessous, j'utilise 5
pour le rendre disponible pour les rappels s'exécutant sur la priorité par défaut. Ceci est plus sûr pour vos utilisateurs car ils pourraient ne pas ajouter de priorité et donc le rappel s'exécute sur 10
et l'erreur sera renvoyée (à nouveau).
add_action( 'after_setup_theme', function()
{
require plugin_dir_path( __FILE__ ).'src/your-class.php`;
}, 5 );
Ensuite, dans votre fichier themes functions.php
, vous pouvez simplement compter sur la classe. Cela évite également de dupliquer votre code (et de le maintenir à deux endroits) et ne nécessite pas de contrôles class_exists
inutiles, ce qui réduit simplement les performances. De plus, il est prévisible que votre classe soit disponible et prête à être utilisée.
Gardez à l'esprit que la norme actuelle FIG PSR-4 n'autorise pas plus d'une classe par fichier (et rien d'autre ici). L'utilisation de cette option rend votre configuration plus durable, car votre code est prêt pour les espaces de noms. (La version actuelle de PHP est 5.6 et la version 5.3 est en fin de vie).