我试图重写一个方法(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\' );