Cómo eliminar_acción dentro de la clase [duplicar]

2

Tengo clase como esta

if ( ! class_exists( 'My_class' ) ) {
    class My_class {
        public function __construct() {
            add_action( 'woocommerce_shop_loop_item_title', array( $this, 'change_title' ), 10 );
        }

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

return new My_class();

Estoy intentando eliminar_acción change_title usando

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

Pero no funciona porque realmente no entiendo PHP OOP. ¿Cómo puedo hacer eso, es posible?

¿Y puedo eliminarlo a través de un complemento?

Gracias

    
pregunta ttn_ 17.08.2018 - 06:37

1 respuesta

8

No es posible eliminarlo con remove_action() de la forma en que lo has escrito.

Cuando lo conectaste aquí:

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

El $this significa que la función que está enganchada está en esta instancia específica de My_class . Cuando utilice remove_action() , debe pasar la misma instancia de la clase:

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

(donde $instance es la instancia de la clase).

El problema es que la instancia de la clase no está disponible en ningún otro lugar porque no has creado ninguna instancia:

return new My_class();

Para eliminar la acción, debe colocar la instancia de la clase en una variable y luego usarla para eliminarla más adelante:

$my_class = new My_class();

Luego en tu otro código:

global $my_class;

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

Otra opción es que si change_title es static , entonces no necesita una instancia específica de la clase para agregarla y eliminarla de los enganches.

Así que haz la función estática:

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

Luego, para enganchar un método estático, debes hacer esto:

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

Lo que significa que puedes eliminarlo de esta manera:

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

Pero si su clase / funciones pueden o deben ser estáticas es una pregunta arquitectónica más amplia que dependerá de lo que esté haciendo exactamente.

    
respondido por el Jacob Peattie 17.08.2018 - 07:24

Lea otras preguntas en las etiquetas