REMOVE_ACTION未从构造函数中删除ADD_ACTION

时间:2015-04-04 作者:Ady

我试图替换一个函数的消息,该函数被woocommerce类的构造函数所钩住。

这是我试图删除的消息:

我所尝试的。

function remove_actions() {
    remove_action( \'product_cat_pre_add_form\', array(   \'WC_Admin_Taxonomies\', \'product_cat_description\' ));
}
add_action( \'plugins_loaded\', \'remove_actions\' );
我还尝试了使用数组中的第一个元素(“WC\\u Admin\\u Taxonomies”),而不是第一个元素new WC_Admin_Taxonomies. 它返回true,但不会删除它,因为实例化会添加动作,所以会删除当前添加的动作。

woocommerce/includes/admin/class wc admin分类法。php-利息部分

class WC_Admin_Taxonomies {
    public function __construct() {
        add_action( \'product_cat_pre_add_form\', array( $this, \'product_cat_description\' ) );
    }

    function product_cat_description() {
        echo wpautop( __( \'Old message\', \'woocommerce\' ) );
    }
}
new WC_Admin_Taxonomies();
这个(\\u new->below)工作正常,添加了新消息,但上面第一个块(remove\\u action)中的代码并没有删除它,所以我最终得到了2条消息。

class WC_Admin_Taxonomies_new {
    public function __construct() {
        add_action( \'product_cat_pre_add_form\', array( $this, \'product_cat_description_new\' ) );
    }

    function product_cat_description_new() {
        echo wpautop( __( \'New Message\', \'woocommerce\' ) );
    }
}
new WC_Admin_Taxonomies_new();
根据科夫谢宁的回答,我试着:

function instantiate_globals() {
    $GLOBALS[\'inst\'] = new WC_Admin_Taxonomies;
}
add_action( \'plugins_loaded\', \'instantiate_globals\');
function remove_actions() {
    remove_action( \'product_cat_pre_add_form\', array(   $GLOBALS[\'inst\'], \'product_cat_description\' )); // var_dump() - outputs true but still not removing it, I believe that filter is the issue.
}
add_action( \'plugins_loaded\', \'remove_actions\');

1 个回复
SO网友:kovshenin

类方法的问题是,除非它们是静态的,否则它们属于一个对象。在您的情况下,您的目标是:

new WC_Admin_Taxonomies_new();
这意味着PHP将创建对象并将其保存在内存中。但不幸的是,由于您没有将此对象指定给变量,因此无法在以后的代码中引用它。

在我脑海中,我可以想出两种方法来解决这个问题:

第一个:全局、单例,可以用来保留对对象的引用以供以后使用:

$GLOBALS[\'foo\'] = new My_Class();
// ...

remove_action( \'action\', array( $GLOBALS[\'foo\'], \'method\' ) );
第二:静态方法。

class My_Class() {
    public static function init() {
        add_action( \'action\', array( __CLASS__, \'method\' ) );
    }

    public static function method() {
        // ...
    }
}
My_Class::init();

// ...

remove_action( \'action\', array( \'My_Class\', \'method\' ) );
希望这有帮助!

结束

相关推荐

排除Plugins.php HTTP安装路径与单个插件的HTTPS的故障

我正在尝试对插件中显示的安装路径进行故障排除。php作为我在自己的网站上安装的插件,我最初并没有编写该插件。当我的站点的其余部分是HTTPS时,此插件引用和安装的所有资源都会显示为混合内容HTTP。我一直在玩弄下面的代码段,但它似乎没有起到什么作用,也没有解决问题。有人能指出我遗漏了什么吗? /** * registers scripts and stylesheets */ public function register_assets() {&