如何 remove_action 如果 add_action 在 wordpress 中是抽象的 class

How to remove_action if add_action is in abstract class in wordpress

我正在开发 WordPress 插件,我需要删除激活的主题正在添加的操作。

我知道我可以简单地添加 remove_action( $tag, $function_to_remove, $priority ); 但这对我不起作用。

主题是通过抽象 class 添加 add_action 像这样:

abstract class foo {

   public function __construct() {

      add_action('wp_edit_nav_menu_walker', array(&$this, 'wp_edit_nav_menu_walker_custom', 10));

   }

}

这里是实现上述抽象[=​​37=]的子class:

class bar extends foo {

    public function __contruct() {}

}

new bar();

并且没有$variable分配给实现这个抽象class的子实例class。

所以我想通过我的插件删除此操作但不确定如何?

我的插件也是基于 OOP 的。因此,我们将不胜感激任何帮助或建议

呃,那个创建class实例的方法是完全错误的。有时您不能以合理的方式处理损坏的代码。但是,我看到一些作者在执行此操作的同时还实现了 getInstance() 方法。

如果您正在使用的 class 包含类似的方法,您可以执行类似

的操作
remove_action( 'wp_edit_nav_menu_walker', array( bar::getInstance(), 'wp_edit_nav_menu_walker_custom' ), 10 );

如果主题作者完全没有头绪,那还有最后一招。有一对函数可以包含在您的代码库中以克服此编程错误。可以在这里找到...

https://github.com/herewithme/wp-filters-extras/

更新:

嗯,我刚刚查看了 "wp_edit_nav_menu_walker" 钩子。这是一个过滤器而不是一个动作。您的示例有点误导。

我相信像这样用默认的 Walker Class 覆盖过滤器会更容易。确保优先级高于主题中的优先级。您还需要修改下面的代码才能在您的 OOP 插件中工作。

function restore_edit_walker( $walker, $menu_id ) 
{
    return 'Walker_Nav_Menu_Edit';
}
add_filter( 'wp_edit_nav_menu_walker', 'restore_edit_walker', 11, 2 );

好的,经过与 @BA_Webimax and @JoseCarlosRamosCarmenates 的长时间讨论和数小时的测试后,我找到了一个简单的解决方案。

没有这两个家伙我做不到。他们分享了很多信息,帮助我了解了很多东西是如何工作的。

所以我想出了使用 $wp_filter 变量的想法,他在他的答案中分享了 @JoseCarlosRamosCarmenates and get some basic understanding of how to use it from @BA_Webimax's link WP Filters Extras 和一个简单的钩子 after_setup_theme ,我的美女与我分享了老婆:p

让我们把所有东西放在一起:

function custom_remove_action() {
    global $wp_filter;

    foreach ( $wp_filter['wp_edit_nav_menu_walker'][10] as $key => $value ) {

        // Check the hook if its the one we want to remove
        if ( $value['function'][1] == 'wp_edit_nav_menu_walker_custom' ) {
            unset($wp_filter['wp_edit_nav_menu_walker'][10][$key]);
        }

    }
}

add_action('after_setup_theme', 'custom_remove_action');

但似乎 @BA_Webimax 通过再次覆盖钩子得出了正确的答案。

如果有人想这样做,请分享我的:)