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


10

Je développe un plugin Wordpress Woocommerce. Sur mon environnement local, cela fonctionne bien mais j'ai des problèmes lors de l'ajout du plugin à une réplique de l'environnement de prod. Je suis nouveau sur wordpress et pas très familier avec le développement web (je suis programmeur Java).

Dans le fichier du plugin, j'instancie une classe du package du plugin Woocommerce comme ceci:

$coupon = new WC_Coupon($some_code);

Dans l'environnement local (php 5.4.10, Woocommerce 2.0.13, Wordpress 3.6) ça va. 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 où 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.

Réponses:


10

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 à partir du plugin lorsque tous les plugins sont chargés crochet dans plugins_loadedcrochet.

Sachez que vous ne pouvez pas utiliser ce crochet dans un thème, car lorsque le chargement du thème était déjà déclenché.

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')
    );
}

Je ne sais pas si dans ce cas plugins_loadedest le crochet approprié. Il faudra chercher quand exactement cette classe est disponible et se connecter après cela. Quoi qu'il en soit +1
kaiser

Dans ce cas particulier, je suis accroché au crochet de désactivation register_deactivation_hook( __FILE__, 'deactivate');. Je ne peux donc pas attendre. Puis-je demander à wordpress de charger la classe si elle n'est pas encore chargée?
znat

2
Merci @kaiser. Le WC_Couponest chargé par __constructla WooCommerceclasse principale (vraiment par une includes()méthode directement appelée par __construct) et la WooCommerceclasse est instanziate (en tant que singleton) dès que le plugin est chargé. Il en plugins_loadedva de même dans ce cas;)
gmazzap

Anonyme avant les chargements de base? Bravo Woo, bravo.
kaiser

@NathanZ Check class_exists( 'WC_Coupon' ). Veuillez également indiquer que vous l'utilisez pendant la désactivation ... aurait pu économiser des tonnes de temps à répondre à la foule ...
kaiser

6

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 woocommerce_loadedcrochet d'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 ça aidera quelqu'un.


3

La bonne façon 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 une erreur fatale si le plugin est désactivé.

Vous ne pouvez pas redéclarer une classe non 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 crochet dans la documentation qui gérera le travail.


1
Si vous étendez votre classe via un hook, la nouvelle classe n'existera-t-elle que dans la portée du hook de fonction?
alexg
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.