web-dev-qa-db-ja.com

子テーマから親テーマのクラス内のアクセスを削除する

親テーマに設定されているアクションを削除するために、子テーマにコードを追加したいです。

アクションは以下のとおりです。

add_action( 'woocommerce_product_options_inventory_product_data', array( 'Electro_WC_Helper', 'product_options_inventory_product_data' ) );

それはクラス 'Electro_WC_Helper'の中にあります。

私が試してみました:

remove_action( 'woocommerce_product_options_inventory_product_data', array( 'Electro_WC_Helper', 'product_options_inventory_product_data' ), 99 );

これはうまくいきませんでしたので、これはおそらく子関数が親の前に起動しているためだと思いました。

add_action( 'admin_head', 'test_function', 99 );

function test_function() {

    echo 'test543';

    remove_action( 'woocommerce_product_options_inventory_product_data', array( Electro_WC_Helper, 'product_options_inventory_product_data' ), 99 );

}

これもうまくいきません。

アクションを削除する方法

1
Steveo

アクションまたはフィルタを削除するには、関数/メソッド名と優先順位が以前に追加されたアクション/フィルタと一致している必要があります。優先順位10でアクションを削除しようとしている間に、削除したいアクションが優先順位99(デフォルト値)で追加されます。

これを試して:

remove_action( 'woocommerce_product_options_inventory_product_data', array( 'Electro_WC_Helper', 'product_options_inventory_product_data' ) );
// It is the same that:
// remove_action( 'woocommerce_product_options_inventory_product_data', array( 'Electro_WC_Helper', 'product_options_inventory_product_data' ), 10 );

また、子テーマからのfunctions.phpファイルは親テーマからのfunctions.phpファイルの前にロードされるので、子テーマでのremove_action()関数の実行は何らかのアクションフックを使用して延期する必要があります。削除したいアクションadmin_headは、管理者側でのみ発生し、テーマとは関連付けられていないアクションなので、フロントエンドではトリガーされません。適切なアクションを使用する必要があります。これは、親テーマがアクションイベントを追加している程度によって異なります。通常はafter_setup_themeを高い優先度で使用する必要があります。

add_action( 'after_setup_theme', 'cyb_remove_parent_theme_action', 0 );
function cyb_remove_parent_theme_action() {
    remove_action( 'woocommerce_product_options_inventory_product_data', array( 'Electro_WC_Helper', 'product_options_inventory_product_data' ) );
}
3
cybmeta