En mi functions.php
archivo, me gustaría eliminar el filtro a continuación, pero no estoy seguro de cómo hacerlo, ya que está en una clase. ¿Cómo debería remove_filter()
ser?
add_filter('comments_array',array( &$this, 'FbComments' ));
Está en la línea 88 aquí .
&
de su&$this
, es una cosa de PHP 4Respuestas:
Esa es una muy buena pregunta. Se reduce al corazón oscuro de la API del complemento y las mejores prácticas de programación.
Para la siguiente respuesta, creé un complemento simple para ilustrar el problema con un código fácil de leer.
Ahora vemos esto:
WordPress necesita un nombre para el filtro. No proporcionamos uno, por lo que WordPress llama
_wp_filter_build_unique_id()
y crea uno. Este nombre no es predecible porque lo usaspl_object_hash()
.Si ejecutamos un
var_export()
encendido$GLOBALS['wp_filter'][ 'wp_footer' ]
, obtenemos algo como esto ahora:Para encontrar y eliminar nuestra acción maligna, tenemos que pasar por los filtros asociados para el gancho (una acción es solo un filtro muy simple), verifique si es una matriz y si el objeto es una instancia de la clase. Luego tomamos la prioridad y eliminamos el filtro, sin ver nunca el identificador real .
Bien, pongamos eso en una función:
¿Cuándo llamamos a esta función? No hay forma de saber con certeza cuándo se crea el objeto original. Tal vez a veces antes
'plugins_loaded'
? ¿Quizas mas tarde?Usamos el mismo gancho al que está asociado el objeto y saltamos muy temprano con prioridad
0
. Esa es la única manera de estar realmente seguro. Así es como eliminaríamos el métodoprint_message_3()
:Resultado:
Y eso debería eliminar la acción de su pregunta (no probada):
Conclusión
'plugins_loaded'
. No solo cuando WordPress llama a tu complemento.fuente
plugins_loaded
se llama, que es exactamente para lo queplugins_loaded
sirve. Por supuesto, la instancia de clase aún debe ser accesible, posiblemente a través de un patrón singleton.remove_action()
No estoy seguro, pero puedes intentar usar un singleton.
Debe almacenar la referencia del objeto en una propiedad estática de su clase y luego devolver esa variable estática de un método estático. Algo como esto:
fuente
Siempre que conozca el objeto (y use PHP 5.2 o superior; la versión PHP estable actual es 5.5, 5.4 todavía es compatible, 5.3 es el final de la vida útil), puede eliminarlo con el
remove_filter()
método. Todo lo que necesita recordar es el objeto, el nombre del método y la prioridad (si se usa):Sin embargo, cometes un pequeño error en tu código. No coloque
$this
el prefijo con el ampersand&
, eso era necesario en PHP 4 (!) Y está retrasado desde hace mucho tiempo. Esto puede hacer que lidiar con tus ganchos sea problemático, así que déjalo de lado:Y eso es.
fuente
$this
desde el exterior (otro complemento / tema).