অন্য প্লাগইনে ঘোষিত ক্লাসগুলি কীভাবে ব্যবহার করবেন?


10

আমি একটি ওয়ার্ডপ্রেস ওয়াহকমার্স প্লাগইন বিকাশ করছি। আমার স্থানীয় পরিবেশে এটি দুর্দান্ত কাজ করে তবে প্রোড পরিবেশের প্রতিরূপে প্লাগইন যুক্ত করার সময় আমার সমস্যা হয়। আমি ওয়ার্ডপ্রেসে নতুন এবং ওয়েব দেবের সাথে খুব পরিচিত না (আমি জাভা প্রোগ্রামার))

প্লাগইন ফাইলে আমি ওওকমার্স প্লাগইন প্যাকেজ থেকে এই জাতীয় ক্লাস ইনস্ট্যান্ট করি:

$coupon = new WC_Coupon($some_code);

স্থানীয় পরিবেশে (পিএইচপি 5.4.10, ওওকমার্স ২.০.১৩, ওয়ার্ডপ্রেস ৩.6) এটি ঠিক আছে। উত্পাদনের পরিবেশে (পিএইচপি 5.4.10, ওওকমার্স 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সঠিক হুক কিনা ook যখন ঠিক সেই ক্লাসটি পাওয়া যায় তখন তার অনুসন্ধান করতে হবে এবং তার পরে হুক ইন করতে হবে। যাইহোক +1
কায়সার

এই বিশেষ ক্ষেত্রে, আমি নিষ্ক্রিয়করণ হুক সংকেত করছি register_deactivation_hook( __FILE__, 'deactivate');। সুতরাং আমি অপেক্ষা করতে পারি না। আমি কি ওয়ার্ডপ্রেসটিকে ক্লাসটি লোড না করতে বলতে পারি যদি এটি এখনও লোড হয় না?
znat

2
ধন্যবাদ @ কাইজার WC_Couponলোড করা হয় __constructপ্রধান WooCommerceশ্রেণী (সত্যিই দ্বারা includes()পদ্ধতি সরাসরি ডাকা __constructএবং) WooCommerceশ্রেণী (Singleton হিসাবে) instanziate তাড়াতাড়ি প্লাগ-ইন লোড করা হয় হয়। তাই plugins_loaded); এই ক্ষেত্রে সঠিক হুক হয়
gmazzap

কোর বোঝার আগে বেনামে? ভাল কাজ, ভাল।
কায়সার

@NathanZ চেক class_exists( 'WC_Coupon' )। এছাড়াও দয়া করে উল্লেখ করুন যে আপনি নিষ্ক্রিয় করার সময় এটি ব্যবহার করছেন ... ভিড়ের অনেক সময় জবাব দিতে পারতেন ...
কায়সার

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);

ক্লাসটি ব্যবহারের আগে উপস্থিত রয়েছে কিনা তা যাচাই করা আরও ভাল, এটি প্লাগইন অক্ষম থাকলে মারাত্মক ত্রুটি এড়ায়।

পিএইচপি-তে এটি অনুমোদিত নয় এমন কোনও শ্রেণি আপনি পুনরায় ঘোষণা করতে পারবেন না।

আপনি ক্লাসও প্রসারিত করতে পারেন:

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

তবে বেশিরভাগ সময় এবং এই ক্ষেত্রে WooCommerce এর সাথে আপনি ডকুমেন্টেশনের একটি হুক খুঁজে পেয়েছেন যা কাজটি পরিচালনা করবে।


1
আপনি যদি হুকের মাধ্যমে আপনার শ্রেণিটি প্রসারিত করেন তবে নতুন ক্লাসটি কেবল ফাংশন হুকের সুযোগেই থাকবে না?
অ্যালেক্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.