REMOVE_ACTION:如何访问子类中的方法?

时间:2021-04-12 作者:Dudo1985

我的主插件文件中有:

$main_admin_class = new MainAdminClass();
$main_admin_class->init();
MainAdminClass具有以下代码:

class MainAdminClass {
    public function init() {
        $child_admin = new ChildAdminClass();
        $child_admin->init();
    }
}
最后,子类有以下代码

class ChildAdminClass {
    public function init() {
        add_action(\'admin_notices\', array($this, \'printFoo\'));
        //I know it works if I use \'ChildAdminClass\' instead of $this
    }

    public function printFoo() {
        echo \'fooooooooooooooooooooooooooooo\';
    }
}
稍后我尝试在函数中使用remove\\u操作时。php,使用以下代码:

global $child_admin;
remove_action(\'admin_notices\', array($child_admin, \'printFoo\'));
它不起作用,除非我静态调用该方法。

我知道如果我在MainAdminClass中使用add\\u操作而不是子类,那么它会起作用,但我想知道是否有可能做到这一点。

1 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

你不能。不是你怎么写的。您需要能够访问的实例ChildAdminClass 但它只存在于MainAdminClass 类,并且不会以任何方式暴露。

在试图删除它的代码中,您引用了$child_admin 作为全局变量,但您没有将其创建为全局变量。如果您这样做:

public function init() {
    global $child_admin;

    $child_admin = new ChildAdminClass();
    $child_admin->init();
}
现在这将起作用:

global $child_admin;
remove_action(\'admin_notices\', array($child_admin, \'printFoo\'));
但全局变量并不重要。更好的方法是将对子类实例的引用存储为主类上的属性:

class MainAdminClass {
    public $child_admin;

    public function init() {
        $this->child_admin = new ChildAdminClass();
        $this->child_admin->init();
    }
}
如果这样做,您可以按如下方式删除它:

remove_action(\'admin_notices\', array($main_admin_class->child_admin, \'printFoo\'));
那是假设$main_admin_class 在使用此代码的任何范围内都可用。这就解决了主要问题:要从类实例中删除操作,需要传递该实例。因此,这一切都归结为变量范围,并确保类实例是可访问的,以便可以使用它们删除挂钩。最终,这是一个纯粹的PHP问题,而不是WordPress特有的问题。

相关推荐

WordPress Custom Post Loop

我正在尝试循环浏览自定义WordPress帖子,遇到了一个问题,比如我添加了自定义字段并想在中显示它<li> 使用循环。我成功地完成了操作,但数据/链接/类别正在重复,如果类别与以下内容相同,我希望只显示一次:如果我有2篇带有data1类别的帖子,那么链接将只显示data1once 但我有2个不同类别的帖子,然后它会分别显示每个帖子。Sample Code:<ul class="filter filter-top"> <li cla