किसी अन्य प्लगइन में घोषित वर्गों का उपयोग कैसे करें?


10

मैं एक Wordpress Woocommerce प्लगइन विकसित कर रहा हूँ। मेरे स्थानीय परिवेश में यह ठीक काम करता है लेकिन मुझे प्रॉब्लम होती है जब प्लगइन को ठंढे वातावरण की प्रतिकृति में जोड़ देता हूँ। मैं वर्डप्रेस के लिए नया हूं और वेब देव (मैं एक जावा प्रोग्रामर हूं) से बहुत परिचित नहीं हूं।

प्लगइन फ़ाइल में, मैं इस तरह से Woocommerce प्लगइन पैकेज से एक वर्ग को तुरंत लिखता हूं:

$coupon = new WC_Coupon($some_code);

स्थानीय वातावरण में (php 5.4.10, Woocommerce 2.0.13, वर्डप्रेस 3.6) यह ठीक है। उत्पादन वातावरण में (php 5.4.10, Woocommerce 1.6.5.2, वर्डप्रेस 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
kaiser

इस विशेष मामले में, मैं डिएक्टिवेशन हुक को हुक कर रहा हूं register_deactivation_hook( __FILE__, 'deactivate');। इसलिए मैं इंतजार नहीं कर सकता। क्या मैं वर्ग लोड करने के लिए वर्डप्रेस पूछ सकता हूं यदि यह अभी तक लोड नहीं हुआ है?
ज़न्नत

2
साभार @kaiser WC_Couponद्वारा लोड किया जाता है __constructमुख्य के WooCommerceवर्ग (वास्तव में से includes()विधि सीधे से बुलाया __constructऔर) WooCommerceवर्ग (सिंगलटन के रूप में) instanziate ही प्लगइन लोड किया जाता है के रूप में है। तो plugins_loaded), इस मामले में उचित हुक है
gmazzap

कोर लोड से पहले बेनामी? अच्छा किया वू, अच्छा किया।
kaiser

@ नथनज चैक class_exists( 'WC_Coupon' )। कृपया यह भी बताएं कि आप इसे निष्क्रिय करने के दौरान उपयोग कर रहे हैं ... समय की भीड़ टन का जवाब देने से बचा सकता था ...
kaiser

6

यह बहुत देर हो चुकी है लेकिन मैं साझा करना चाहूंगा कि बिना त्रुटि वर्ग पाए वूकोमर्स और उसकी कक्षाओं का उपयोग कैसे किया जाए।

पहले यह जांचना है कि क्या 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 में अनुमति नहीं है एक वर्ग redeclare कर सकते हैं।

आप वर्ग का विस्तार भी कर सकते हैं:

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

लेकिन ज्यादातर समय और WooCommerce के साथ इस मामले में आप बेहतर ढंग से प्रलेखन में एक हुक पाएंगे जो काम को संभालेंगे।


1
यदि आप हुक के माध्यम से अपनी कक्षा का विस्तार करते हैं, तो क्या नया वर्ग केवल फ़ंक्शन हुक के दायरे में मौजूद नहीं होगा?
एलेक्स डिग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.