如何使用在另一个插件中声明的类?


10

我正在开发一个Wordpress Woocommerce插件。在我的本地环境中,它工作正常,但是将插件添加到产品环境的副本时遇到了问题。我是Wordpress的新手,对Web开发人员也不是很熟悉(我是Java程序员)。

在插件文件中,我从Woocommerce插件包实例化一个类,如下所示:

$coupon = new WC_Coupon($some_code);

在本地环境中(php 5.4.10,Woocommerce 2.0.13,Wordpress 3.6)很好。在生产环境中(php 5.4.10,Woocommerce 1.6.5.2,Wordpress 3.4.2),我遇到以下错误:

Fatal error: Class 'WC_Coupon' not found

我试过包括定义了WC_Coupon类的文件,但随后错误变为

Fatal error: Cannot redeclare class WC_Coupon

那么,使用在另一个插件中声明的类的正确方法是什么?

注意:目前无法升级。

Answers:


10

您必须检查该类是否存在,但是在此之前,您必须等待所有插件都已加载:没有人可以确保WooCommerce之后已加载您的插件。

当所有插件都加载到plugins_loaded钩子中时,用于从插件运行代码。

请注意,您不能在主题中使用此挂钩,因为在主题加载时该挂钩已被触发。

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

不知道在这种情况下plugins_loaded是否合适。一个将不得不当正是类是可用的和钩搜索一点。无论如何+1
kaiser

在这种情况下,我要挂接到停用钩子register_deactivation_hook( __FILE__, 'deactivate');。所以我等不及了。我是否可以要求wordpress加载该类(如果尚未加载)?
znat

2
谢谢@kaiser。将WC_Coupon被装入__construct主要的WooCommerce类(真的includes()方法,通过直接调用__construct)和WooCommerce类instanziate(如单身),一旦插件加载。所以plugins_loaded在这种情况下适当挂钩;)
gmazzap

在核心加载之前是匿名的?干得好,干得好。
kaiser

@NathanZ检查class_exists( 'WC_Coupon' )。还请说明您在停用期间正在使用此功能……本可以节省接听大量电话的时间……
kaiser

6

这为时已晚,但我想分享如何使用woocommerce及其类,而不会发现错误类。

首先是检查是否已安装woocommerce并使用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 
    });

}

我希望这可以帮助别人。


3

正确的方法是:

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

最好在使用类之前检查类是否存在,如果插件被禁用,则可以避免致命错误。

您不能重新声明PHP中不允许的类。

您还可以扩展class:

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

但是在大多数情况下,在这种情况下,使用WooCommerce,您最好在处理该工作的文档中找到一个钩子。


1
如果通过钩子扩展类,新类是否仅存在于函数钩子的范围内?
alexg
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.