web-dev-qa-db-fra.com

Supprimer une action au sein d'une classe dans un thème parent du thème enfant

Je souhaite ajouter du code à mon thème enfant pour supprimer une action définie dans le thème parent.

L'action est:

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

C'est dans une classe 'Electro_WC_Helper'.

J'ai essayé:

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

Ce qui n'a pas fonctionné, alors j'ai pensé que c'était probablement parce que les fonctions enfants se déclenchaient avant le parent, alors j'ai ajouté ceci:

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 );

}

Ce qui ne fonctionne pas non plus.

Comment supprimer l'action?

1
Steveo

Pour supprimer une action ou un filtre, le nom de la fonction/méthode et la priorité doivent correspondre à l'action/au filtre ajouté précédemment. L'action que vous souhaitez supprimer est ajoutée avec une priorité de 10 (valeur par défaut) lorsque vous essayez de supprimer l'action avec une priorité de 99.

Essaye ça:

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 );

De plus, le fichier functions.php du thème enfant est chargé avant le fichier functions.php du thème parent. L'exécution de la fonction remove_action() dans le thème enfant doit donc être différée à l'aide d'un crochet d'action car elle doit attendre que le thème parent ajoute l'action que nous voulons supprimer. admin_head est une action qui ne se produit que du côté de l’administrateur et qui n’est pas associée à des thèmes; elle ne se déclenche donc pas au premier plan. Vous devez utiliser une action appropriée, qui dépend de la précision avec laquelle le thème parent ajoute l'événement action. En règle générale, vous devez utiliser after_setup_theme avec une priorité élevée:

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