print - WordPress: ¿Cómo obtengo todas las funciones registradas para el filtro ''the_content''
wordpress print the content (2)
Este es un ejemplo un poco más avanzado que, además de los datos de $wp_filter
array, mostrará la ruta del archivo al que está conectado el $wp_filter
, así como también la línea en el código donde se define la función.
Para obtener una lista básica de funciones enganchadas a una acción específica (o filtro) es suficiente buscar los elementos de la matriz de filtros, pero dado que las funciones se pueden adjuntar de varias maneras (como método de clase o cierre) esa lista contendrá una tonelada de datos relevantes que incluye objetos presentados como cadenas. Este ejemplo solo mostrará los datos relevantes, en orden de prioridad:
- nombre de la función (dependiendo de la sintaxis de las devoluciones de llamada):
- devolución de llamada a la función:
''function_name''
- método de objeto:
array( $object, ''function_name'' )
- método de clase estática:
array( ''class_name'', ''function_name'' )
y''class_name::function_name''
- cierre:
function() {}
- método relativo de clase estática:
array( ''class_name'', ''parent::function_name'' )
- devolución de llamada a la función:
- Args aceptados
- nombre del archivo
- línea de salida
- carné de identidad
- prioridad
function list_hooks( $hook = '''' ) {
global $wp_filter;
if ( isset( $wp_filter[$hook]->callbacks ) ) {
array_walk( $wp_filter[$hook]->callbacks, function( $callbacks, $priority ) use ( &$hooks ) {
foreach ( $callbacks as $id => $callback )
$hooks[] = array_merge( [ ''id'' => $id, ''priority'' => $priority ], $callback );
});
} else {
return [];
}
foreach( $hooks as &$item ) {
// skip if callback does not exist
if ( !is_callable( $item[''function''] ) ) continue;
// function name as string or static class method eg. ''Foo::Bar''
if ( is_string( $item[''function''] ) ) {
$ref = strpos( $item[''function''], ''::'' ) ? new ReflectionClass( strstr( $item[''function''], ''::'', true ) ) : new ReflectionFunction( $item[''function''] );
$item[''file''] = $ref->getFileName();
$item[''line''] = get_class( $ref ) == ''ReflectionFunction''
? $ref->getStartLine()
: $ref->getMethod( substr( $item[''function''], strpos( $item[''function''], ''::'' ) + 2 ) )->getStartLine();
// array( object, method ), array( string object, method ), array( string object, string ''parent::method'' )
} elseif ( is_array( $item[''function''] ) ) {
$ref = new ReflectionClass( $item[''function''][0] );
// $item[''function''][0] is a reference to existing object
$item[''function''] = array(
is_object( $item[''function''][0] ) ? get_class( $item[''function''][0] ) : $item[''function''][0],
$item[''function''][1]
);
$item[''file''] = $ref->getFileName();
$item[''line''] = strpos( $item[''function''][1], ''::'' )
? $ref->getParentClass()->getMethod( substr( $item[''function''][1], strpos( $item[''function''][1], ''::'' ) + 2 ) )->getStartLine()
: $ref->getMethod( $item[''function''][1] )->getStartLine();
// closures
} elseif ( is_callable( $item[''function''] ) ) {
$ref = new ReflectionFunction( $item[''function''] );
$item[''function''] = get_class( $item[''function''] );
$item[''file''] = $ref->getFileName();
$item[''line''] = $ref->getStartLine();
}
}
return $hooks;
}
Como los ganchos se pueden agregar y eliminar durante todo el tiempo de ejecución, la salida depende de en qué punto se llame a la función (la acción wp_footer
es un buen lugar para obtener la lista completa)
Ejemplo de print_r
para el filtro de contenido:
Array
(
[0] => Array
(
[id] => 000000004c8a4a660000000011808a14run_shortcode
[priority] => 8
[function] => Array
(
[0] => WP_Embed
[1] => run_shortcode
)
[accepted_args] => 1
[file] => C:/xampp/htdocs/wordpress/wp-includes/class-wp-embed.php
[line] => 58
)
[1] => Array
(
[id] => wptexturize
[priority] => 10
[function] => wptexturize
[accepted_args] => 1
[file] => C:/xampp/htdocs/wordpress/wp-includes/formatting.php
[line] => 41
)
[2] => Array
(
[id] => 0000000006c5dc6d0000000064b1bc8e
[priority] => 10
[function] => Closure
[accepted_args] => 1
[file] => C:/xampp/htdocs/wordpress/wp-content/plugins/plugin/plugin.php
[line] => 16
)
.....
Editar: 2017-05-05
- adaptado para la clase
WP_Hook
- prioridad adicional
- corregido: error planteado si la devolución de llamada no existe, aunque WordPress también genera una advertencia para ese
- fixed: hook con la misma identificación pero diferente prioridad sobrescribe la anterior
Tengo una pregunta sobre WordPress, específicamente la versión 3.0 y más reciente.
¿Alguien sabe cómo obtener una matriz o una lista de todas las funciones que se aplicarán o están ''registradas'' en el filtro de contenido?
La idea es generar una lista de casillas de verificación de posibles funciones para eliminar del filtro, como wpautop. Sé cómo eliminar funciones del filtro con etiquetas codificadas, pero espero crear una solución más dinámica.
Si alguien tiene alguna idea, si esto es posible y cómo podría hacerse, estaría muy interesado. Gracias.
Función simple para imprimir desde la matriz de filtros?
function print_filters_for( $hook = '''' ) {
global $wp_filter;
if( empty( $hook ) || !isset( $wp_filter[$hook] ) )
return;
print ''<pre>'';
print_r( $wp_filter[$hook] );
print ''</pre>'';
}
Llámalo donde lo necesites.
print_filters_for( ''the_content'' );