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

时间:2013-08-19 作者:znat

我正在开发Wordpress Woocommerce插件。在我的本地环境中,它工作得很好,但我在将插件添加到prod环境的副本时遇到了问题。我是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\\U优惠券类的文件,但随后错误变为

Fatal error: Cannot redeclare class WC_Coupon
那么,使用另一个插件中声明的类的正确方法是什么呢?

注意:升级目前不是一个选项。

3 个回复
最合适的回答,由SO网友:gmazzap 整理而成

您必须检查该类是否存在,但在此之前,您必须等待所有插件都已加载:没有人可以确保您的插件在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\')
    );
}

SO网友:jameshwart lopez

这已经太晚了,但我想分享如何使用woocommerce及其类,而不必找不到错误类。

首先是检查woocommerce is installed 并使用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 
    });

}
我希望这对某人有所帮助。

SO网友:JMau

正确的方法是:

 if( class_exists(\'WC_Coupon\') ) $coupon = new WC_Coupon($some_code);
最好在使用前检查类是否存在,如果插件被禁用,则可以避免致命错误。

你不能重新声明一个类,这在PHP中是不允许的。

您还可以扩展类:

class My_WC_Coupon extends WC_Coupon {
   //some code
   //some hook
}
但大多数时候,在这种情况下,你最好在WooCommerce中找到一个诱饵documentation 这会处理好这项工作的。

结束

相关推荐

Control Loop Within Loop

我试图控制一个循环中的一个循环。我想做的是显示所有帖子,并每3篇帖子插入一个自定义帖子类型。所以它会像这样“后CPT后CPT后CPT后CPT…”我是这样做的global $loop_counter; $loop_counter = 0; if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> ?> // DO STUFF <?php $loop_counter+