web-dev-qa-db-fra.com

Comment remove_action dans la classe

j'ai cours comme ça

 if (! class_exists ('My_class')) {
 classe My_class {
 public function __construct () {
 add_action ('woocommerce_shop_loop_item_title', array ($ this , 'change_title'), 10); 
} 
 
 fonction publique change_title () {
 echo 'The title'; 
} 
} 
} 
 
 Renvoyer new My_class (); 

J'essaie d'enlever_action change_title en utilisant

 remove_action ('woocommerce_before_shop_loop_item_title', array ('My_class', 'change_title'), 10); 
 // ou 
 remove_action ('woocommerce_before_shop_loop_item_item_title', 10); 
 .]

Mais cela ne fonctionne pas car je ne comprends pas vraiment PHP OOP. Comment puis-je faire cela, est-ce possible?

Et puis-je l'enlever via un plugin?

Merci

2
ttn_

Il n'est pas possible de le supprimer avec remove_action() comme vous l'avez écrit.

Quand vous l'avez accroché ici:

add_action( 'woocommerce_shop_loop_item_title', array( $this, 'change_title' ), 10 );

Le $this signifie que la fonction associée est sur cette instance spécifique de My_class. Lorsque vous utilisez remove_action(), vous devez passer la même instance de la classe:

remove_action( 'woocommerce_before_shop_loop_item_title', array( $instance, 'change_title' ), 10 );

(où $instance est l'instance de la classe).

Le problème est que l'instance de la classe n'est disponible nulle part ailleurs car vous n'avez instancié rien:

return new My_class();

Pour supprimer l'action, vous devez placer l'instance de la classe dans une variable, puis utiliser cette variable pour la supprimer ultérieurement:

$my_class = new My_class();

Puis dans votre autre code:

global $my_class;

remove_action( 'woocommerce_before_shop_loop_item_title', array( $my_class, 'change_title' ), 10 );

Une autre option est que si change_title est static vous n’avez pas besoin d’une instance spécifique de la classe pour l’ajouter et la supprimer des hooks.

Donc, rendez la fonction statique:

public static function change_title() {
    echo 'The title';
}

Ensuite, pour accrocher une méthode statique, procédez comme suit:

add_action( 'woocommerce_shop_loop_item_title', array( 'My_class', 'change_title' ), 10 );

Ce qui signifie que vous pouvez l'enlever comme ceci:

remove_action( 'woocommerce_before_shop_loop_item_title', array( 'My_class', 'change_title' ), 10 );

Mais si votre classe/vos fonctions peuvent ou doivent être statiques est une question architecturale plus vaste qui dépend de ce que vous faites exactement.

8
Jacob Peattie