Como posso adicionar um filtro somente à instância de classe?

4

Eu tenho uma classe personalizada que uso em vários casos, por exemplo

class A {
    public function show_things() {
        print_r( apply_filter( 'yet_another_filter', array( 'coffee', 'tea' ) ) );
    }
}

class B extends A {
    public function __construct() {
        parent::__construct();
        add_filter( 'yet_another_filter', array( $this, 'other_things' ) );
    }

    public function other_things( $things ) {
        return array( 'crisps', 'beer' );
    }
}

class C extends A {
    public function __construct() {
        parent::__construct();
        // no filter added here
    }
}

Agora, eu crio instâncias da classe B e C:

$b = new B;
$c = new C;

Ao exibir as coisas de $b , com

$b->show_things(); // gives crisps, beer

Ao exibir as coisas da instância $c em que eu não adicionei nenhum filtro, recebo o mesmo, pois o filtro adicionado pela instância $b é 'global':

$c->show_things(); // gives crisps, beer, which is logical

Mas eu gostaria de obter o café e o chá , já que não adicionei o filtro dentro da classe C. Eu tenho que adicionar a própria instância ao adicionar o filtro e então verificar $this ? Ou existe outra abordagem (melhor)?

    
por uruk 27.10.2014 / 12:25

1 resposta

5

O problema é que os filtros no WordPress são globais; se você adicionar um filtro em algum lugar, ele persistirá em todos os lugares, a menos que você o remova.

Considere também que você deve preferir composição sobre herança , e se sua estrutura de aplicativo atual já é construída sobre herança, e você não pode ou não quer mudá-lo, você deve evitar pelo menos usar filtros para coisas que não são globais.

Ao separar a lógica que retorna dados da lógica que a filtra, tudo fica muito mais fácil:

class A {

    function get_things() {
        return array( 'coffee', 'tea' );
    }

    function show_things() {
        return apply_filter( 'yet_another_filter', $this->get_things() );
    }

}

class B extends A {

    function get_things() {
        return array( 'crisps', 'beer' );
    }

}

class C extends A {

}

Como você pode imaginar:

$a = new A;
$b = new B;
$c = new C;

$a->show_things(); // array( 'coffee', 'tea'  )
$b->show_things(); // array( 'crisps', 'beer'  )
$c->show_things(); // array( 'coffee', 'tea'  )

Todos os resultados passam pelo filtro "yet_another_filter" , permitindo que o código externo sobrescreva os resultados em todos os casos, para o que um filtro é destinado.

    
por gmazzap 27.10.2014 / 14:28