Como remover a ação dentro da classe [duplicata]

2

eu tenho classe assim

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

Estou tentando remover_aço 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 );

Mas isso não funciona porque eu realmente não entendo PHP OOP. Como posso fazer isso, é possível?

E posso removê-lo por meio de um plug-in?

Obrigado

    
por ttn_ 17.08.2018 / 06:37

1 resposta

8

Não é possível removê-lo com remove_action() da maneira como você o escreveu.

Quando você conectou aqui:

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

O $this significa que a função que está conectada está nesta instância específica de My_class . Ao usar remove_action() , você precisa passar a mesma instância da classe:

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

(onde $instance é a instância da classe).

O problema é que a instância da classe não está disponível em nenhum outro lugar porque você instanciou em nada:

return new My_class();

Para remover a ação, você precisa colocar a instância da classe em uma variável e, em seguida, usar essa variável para removê-la mais tarde:

$my_class = new My_class();

Em seguida, no seu outro código:

global $my_class;

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

Outra opção é que, se change_title estático , você não precisar de um instância específica da classe para adicionar e remover de ganchos.

Portanto, torne a função estática:

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

Depois, para ligar um método estático, você faz isso:

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

O que significa que você pode removê-lo assim:

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

Mas se sua classe / funções pode ou deve ser estática é uma questão arquitetônica maior que dependeria exatamente do que você está fazendo.

    
por Jacob Peattie 17.08.2018 / 07:24