Comment utiliser les classes déclarées dans un autre plugin?

9

Je développe un plugin Wordpress Woocommerce. Dans mon environnement local, cela fonctionne bien, mais j'ai des problèmes pour ajouter le plug-in à une réplique de l'environnement prod. Je suis nouveau sur WordPress et je ne connais pas très bien Web dev (je suis un programmeur Java).

Dans le fichier de plug-in, j'instancie une classe du package de plug-in Woocommerce comme suit:

$coupon = new WC_Coupon($some_code);

Dans l'environnement local (php 5.4.10, Woocommerce 2.0.13, Wordpress 3.6), tout va bien. Dans l'environnement de production (php 5.4.10, Woocommerce 1.6.5.2, Wordpress 3.4.2), j'ai l'erreur suivante:

Fatal error: Class 'WC_Coupon' not found

J'ai essayé d'inclure le fichier dans lequel la classe WC_Coupon est définie, mais l'erreur devient

Fatal error: Cannot redeclare class WC_Coupon

Alors, quelle est la bonne façon d'utiliser les classes déclarées dans un autre plugin?

Remarque: la mise à niveau n'est pas une option pour le moment.

    
posée znat 19.08.2013 - 14:46

3 réponses

8

Vous devez vérifier si la classe existe, mais avant cela, vous devez attendre que tous les plugins soient chargés: personne ne peut garantir que votre plugin est chargé après WooCommerce.

Pour exécuter un code depuis un plugin lorsque tous les plugins sont chargés, raccordez-les dans plugins_loaded hook.

Sachez que vous ne pouvez pas utiliser ce hook dans un thème, car lors du chargement du thème, ce hook était déjà activé.

add_action('plugins_loaded', 'my_coupon_init');

function my_coupon_init() {
  if ( class_exists('WC_Coupon') ) {
    $coupon = new WC_Coupon($some_code);
    // some code here
  } else {
    add_action('admin_notices', 'wc_not_loaded');
  }
}

function wc_not_loaded() {
    printf(
      '<div class="error"><p>%s</p></div>',
      __('Sorry cannot create coupon because WooCommerce is not loaded')
    );
}
    
réponse donnée gmazzap 19.08.2013 - 15:24
4

C’est trop tard, mais je voudrais partager comment utiliser woocommerce et ses classes sans qu’une classe d’erreur ne soit trouvée.

Tout d'abord, vérifiez si woocommerce est installé et utilisez le point d'ancrage woocommerce_loaded action.

/**
 * Check if WooCommerce is active
 **/
if ( in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {
    // Put your plugin code here

    add_action('woocommerce_loaded' , function (){
         //Put your code here that needs any woocommerce class 
         //You can also Instantiate your main plugin file here 
    });

}

J'espère que cela aide quelqu'un.

    
réponse donnée jameshwart lopez 15.04.2016 - 17:31
2

La bonne manière serait:

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

Il est préférable de vérifier si la classe existe avant de l'utiliser, cela évite les erreurs fatales si le plugin est désactivé.

Vous ne pouvez pas redéclarer une classe qui n'est pas autorisée en PHP.

Vous pouvez également étendre la classe:

class My_WC_Coupon extends WC_Coupon {
   //some code
   //some hook
}

Mais la plupart du temps et dans ce cas avec WooCommerce, vous feriez mieux de trouver un point d'ancrage dans documentation qui gérera le travail.

    
réponse donnée JMau 19.08.2013 - 15:06

Lire d'autres questions sur les étiquettes