web-dev-qa-db-ja.com

クラス内のアクションフックを削除する

次のようなクラス宣言があります。

class stachethemes_ec_main extends stachethemes\event_calendar\stachethemes_main_template {

そしてアクションフックを持つ以下の関数:

public function add_event_tab($slug, $title, $icon, $content = "", $file = false) {

        add_action('stachethemes_ec_add_event_tab', function() use($slug, $title, $icon) {
          if ($slug != "woocommerce") :
            echo "<li data-tab='stec-layout-event-inner-{$slug}'><i class='{$icon}'></i><p>{$title}</p></li>";
          endif;
        });

        add_action('stachethemes_ec_add_event_tab_content', function() use($slug, $content, $file) {

次のstachethemes_ec_add_event_tab_contentを使ってremove_actionアクションフックを削除します。

add_action('stachethemes_ec_add_event_tab_content','custom_stachethemes_tab_content');
function custom_stachethemes_tab_content(){
  remove_action('stachethemes_ec_add_event_tab_content',array('stachethemes_ec_main', 'add_event_tab'));
}

うまくいかないので、私は何か悪いことをしていますか?

私はまた、以下のアプローチを試しました:

add_action('stachethemes_ec_add_event_tab_content','custom_stachethemes_tab_content', 20);
function custom_stachethemes_tab_content(){
  global $stachethemes;
  $stachethemes = stachethemes_ec_main::get_instance();
  remove_all_actions('stachethemes_ec_add_event_tab_content',array($stachethemes, 'add_event_tab'));
}

しかしどちらも動作していません!

1
deyan4

あなたはあなたの行動に 優先度を指定していないので 、それらは発生した順番で実行されます。そのため、あなたのremove_actionは、同じフックに結び付けられたアクションが既に実行された後に非常にうまく実行されるかもしれません。これを解決するには、次のように削除を行うアクションに高い優先順位を付けます。

add_action('stachethemes_ec_add_event_tab_content','custom_stachethemes_tab_content',20,0);

remove_actionはフック自体を削除しないことにも注意してください。そのフックにバインドされている指定されたアクションを削除するだけです。後で別のアクションがそのフックに関連付けられている場合は、それが実行されます。

1
cjbj