Programación

Eliminar un filtro o acción en WordPress sin poder acceder a la clase

En muchas ocasiones desarrollando plugins o temas para WordPress necesitarás desactivar ciertos métodos asociados a algunos hooks. De esta forma podrás desactivar funciones de terceros (de un plugin, de un tema o de un snippet) sin tener que desactivarlo.

Te doy un ejemplo: el tema que estás usando hace algo que no te interesa en un determinado momento (poner un sufijo a los comentarios), que no es desactivable en el panel pero que claro está, no te interesa desactivar el tema al completo.

Si ese método es llamado mediante un hook, a priori puedes pensar que puedes desactivarlo con el método: remove_action( string $hook_name, callable|string|array $callback, int $priority = 10 ). Pero claro, para poder llamar a esta función, el método unido al hook tiene que:

  • Estar declarado como una función directamente fuera de cualquier clase
  • Estar llamado dentro de una clase, pero la clase debe ser accesible

El problema es que por lo general, el objeto en el que se instancia la clase no es visible donde tú puedes añadir código. Así que a priori, la solución no es tan sencilla.

Pero hay una solución, aquí os dejo una función que salva ese problema valiéndose de que todos los filtros, se registran dentro de una variable global (en concreto $GLOBALS[‘wp_filter’]) y que podemos acceder a ella. Aquí tenéis la declaración de la función, básicamente itera por los diferente métodos registrados para un hook y en caso de encontrarlo, lo elimina:

function cod_remove_filters_for_anonymous_class( $hook_name = '', $class_name ='', $method_name = '', $priority = 0 ) {
    foreach( $GLOBALS['wp_filter'][ $hook_name ]->callbacks[ $priority ] as $callback ) {
        if( !is_array( $callback['function'] ) )
            continue;

        if( $callback['function'] && is_a( $callback['function'][0], $class_name ) && $callback['function'][1] == $method_name ) {
            $callable = [ $callback['function'][0], $method_name ];
            $GLOBALS['wp_filter'][$hook_name]->remove_filter( $hook_name, $callable, $priority );
            break;
        }
    }
}

Para usarlo, tendrás que hacer la llamada esta función cuando estés completamente seguro de que el método ha sido registrado, dependerá de cómo se registre pero probablemente usando un hook como wp_loaded lo tendrás disponible.

Un ejemplo de desactivar la llamada de:

  • La función add_category_in_product_listing declarada dentro del objeto de la clase Negan_WooCommerce
  • En el hook woocommerce_shop_loop_item_title
  • Con prioridad 5
add_action( 'wp_loaded', function(){ 
  cod_remove_filters_for_anonymous_class( 'woocommerce_shop_loop_item_title', 'Negan_WooCommerce', 'add_category_in_product_listing', 5 ); } );

Sencillo y seguro que a más de uno le resuelve un problema.

Nota: Hay una valoración incrustada en esta entrada, por favor, visita esta entrada para valorarla.

Almacenamos las IPs desde la que se envían las valoraciones para evitar fraudes

Francisco Javier Carazo Gil

Entradas recientes

RedSys para Contact Form 7 ahora muestra el justificante y el motivo del rechazo en la página de gracias

Ya está disponible la versión 2.2 de Contact Form 7 – Integración con RedSys, y…

hace % días

¿Qué aporta la integración de Bizum y métodos similares en el proceso de pago?

El comercio electrónico español, que se encuentra en pleno crecimiento y transformación, vive actualmente un…

hace % días

Pagos recurrentes en Contact Form 7: suscripciones con RedSys, paso a paso

Hasta ahora, la integración de Contact Form 7 con RedSys solo sabía cobrar pagos únicos:…

hace % días

Cuotas personalizadas con RedSys

El pago fraccionado de RedSys para WooCommerce lleva un tiempo permitiendo dividir el precio de…

hace % días

Contact Form 7 – Integración con RedSys ya habla catalán, gallego y euskera

Ya está disponible la versión 1.24 de Contact Form 7 - Integración con RedSys, y…

hace % días

Calendario de pagos a medida en WooCommerce Subscriptions: cobra en las fechas que tú decidas

Hasta ahora, cobrar una suscripción en WooCommerce significaba aceptar una regla muy simple: eliges un…

hace % días