Remover eventos del registro

Algo que podemos necesitar mientras desarrollamos nuestras propias extensiones es que ciertas acciones o filtros se dejen de ejecutar. Por ejemplo, podemos querer desactivar alguna funcionalidad nativa de WordPress, o de un plugin de terceros, o que alguna de nuestras acciones o filtros solamente se ejecuten en determinados contextos. Para lograr eso, WordPress nos ofrece cuatro funciones:

  • remove_action()
  • remove_filter()
  • remove_all_actions()
  • remove_all_filters()

Cuando asignamos un filtro o una acción a un evento, WordPress lo guarda en una lista, más específicamente en la variable global $wp_filters, donde también queda el detalle de sus prioridades y la cantidad de argumentos que acepta. Lo que nos permiten estas funciones es remover de esa lista los procesos que necesitemos.

Por ejemplo, supongamos que tenemos dos eventos, una acción y un filtro, y a cada uno de ellos queremos asignarle una función.

<?php
add_action( 'my_action', 'my_action_callback', 10, 1 );

function my_action_callback() {
    echo 'Hello world!';
}

add_filter( 'my_filter', 'my_filter_callback', 10, 1 );

function my_filter_callback( $value ) {
    return 'some other value';
}

do_action( 'my_action' );

$my_value = apply_filters( 'my_filter', 'some value' );

Sin embargo, en algún punto en el futuro vamos a necesitar que esas funciones que asignamos dejen de ejecutarse, pero por las características de nuestra extensión no podemos remover ni las asignaciones ni las declaraciones de funciones. No podemos simplemente remover código. En ese punto es donde necesitamos usar estas nuevas funciones de las que venimos hablando.

<?php
add_action( 'my_action', 'my_action_callback', 20, 1 );

function my_action_callback() {
    echo 'Hello world!';
}

add_filter( 'my_filter', 'my_filter_callback', 20, 1 );

function my_filter_callback( $value ) {
    return 'some other value';
}

remove_action( 'my_action', 'my_action_callback', 20 );
remove_filter( 'my_filter', 'my_filter_callback', 20 );

do_action( 'my_action' );

$my_value = apply_filters( 'my_filter', 'some value' );

De esta manera logramos que las funciones que asignamos previamente con add_action() y add_filter() dejen de ejecutarse.

Para usar correctamente remove_action() y remove_filter() necesitamos tener en cuenta dos cosas. En primer lugar, tienen que ser llamadas después de que los hooks hayan sido asignados, pero antes de que se ejecuten las acciones y filtros. En segundo lugar, ambas funciones reciben un tercer parámetro, que es equivalente a la prioridad con la que se asignaron previamente los hooks que ahora estamos removiendo del registro. Este parámetro no es obligatorio, y su valor por defecto es 10. Si no lo especificamos, tenemos que asegurarnos de que la prioridad del hook también sea 10, o que tampoco esté especificada.

Ahora bien, ¿qué pasa cuando los hooks que queremos remover son métodos de clases? Si tenemos acceso al objeto instanciado de la clase, podemos hacerlo de esta manera, que es la más intuitiva:

<?php
class My_Class {
    public function my_method() {}
}

$obj = new My_Class;

add_action( 'my_action', array( $obj, 'my_method' ) );

remove_action( 'my_action', array( $obj, 'my_method' ) );

do_action( 'my_action' );

En cambio, si en algún momento se deja de tener acceso al objeto (por ejemplo, si el nombre de la variable que lo contiene pasa a ser usado para otra cosa) y el método es estático, puede usarse el nombre de la clase para remover el callback.

<?php
class My_Class {
    public static function my_method() {}
}

$obj = new My_Class;

add_action( 'my_action', array( $obj, 'my_method' ) );

remove_action( 'my_action', array( 'My_Class', 'my_method' ) );

do_action( 'my_action' );

Por último, tenemos las funciones remove_all_actions() y remove_all_filters(). Estas nos permiten remover todos los callbacks que hayan sido asignados a una acción o filtro determinados, sin necesidad de especificar más que el nombre del evento. Por ejemplo, podemos suponer que tenemos dos hooks asignados a una acción y otros dos hooks asignados a un filtro.

<?php
add_action( 'my_action', 'my_action_callback', 10 );
add_action( 'my_action', 'my_other_callback', 20 );

function my_action_callback() {
    echo 'Hello world!';
}

function my_other_action_callback() {
    echo 'Hello again!';
}

add_filter( 'my_filter', 'my_filter_callback', 10, 1 );
add_filter( 'my_filter', 'my_other_filter_callback', 20, 1 );

function my_filter_callback( $value ) {
    return 'some other value';
}

function my_other_filter_callback( $value ) {
    return 'some other different value';
}

do_action( 'my_action' );

$my_value = apply_filters( 'my_filter', 'some value' );

Podemos remover muy fácilmente todos los hooks para cada evento haciendo algo así:

<?php
add_action( 'my_action', 'my_action_callback', 10 );
add_action( 'my_action', 'my_other_callback', 20 );

function my_action_callback() {
    echo 'Hello world!';
}

function my_other_action_callback() {
    echo 'Hello again!';
}

add_filter( 'my_filter', 'my_filter_callback', 10, 1 );
add_filter( 'my_filter', 'my_other_filter_callback', 20, 1 );

function my_filter_callback( $value ) {
    return 'some other value';
}

function my_other_filter_callback( $value ) {
    return 'some other different value';
}

remove_all_actions( 'my_action' );
remove_all_filters( 'my_filter' );

do_action( 'my_action' );

$my_value = apply_filters( 'my_filter', 'some value' );

Tenemos que tener en cuenta que ambas son funciones para usar con mucho cuidado, ya que no es muy común querer remover todos los hooks para un evento. Sin embargo, es bueno saber que contamos con ellas, y suelen ser muy útiles mientras estamos desarrollando nuestras extensiones, particularmente con fines de testing.

results matching ""

    No results matching ""