別のプラグインで宣言されたクラスの使用方法は?


10

Wordpress Woocommerceプラグインを開発しています。私のローカル環境では問題なく動作しますが、プラグインを製品環境のレプリカに追加するときに問題があります。私はワードプレスに不慣れで、ウェブ開発にあまり詳しくありません(私は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

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

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

回答:


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
カイザー

この特定のケースでは、私は非アクティブ化フックにフックしていregister_deactivation_hook( __FILE__, 'deactivate');ます。待ちきれません。まだロードされていない場合、クラスをロードするようにワードプレスに要求できますか?
znat 2013

2
@kaiserに感謝します。WC_Couponロードされる__constructメインのWooCommerceクラス(実際でincludes()直接によって呼び出されるメソッド__constructと)WooCommerceクラスすぐにプラグインがロードされると(シングルトンなど)instanziateです。したがってplugins_loaded、この場合は適切なフックです;)
gmazzap

コアがロードされる前に匿名ですか?よくやったウー、よくやった。
カイザー2013

@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 My_WC_Coupon extends WC_Coupon {
   //some code
   //some hook
}

しかし、ほとんどの場合、この場合WooCommerceでは、ジョブを処理するドキュメントのフックを見つけた方がよいでしょう。


1
フックを介してクラスを拡張する場合、新しいクラスは関数フックのスコープにのみ存在しませんか?
alexg
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.