web-dev-qa-db-fra.com

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

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 suis pas très familiarisé avec Web dev (je suis un programmeur Java).

Dans le fichier de plugin, j'instancie une classe du paquet de plugins Woocommerce comme ceci:

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

9
znat

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

Pour exécuter le code du plug-in lorsque tous les plug-ins sont chargés, hook 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')
    );
}
9
gmazzap

C’est trop tard, mais je voudrais partager comment utiliser woocommerce et ses classes sans avoir une classe d’erreur introuvable.

La première consiste à vérifier si woocommerce est installé et à utiliser le hook d’action woocommerce_loaded.

/**
 * 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 ça aidera quelqu'un.

5
jameshwart lopez

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 prolonger 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 crochet dans documentation qui gérera le travail.

3
JMau