私は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
それでは、別のプラグインで宣言されたクラスを使用するための適切な方法は何ですか?
注:現時点ではアップグレードはオプションではありません。
クラスが存在するかどうかをチェックする必要がありますが、その前に 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')
);
}
これは手遅れですが、エラークラスが見つからないことなしに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
});
}
これが誰かに役立つことを願っています。
正しい方法は次のとおりです。
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 にフックを見つけたほうがよいでしょう。