2011-03-07 5 views
41

Tengo una pregunta sobre WordPress, específicamente la versión 3.0 y posteriores.WordPress: ¿Cómo obtengo todas las funciones registradas para el filtro 'the_content'

¿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.

Respuesta

94

¿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 necesite.

print_filters_for('the_content'); 
+3

impresionante. Gracias por la respuesta, no tenía idea sobre el wp_filter global, pero ahora todo tiene sentido. Saludos :) – macguru2000

+0

funciona como un encanto! ¡Gracias! –

17

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
+4

Awesome depuración 'herramienta' - bien hecho. –

+0

FYI- Intenté usar esto en mi complemento, pero necesita un poco más de error de captura, ya que genera un error fatal si alguien agrega una función/método que no existe: 'Error fatal: excepción no detectada 'ReflectionException' con el mensaje 'Función Walker_Nav_Menu() no existe'' – helgatheviking

+0

Agregué un pequeño sabor 'try/catch' [aquí] (https://gist.github.com/helgatheviking/2d9e1208a96978b2154b). – helgatheviking

Cuestiones relacionadas