How to use classes declared in another plugin?

I’m developing a WordPress Woocommerce plugin. On my local environment it works fine but I have problems when adding the plugin to a replica of the prod environment. I am new to wordpress and not very familiar with web dev (I’m a Java programmer).

In the plugin file, I instantiate a class from the Woocommerce plugin package like this:

Read More
$coupon = new WC_Coupon($some_code);

In the local environment (php 5.4.10 , Woocommerce 2.0.13, WordPress 3.6) it’s fine. In the production environment (php 5.4.10 , Woocommerce 1.6.5.2, WordPress 3.4.2) I have the following error:

Fatal error: Class 'WC_Coupon' not found

I have tried including the file where the WC_Coupon class is defined but then the error becomes

Fatal error: Cannot redeclare class WC_Coupon

So what is the proper way to use classes declared in another plugin?

Note: upgrading is not an option at the moment.

Related posts

3 comments

  1. You have to check if the class exists, but before that you have to wait that all plugin are loaded: no one can assure that your plugin is loaded after WooCommerce.

    For run a code from plugin when all plugin are loaded hook into plugins_loaded hook.

    Be aware that you cannot use this hook in a theme, because when theme load that hook was already fired.

    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')
        );
    }
    
  2. This is too late but I would like to share how to use woocommerce and its classes without having an error class not found.

    First is to check if woocommerce is installed and use the woocommerce_loaded action hook.

    /**
     * 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 
        });
    
    }
    

    I hope this helps someone.

  3. The proper way would be :

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

    It’s better to check if class exists before using it, it avoids fatal error if the plugin is disabled.

    You can’t redeclare a class it’s not allowed in PHP.

    You can also extend class :

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

    But most of the time and in this case with WooCommerce you’d better find a hook in documentation that will handle the job.

Comments are closed.