¿Cómo puedo agregar un filtro solo a la instancia de clase?

4

Tengo una clase personalizada que uso para varios casos, extendiéndola, por ejemplo

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

Ahora, creo instancias de Clase B y C:

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

Al mostrar las cosas de $b , con

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

Al mostrar las cosas de la instancia $c donde no agregué ningún filtro, obtengo el mismo, ya que el filtro agregado por la instancia $b es 'global':

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

Pero Me gustaría tomar el café y el té , ya que no agregué el filtro dentro de la clase C. ¿Debo agregar la instancia en sí al agregar el filtro y luego verificar $this ? ¿O hay otro (mejor) enfoque?

    
pregunta uruk 27.10.2014 - 12:25

1 respuesta

5

El problema es que los filtros en WordPress son globales; si agrega un filtro en alguna parte, este persiste en todas partes, a menos que lo elimine.

También considere que debería preferir composición sobre herencia , y si su estructura de aplicación actual ya está basada en la herencia, y no puedes o no quieres cambiarlo, debes evitar al menos usar filtros para cosas que no son globales.

Al separar la lógica que devuelve datos de la lógica que la filtra, todo se vuelve mucho más 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 puedes adivinar:

$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 los resultados pasan por el filtro "yet_another_filter" , lo que permite que el código externo sobrescriba los resultados en todos los casos, que es para lo que está diseñado un filtro.

    
respondido por el gmazzap 27.10.2014 - 14:28

Lea otras preguntas en las etiquetas