我正在使用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
。因此,任何帮助或建议将不胜感激
答案 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通过再次覆盖钩子来提出正确的答案。
如果有人想这样做,请分享我的:)