如果add_action在wordpress中的抽象类中,如何remove_action

时间:2016-09-08 12:25:01

标签: php wordpress oop wordpress-theming

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

我知道我只需添加remove_action( $tag, $function_to_remove, $priority );即可,但这对我不起作用。

主题是通过这样的抽象类添加add_action

abstract class foo {

   public function __construct() {

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

   }

}

以下是实现上述抽象类的子类:

class bar extends foo {

    public function __contruct() {}

}

new bar();

没有$variable分配给实现此抽象类的子类实例。

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

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

2 个答案:

答案 0 :(得分:2)

呃,创建类实例的方法是完全错误的。有时,您无法以合理的方式处理损坏的代码。但是,我已经看到一些作者在实现getInstance()方法的同时也这样做了。

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

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

如果主题作者完全没有线索,那么仍有最后的手段。您可以在代码库中包含一对函数来克服此编程错误。它可以在这里找到......

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

<强>更新

嗯,我只是抬头看着&#34; wp_edit_nav_menu_walker&#34;钩。它是一个过滤器,而不是一个动作。你的样本有点误导。

我相信使用默认的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 );

答案 1 :(得分:0)

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

如果没有这两个家伙,我无法做到。他们分享了很多信息,这些信息帮助我了解了很多东西的运作方式。

所以我想出了@JoseCarlosRamosCarmenates使用$wp_filter变量的想法,并从他分享的@BA_Webimax's链接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通过再次覆盖钩子来提出正确的答案。

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