Esto es un poco más ejemplo avanzado, que voluntad, además de los datos de $wp_filter
array, muestra la ruta del archivo al que está unido el gancho, así como la línea en código donde se define la función de .
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á toneladas de datos relevantes que incluyen objetos presentados como cadenas.Este ejemplo mostrará sólo los datos relevantes, en orden de prioridad:
- nombre de la función (en función de la sintaxis de devoluciones de llamada):
- función de devolución de llamada:
'function_name'
- método de objeto:
array($object, 'function_name')
- clase estática método:
array('class_name', 'function_name')
y 'class_name::function_name'
- cierre:
function() {}
- método de clase estática relativa:
array('class_name', 'parent::function_name')
- args aceptadas
- nombre de archivo
- línea de salida
- Identificación
- 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;
}
Desde ganchos pueden ser ad ded y eliminado a través de todo el tiempo de ejecución, la salida depende de en qué punto se llama la función (wp_footer
acción es un buen lugar para obtener la lista completa)
print_r
ejemplo para the_content
filtro:
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
WP_Hook
clase
- prioridad añadido
- fijo: error generado si no existe devolución de llamada, aunque WordPress también plantea una advertencia para que
- fijo: el gancho con el mismo id pero diferente prioridad sobrescribe la anterior
impresionante. Gracias por la respuesta, no tenía idea sobre el wp_filter global, pero ahora todo tiene sentido. Saludos :) – macguru2000
funciona como un encanto! ¡Gracias! –