我试图重写一个方法(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!
 
                    最合适的回答,由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\' );