Es una maldita mala práctica, debo decir. Pasé las últimas dos horas buscando una solución para eliminar acciones y filtros agregados a través de funciones anónimas.
Este es el código utilizado en un tema principal y necesito eliminarlo.
/**
* Add custom columns to admin comments grid
* * Rate that user set.
*/
add_filter( 'manage_edit-comments_columns', function( $default ) {
$columns['smr_comment_rate'] = __( 'Rate', 'txtdmn' );
return array_slice( $default, 0, 3, true ) + $columns + array_slice( $default, 2, NULL, true );
});
Tienes la respuesta de toscho , jugado con él en gran medida, pero sin ayuda. Entonces, ¿hay alguna otra alternativa que elimine las acciones / filtros agregados a través de funciones anónimas?
Gracias
Respuestas:
El problema es que no puede distinguir entre una función anónima y otra, por lo que sí, es posible eliminar un cierre (es decir, una función anónima), pero si más de un cierre actúa sobre el mismo filtro con la misma prioridad, debe elegir , eliminarlos todos, o eliminar solo uno (sin saber exactamente cuál).
Mostraré cómo eliminarlos a todos utilizando una función altamente derivada de la que aparece en la respuesta @toscho que publicó:
Cambié el nombre de la función
remove_object_filter
porque puede eliminar todo tipo de filtros de objetos: métodos de clase estática, métodos de objetos dinámicos y cierres.El
$priority
argumento es opcional, pero cuando se eliminan los cierres, siempre se debe usar, de lo contrario, la función eliminará cualquier cierre agregado al filtro, sin importar en qué prioridad, porque cuando$priority
se omite, todos los filtros que usan la clase / método de destino o el cierre son remoto.Cómo utilizar
fuente
¿Qué pasa si agrega su filtro, con la prioridad 11, para que vaya después? Eso es feo, pero podría funcionar en su caso.
fuente
Los filtros y las acciones anónimas se pueden eliminar de forma nativa utilizando lo siguiente:
Al generar la identificación única utilizando
spl_object_hash()
, las funciones anónimas son comparables entre sí, por lo que no es necesario volver a crear el objeto de cierre completo.Si varios filtros o acciones están conectados a la misma etiqueta con la misma prioridad, eliminará el último filtro o acción que se agregó. Si necesita conservar uno, deberá eliminar todos los filtros hasta el que necesita eliminar y luego volver a agregar los demás según sea necesario.
Esto generalmente regresará a las mejores prácticas. Solo usaré funciones anónimas como parte de un tema personalizado que estoy desarrollando para un cliente, donde no quiero que se sobrescriba o elimine el filtro. En cualquier tema público o complemento que desarrolle, usaré una fábrica para inicializar una clase, agregar todos mis filtros y acciones, luego almacenar la instancia como una variable estática.
fuente