通过扩展类并替换它来删除操作

时间:2018-11-12 作者:richerimage

我试图重写一个方法(my_packages) 从WP Job Manager Paid Listings 通过在自定义插件中扩展其类来实现插件

下面是如何设置源代码(无相关代码删除)的。。。

class WC_Paid_Listings_Orders {

  private static $instance;

  public static function get_instance() {

      return null === self::$instance ? ( self::$instance = new self ) : self::$instance;
  }

  public function __construct() {

    add_action( \'woocommerce_before_my_account\', array( $this, \'my_packages\' ) );

  }

  public function my_packages() {

    // This is what I want to unhook

  }

}
我如何“脱钩”my_packages? 这就是我到目前为止所做的(并且失败了)!我猜这和这个例子有关?我从这里的例子中尝试了各种迭代,但都没有用——恐怕是在我知识的边缘操作。

class cvl_override_defaults extends WC_Paid_Listings_Orders {

   public function __construct() {

    remove_action(\'woocommerce_before_my_account\', array( $this, \'my_packages\'));

    add_action( \'woocommerce_before_my_account\', array( $this, \'new_my_packages\' ) );

   }

   public function new_my_packages() {

     // New output goes in here

   }

}
TIA!

2 个回复
最合适的回答,由SO网友:Krzysiek Dróżdż 整理而成

问题在于这一行:

remove_action(\'woocommerce_before_my_account\', array( $this, \'my_packages\'));
这不会删除父类注册的操作,因为$this 在本例中是另一个对象,因此您根本不会删除任何操作。

那么,如何消除这种行为呢?因为您无法访问相同的$this 在类中,您必须遍历所有过滤器并手动删除给定的过滤器。

下面是一个很好的示例:

https://wordpress.stackexchange.com/a/239431/34172

SO网友:Jacob Peattie

使用类的特定实例添加操作时(当您看到$this), 要删除操作,需要将类的相同实例传递给remove_action().

自从WC_Paid_Listings_Orders 是一个单例(看起来),该类只有一个实例,您可以使用get_instance() 方法然后可以使用该实例删除该操作。

$wc_paid_listings_orders = WC_Paid_Listings_Orders::get_instance();
remove_action( $wc_paid_listings_orders, \'my_packages\' );

结束

相关推荐

使用Add_Filters()、Apply_Filter()、Add_action()和do_action()扩展插件

假设我正在开发一个与预订相关的插件。下次我想在那个插件上添加一个附加组件来支付。然后,我为贝宝支付添加了另一个附加组件。假设下面是html中的支付网关UI界面<div class=\"payments-options\"> <div class=\"bank-payment\"></div> <div class=\"cash-on-delivery\"></div> <!--- Here i