ফাংশন.এফপি-তে প্লাগইন ক্লাসের মধ্যে ঘোষিত কোনও ফাংশন কীভাবে আমি প্রতিস্থাপন করব?


9

আমি একটি প্লাগইনে একটি ফাংশন পরিবর্তন করতে চাই। এটি প্লাগইনের মূল ফাইলে এইভাবে ঘোষিত হয়েছে:

class WCPGSK_Main {
  ...
  public function wcpgsk_email_after_order_table($order) {
    ...
  }
}

সেখান থেকে এখানে কল করা যুক্ত করুন:

add_action( 'woocommerce_email_after_order_table', array($this, 'wcpgsk_email_after_order_table') );

আমার ধারণা, ফাংশন.এফপি-তে ক্লাসে অ্যাক্সেস থাকলে এটি প্রতিস্থাপন করা সম্ভব হবে। তাহলে আমি এই জাতীয় কিছু লিখতে সক্ষম হব:

$wcpgsk = new WCPGSK_Main;

remove_action( 'woocommerce_email_after_order_table', array($wcpgsk, 'wcpgsk_email_after_order_table') );

function customized_wcpgsk_email_after_order_table($order) {
  ...
}
add_action( 'woocommerce_email_after_order_table', array($wcpgsk, 'customized_wcpgsk_email_after_order_table') );

ফাংশন.এফপি ফাইলে ক্লাসে অ্যাক্সেস পাওয়ার জন্য আমার চিন্তাভাবনাটি ছিল সেই ফাইলটি অন্তর্ভুক্ত করা যেখানে ক্লাসটি ফাংশন হিসাবে ঘোষণা করা হয়েছে।পিএফপি:

require_once('/wp-content/plugins/woocommerce-poor-guys-swiss-knife/woocommerce-poor-guys-swiss-knife.php');
$wcpgsk = new WCPGSK_Main;
...

তবে এটি কাজ করে না কারণ প্লাগইনটির ফাইলটি অন্তর্ভুক্ত করা হয় যখন ওয়ার্ডপ্রেসে প্লাগইনটি আরম্ভ করা হয় তখন gu

প্লাগইন এর ফাইলগুলি স্পর্শ না করে ফাংশনটি পুনরায় লেখার কোনও উপায় আছে?

উত্তর:


8

এই কাজ করা উচিত:

add_action( 'woocommerce_init', 'remove_wcpgsk_email_order_table' );
function remove_wcpgsk_email_order_table() {

    global $wcpgsk;
    remove_action( 'woocommerce_email_after_order_table', array( $wcpgsk, 'wcpgsk_email_after_order_table' ) );

}

1
একটি অপসারণ কার্যকারিতা রয়েছে: কোডেক্স.ওয়ার্ডপ্রেস.আর.
অ্যালেক্স পুরাতন

হ্যাঁ, আমি এটি মিস করেছি, এই প্লাগইনে একটি পরিবর্তনশীল রয়েছে যা বিশ্বব্যাপী হিসাবে অ্যাক্সেস করতে পারে। আমার বোকামি। আপনার উত্তরের জন্য ধন্যবাদ, এটি এই বিশেষ ক্ষেত্রে (এই প্লাগইনটির জন্য) কাজ করছে।
ইগোর স্কলডিন

অ্যালেক্স ওল্ডার সেই জায়গার সাথে লিঙ্ক করেছেন যা তার উত্তর কেন কাজ করে তা ব্যাখ্যা করে। মুছে ফেলা_অ্যাকশন স্থিতিশীল বা উদাহরণ শ্রেণীর সাথে একটি অ্যারে গ্রহণ করে যার মধ্যে আপনি কোনও পদ্ধতি অপসারণ করতে চান wish
নিনজা08

11

আপনার প্লাগইনটি যদি এভাবে নিবন্ধিত থাকে:

class Test_Class_Parent {
  function __construct() {
    add_action('wp_head',array($this,'test_method'));
  }

  function test_method() {
    echo 'Echoed from the parent';
  }
}
$p = new Test_Class_Parent();

তারপরে আপনি গ্লোবাল অ্যাক্সেসের মাধ্যমে ফিল্টারটি সরাতে সক্ষম হবেন:

class Test_Class_Child extends Test_Class_Parent {
  function __construct() {
    $this->unregister_parent_hook();
    add_action('wp_head',array($this,'test_method'));
  }

  function unregister_parent_hook() {
    global $p;
    remove_action('wp_head',array($p,'test_method'));
  }

  function test_method() {
    echo 'Echoed from the child';
  }
}
$c = new Test_Class_Child();

অন্যথায়, আপনাকে $wp_filter globalনিবন্ধকরণ কীটির জন্য ক্রল করতে হবে :

class Test_Class_Child extends Test_Class_Parent {
  function __construct() {
    $this->unregister_parent_hook();
    add_action('wp_head',array($this,'test_method'));
  }

  function unregister_parent_hook() {
    global $wp_filter;
    if (!empty($wp_filter['wp_head'])) {
      foreach($wp_filter['wp_head'] as $cb) {
        foreach ($cb as $k => $v) {
          if (
            isset($v['function'])
            && is_a($v['function'][0],'Test_Class_Parent')
            && isset($v['function'][1])
            && 'test_method' == $v['function'][1]
          ) {
            remove_action('wp_head',$k);
          }
        }
      }
    }
  }

  function test_method() {
    echo 'Echoed from the child';
  }
}
$c = new Test_Class_Child();

এটি সম্পদ নিবিড় এবং আপনার অন্য কোনও পছন্দ না থাকলে সত্যই করা উচিত নয়।


2
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। এটি আরও সাধারণভাবে কার্যকর এবং কেবল ওপির নির্দিষ্ট ক্ষেত্রে সীমাবদ্ধ নয়।
ডেভিড আর।

1

এই প্লাগইনটি তার আরআইআই ফাংশনটিকে wcpgsk_init()প্লাগেবল করে তোলে , সুতরাং এটির ওভাররাইডের আরেকটি উপায় হ'ল এটি অবশ্যই ব্যবহার-করা প্লাগইন (এটি আপনার থিমের "ফাংশন.এফপি" এর চেয়ে অনেক দেরি হয়ে গেছে) এটিকে সংজ্ঞায়িত করা। সুতরাং আপনি আপনার ওভাররাইডটিকে "ডাব্লুপি-কনটেন্ট / মিউ-প্লাগিনস / ফাংশন.ফপি" এ রাখতে পারেন:

function wcpgsk_init() {
    global $wcpgsk, $wcpgsk_about, $wcpgsk_options, $wcpgsk_session, $wcpgsk_woocommerce_active;    
    //only continue loading
    if ( $wcpgsk_woocommerce_active && version_compare( WOOCOMMERCE_VERSION, "2.0" ) >= 0 ) {
        $FILE = WP_PLUGIN_DIR . '/woocommerce-poor-guys-swiss-knife/woocommerce-poor-guys-swiss-knife.php'; // Fake __FILE__
        $dirname = dirname( $FILE ) . '/';
        $wcpgsk_options = get_option('wcpgsk_settings', true);
        require_once( $dirname . 'classes/woocommerce-poor-guys-swiss-knife.php' );
        require_once( $dirname . 'classes/woocommerce-poor-guys-swiss-knife-about.php' );   
        require_once( $dirname . 'wcpgsk-af.php' );

        if ( !is_admin() ) :
            add_action( 'plugins_loaded', 'wcpgsk_load_wcsession_helper' );
        endif;

        // Your override.
        class My_WCPGSK_Main extends WCPGSK_Main {
            public function wcpgsk_email_after_order_table($order) {
                echo "O la la";
            }
        }
        define( 'WCRGSK_DOMAIN', WCPGSK_DOMAIN ); // Fix typo! (WooCommerce Rich Guys Swiss Knife?)

        //load into our global
        $wcpgsk = new My_WCPGSK_Main( $FILE );
        $wcpgsk->version = '2.2.4'; 
        $wcpgsk->wcpgsk_hook_woocommerce_filters();


    } elseif ( version_compare( WOOCOMMERCE_VERSION, "2.0" ) < 0 ) {
        add_action( 'admin_notices', 'wcpgsk_woocommerce_version_message', 0 ) ;    
        return;
    } else {
        return;
    }
}

তবে ওভাররাইড করার আরও একটি ভাল উপায় হ'ল runkit( https://github.com/padraic/runkit ) ইনস্টল করা এবং তারপরে এটি কেবল আপনার থিমের "ফাংশন.এফপি" এ সরাসরি প্রতিস্থাপন করুন:

add_action( 'init', function () {
    $code = <<<'EOD'
echo "O la la";
EOD;
    runkit_method_redefine(
        'WCPGSK_Main',
        'wcpgsk_email_after_order_table',
        '$order',
        $code,
        RUNKIT_ACC_PUBLIC
    );
} );

(এটি একটি রসিকতা, বিটিডাব্লু।)

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