Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如果add_操作在wordpress的抽象类中,如何删除_操作_Php_Wordpress_Oop_Wordpress Theming - Fatal编程技术网

Php 如果add_操作在wordpress的抽象类中,如何删除_操作

Php 如果add_操作在wordpress的抽象类中,如何删除_操作,php,wordpress,oop,wordpress-theming,Php,Wordpress,Oop,Wordpress Theming,我正在开发一个WordPress插件,我需要删除激活主题正在添加的一个操作 我知道我可以简单地添加remove\u操作($tag,$function\u to\u remove,$priority)但这对我不起作用 主题通过如下抽象类添加add\u action: abstract class foo { public function __construct() { add_action('wp_edit_nav_menu_walker', array(&$thi

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

我知道我可以简单地添加
remove\u操作($tag,$function\u to\u remove,$priority)但这对我不起作用

主题通过如下抽象类添加
add\u 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();
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');
下面是实现上述抽象类的子类:

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();
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');
并且没有
$variable
分配给实现这个抽象类的子类的实例

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


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

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

如果正在使用的类包含这样的方法,则可以执行以下操作

remove_action( 'wp_edit_nav_menu_walker', array( bar::getInstance(), 'wp_edit_nav_menu_walker_custom' ), 10 );
如果主题作者完全没有线索,那么还有最后一个办法。有一对函数可以包含在代码库中以克服此编程错误。可以在这里找到

更新:

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();
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');
嗯,我刚查了一下“wp_edit_nav_menu_walker”钩子。这是一个过滤器,不是一个动作。你的样品有点误导人

我相信这样用默认的Walker类重写过滤器会更容易。确保优先级高于主题中的优先级。您还需要修改下面的代码才能使用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 );

好的,经过长时间的讨论和数小时的测试,我找到了一个简单的解决方案

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

所以我刚刚想到了使用变量的想法,并从他在回答中分享的链接和我美丽的妻子与我分享的设置主题后的一个简单的钩子中,对如何使用变量有了一些基本的了解:p

让我们把一切都放在一起:

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();
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');
但似乎通过再次推翻钩子找到了正确的答案


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

您需要找到分配给实现该抽象类的子类实例的变量。希望它可以在插件中访问。您可能需要尝试将其设置为全局。如果没有为该类分配变量,该怎么办?请尝试将优先级>设置为2000
remove\u操作($tag,$function\u to\u remove,2001)
@JoseCarlosRamosCarmenates不起作用:(global$wp\u filter;在这种情况下,var保存了所有的过滤器和操作,您可以使用wp\u edit\u nav\u菜单进行搜索,并获得真正的类/objectNo该类中没有类似于
getInstance()
的方法:(我想你必须去抓取那些函数。它们可以工作,它们只是一把大锤,对于良好的编码实践来说应该不是必需的。好的,抓取了那些函数,它们在theme的function.php中工作得很好,但是当我放入插件文件时,它不起作用。我还检查了那些使用相同技术的函数@JoseCarlosRamosCarmenate对我的问题进行了检查。它检查
$wp_filter
变量和未设置的目标集。但我检查了
$wp_filter
主题和带有
print_r()的插件中的
$wp_filter
它的数据在这两种情况下都是不同的。插件在主题之前加载。因此这些操作还没有被添加到移除。尝试包装你的
移除\u操作()
调用一个钩子,在主题加载之后加载,就像
wp\u加载的
。是的,我可以看到它是一个过滤器…但它仍然在运行。这可能吗?