¿Dónde puedo encontrar una lista de ganchos de WordPress?

Respuestas:

45

@Arlen: Como Keith S señala, la Lista de ganchos de Adam Brown es el recurso de facto de los ganchos para WordPress. Sin embargo, no es perfecto:

  • No muestra los ganchos en orden de cuando se llaman,
  • No proporciona el nombre del archivo o el número de línea donde se invoca,
  • No proporciona una serie de argumentos pasados,
  • No es una lista completa porque algunos ganchos se pueden llamar dinámicamente,
  • Y no muestra ganchos de complementos.

Entonces, aunque la lista de Adam es un gran recurso, especialmente para comprender cuándo se agregaron los ganchos históricamente, no es tan útil como si pudieras instrumentar los ganchos en cualquier página de tu propio sitio.

He estado jugando con esta idea durante un tiempo, por lo que su pregunta me llevó a escribir un complemento llamado " Ganchos de instrumentos para WordPress ". Puede encontrar la fuente completa debajo de la captura de pantalla y también puede descargarla aquí .

Así que aquí hay una captura de pantalla de cómo se ve la instrumentación:

Captura de pantalla de Ganchos de instrumentos para WordPress Plugin en acción

Se activa la instrumentación utilizando el parámetro URL instrument=hooks, es decir:

http://example.com?instrument=hooks

Y como se prometió, aquí está la fuente (o descárguela aquí ):

<?php
/*
Plugin Name: Instrument Hooks for WordPress
Description: Instruments Hooks for a Page. Outputs during the Shutdown Hook.
Version: 0.1
Author: Mike Schinkel
Author URI: http://mikeschinkel.com
*/

if ($_GET['instrument']=='hooks') {

    add_action('shutdown','instrument_hooks');
    function instrument_hooks() {
        global $wpdb;
        $hooks = $wpdb->get_results("SELECT * FROM wp_hook_list ORDER BY first_call");
        $html = array();
        $html[] = '<style>#instrumented-hook-list table,#instrumented-hook-list th,#instrumented-hook-list td {border:1px solid gray;padding:2px 5px;}</style>
<div align="center" id="instrumented-hook-list">
    <table>
        <tr>
        <th>First Call</th>
        <th>Hook Name</th>
        <th>Hook Type</th>
        <th>Arg Count</th>
        <th>Called By</th>
        <th>Line #</th>
        <th>File Name</th>
        </tr>';
        foreach($hooks as $hook) {
            $html[] = "<tr>
            <td>{$hook->first_call}</td>
            <td>{$hook->hook_name}</td>
            <td>{$hook->hook_type}</td>
            <td>{$hook->arg_count}</td>
            <td>{$hook->called_by}</td>
            <td>{$hook->line_num}</td>
            <td>{$hook->file_name}</td>
            </tr>";
        }
        $html[] = '</table></div>';
        echo implode("\n",$html);
    }

    add_action('all','record_hook_usage');
    function record_hook_usage($hook){
        global $wpdb;
        static $in_hook = false;
        static $first_call = 1;
        static $doc_root;
        $callstack = debug_backtrace();
        if (!$in_hook) {
            $in_hook = true;
            if ($first_call==1) {
                $doc_root = $_SERVER['DOCUMENT_ROOT'];
                $results = $wpdb->get_results("SHOW TABLE STATUS LIKE 'wp_hook_list'");
                if (count($results)==1) {
                    $wpdb->query("TRUNCATE TABLE wp_hook_list");
                } else {
                    $wpdb->query("CREATE TABLE wp_hook_list (
                    called_by varchar(96) NOT NULL,
                    hook_name varchar(96) NOT NULL,
                    hook_type varchar(15) NOT NULL,
                    first_call int(11) NOT NULL,
                    arg_count tinyint(4) NOT NULL,
                    file_name varchar(128) NOT NULL,
                    line_num smallint NOT NULL,
                    PRIMARY KEY (first_call,hook_name))"
                    );
                }
            }
            $args = func_get_args();
            $arg_count = count($args)-1;
            $hook_type = str_replace('do_','',
                str_replace('apply_filters','filter',
                    str_replace('_ref_array','[]',
                        $callstack[3]['function'])));
            $file_name = str_replace($doc_root,'',$callstack[3]['file']);
            $line_num = $callstack[3]['line'];
            $called_by = $callstack[4]['function'];
            $wpdb->query("INSERT wp_hook_list
                (first_call,called_by,hook_name,hook_type,arg_count,file_name,line_num)
                VALUES ($first_call,'$called_by()','$hook','$hook_type',$arg_count,'$file_name',$line_num)");
            $first_call++;
            $in_hook = false;
        }
    }
}
MikeSchinkel
fuente
Yo ... es una de esas cosas que solo puedes usar una o dos veces, pero cuando lo usas, le agradeces a las estrellas por ello :)
Keith S.
1
Mike, eso es genial! Pero, ¿qué recomendaría para comprender realmente lo que hace cada filtro / acción? ¿hay un archivo donde se enumeren todos esos junto con su 'actividad'? ¡Gracias!
Amit
1
@Amit - Sí, esa es la pregunta difícil. :) Gracias por preguntar. Desafortunadamente, no veo ninguna forma de automatizar eso como lo hice para enumerar los ganchos anteriores, así que no tengo una respuesta perfecta para usted. Idealmente para cada gancho, alguien escribiría una gran publicación de blog (o haría una pregunta aquí que obtuviera una excelente respuesta) y luego "Google it" sería su respuesta. Tal como está, utilizo un IDE de depuración (PhpStorm + XDEBUG, US $ 49 hasta septiembre de 2010) y establezco puntos de interrupción y solo trazo el código de ejecución. Sin embargo, puede haber una mejor manera, y si alguien más lo ha pensado, ¡háganoslo saber!
MikeSchinkel
Wow, esta es la mejor respuesta que he visto. Aquí de todos modos.
Arlen Beiler
2
@ Mike: Pregunta rápida, ¿por qué almacena eso en la base de datos en lugar de la memoria o una secuencia temporal?
Hakre
2

El Codex tiene una referencia de acción y una referencia de filtro . Adam Brown creó una base de datos de ganchos que tiene todos los ganchos en el código fuente y agrega la documentación de las páginas wiki, información de versión y enlaces al código fuente. Puede mejorarlo escribiendo documentación en el Codex.

Por supuesto, algunos ganchos son dinámicos, dependiendo de otros datos. Toma la wp_transition_post_statusfunción:

function wp_transition_post_status($new_status, $old_status, $post) {
    do_action('transition_post_status', $new_status, $old_status, $post);
    do_action("${old_status}_to_$new_status", $post);
    do_action("${new_status}_$post->post_type", $post->ID, $post);
}

Si registra un tipo de publicación personalizado eventy un estado de publicación personalizado cancelled, tendrá un cancelled_eventenlace de acción.

Jan Fabry
fuente
La base de datos de Adam Browns no es solo una combinación de esas 2 páginas, tiene todas las acciones y filtros en WordPress enumerados. ¿O no es eso lo que querías decir?
Arlen Beiler
@Arlen: Sí, lo reescribí para que quede más claro.
Jan Fabry
1

Aunque primitivo, ¿quizás este código de complemento puede ayudar? Cambie "add_action" con "add_filter" si desea ver los filtros en su lugar. Cargue el complemento y luego actualice la página de inicio del sitio. Una vez cargado, es muy difícil desactivarlo, así que simplemente cambie el nombre del archivo de complemento en la carpeta de complementos y actualice el sitio nuevamente; se desactivará automáticamente. He usado este truco muchas veces para solucionar problemas o encontrar un lugar donde pueda insertar algo.

<?php
/*
Plugin Name: Hooks
Plugin URI: http://example.com/
Description: Hooks
Version: 1.00
Author: Hooks
Author URI: http://example.com/
*/

add_action('all','hook_catchall');
function hook_catchall(&$s1 = '', &$s2 = '', &$s3 = '', &$s4 = '') {
    echo "<h1>1</h1>\n";
    print_r($s1);
    echo "<br />\n";
    echo "<h1>2</h1>\n";
    print_r($s2);
    echo "<br />\n";
    echo "<h1>3</h1>\n";    
    print_r($s3);
    echo "<br />\n";
    echo "<h1>4</h1>\n";    
    print_r($s4);
    echo "<br />\n";
    return $s1;
}
Volomike
fuente
Puede que no sea bonito, pero en realidad podría ser la forma más rápida y fácil en algunos escenarios (a menudo uso "depuración de printf" para arreglar pequeñas cosas en pequeños proyectos de línea de comandos Notepad + en lugar de usar un IDE completo).
Synetech
0

Utilizo esto para encontrar el orden de los ganchos. Para obtener el filterscambio justo add_actiona add_filter.

function echo_all_hooks() {
$not_arr = array('gettext','sanitize_key','gettext_with_context','attribute_escape');
if(!in_array(current_filter(),$not_arr)) echo current_filter()."<br/>";
}
add_action('all','echo_all_hooks');
Wadde
fuente
0

Como @kaiser sugiere no publicar solo enlaces, lo estoy mejorando. pero no es posible usar el código completo aquí, así que estoy usando algunas imágenes aquí para explicar cómo tiene una lista completa de ganchos de WordPress con describir cada uno. Puedes encontrarlo aquí para ganchos , clases , funciones , complementos , ingrese la descripción de la imagen aquí

para describir cada ingrese la descripción de la imagen aquí

Sohan
fuente