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
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.