2016-09-08 16 views
2

我正在研究一個WordPress插件,並且需要刪除激活的主題添加的操作。如果add_action在wordpress中的抽象類中如何remove_action

我知道我可以簡單地添加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

你需要找到分配對實現該抽象類子類的實例變量

共享我的。希望它可以在插件中訪問。您可能需要嘗試使其成爲全球。 –

+0

如果沒有變量分配給該類,該怎麼辦? – Omer

+0

請嘗試把優先>>到2000'remove_action($ tag,$ function_to_remove,2001);' –

回答

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/

更新:

嗯,我只是看着了 「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); 
+0

沒有出現像'沒有的getInstance()方法'在類:( – Omer

+0

我想你必須去抓住那些功能呢。他們的工作,他們只是有點大錘的,不應該是必要的具有良好編碼實踐。 –

+1

好吧抓住這些功能,他們的作品在主題的function.php罰款,但是當我把我的插件的文件,這是行不通的。我還檢查了正在使用由@JoseCarlosRamosCarmenate對我的問題中提到的相同的技術,這些功能。它檢查'$ wp_filter'變量和取消針對集。但我從主題和插件以'的print_r()檢查'$'wp_filter'其數據是在這兩個場景中的不同。 – Omer

0

好後@BA_Webimax@JoseCarlosRamosCarmenates和小時的測試很長的討論中,我發現了一個簡單的解決方案。

如果沒有這兩個人,我無法做到。他們分享了很多信息,這些信息幫助我理解了這些東西如何運作。

所以我就想出了利用$wp_filter變量由@JoseCarlosRamosCarmenates,並得到了如何從@BA_Webimax's鏈接WP Filters Extras使用它的一些基本的瞭解的想法,他在他的回答共享和簡單的鉤after_setup_theme這是由與我分享我的美麗的妻子:對

讓我們把一切融合在一起:

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想出了正確的答案通過重寫浩好的。如果有人想這樣做這樣:)