web-dev-qa-db-ja.com

別のプラグインで宣言されたクラスを使用する方法

私はWordpressのWoocommerceプラグインを開発しています。私のローカル環境ではうまくいきますが、prod環境のレプリカにプラグインを追加するときに問題があります。私はワードプレスに慣れていないし、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

それでは、別のプラグインで宣言されたクラスを使用するための適切な方法は何ですか?

注:現時点ではアップグレードはオプションではありません。

9
znat

クラスが存在するかどうかをチェックする必要がありますが、その前に wait すべてのプラグインがロードされていることを確認する必要があります。

すべてのプラグインが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')
    );
}
9
gmazzap

これは手遅れですが、エラークラスが見つからないことなしに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 
    });

}

これが誰かに役立つことを願っています。

5

正しい方法は次のとおりです。

 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 にフックを見つけたほうがよいでしょう。

3
JMau