Où puis-je trouver une liste de points d'ancrage WordPress?


Réponses:


45

@Arlen: Comme le souligne Keith S, la liste des crochets d'Adam Brown est la ressource de fait des crochets pour WordPress. Cependant, ce n'est pas parfait:

  • Il ne montre pas les crochets par ordre d'appels,
  • Il ne fournit pas le nom du fichier ou le numéro de ligne où invoqué,
  • Il ne fournit pas un nombre d'arguments passés,
  • Ce n'est pas une liste complète car certains hooks peuvent être appelés dynamiquement,
  • Et il ne montre pas les crochets des plugins.

Ainsi, bien que la liste d'Adam soit une excellente ressource, en particulier pour comprendre quand des points d'ancrage ont été ajoutés, ce n'est pas aussi utile que si vous pouviez instrumenter les points d'ancrage sur une page donnée de votre propre site.

Cela fait quelque temps que je joue à cette idée, alors votre question m'a amené à écrire un plugin appelé " Instrument Hooks for WordPress ". Vous pouvez trouver la source complète ci - dessous la capture d'écran et vous pouvez également la télécharger depuis gist ici .

Alors, voici une capture d'écran de l'instrumentation:

Capture d'écran de Instrument Hooks for WordPress Plugin en action

Vous déclenchez l'instrumentation à l'aide du paramètre URL instrument=hooks, à savoir:

http://example.com?instrument=hooks

Et comme promis, voici le code source (ou téléchargez-le ici .):

<?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;
        }
    }
}

Je voudrais ... c'est une de ces choses que vous n'utiliseriez peut-être qu'une ou deux fois, mais quand vous l'utilisez, vous remerciez les étoiles pour cela :)
Keith S.

1
Mike, c'est très cool! Mais que recommanderiez-vous pour comprendre réellement le rôle de chaque filtre / action? Existe-t-il un fichier dans lequel tous sont répertoriés avec leur "activité"? Merci!
Amit

1
@Amit - Oui, c'est la question difficile. :) Merci d'avoir posé la question. Malheureusement, je ne vois aucun moyen d'automatiser cela, comme je l'ai fait pour la liste des crochets ci-dessus, je n'ai donc pas de réponse parfaite pour vous. Idéalement, pour chaque hook, quelqu'un rédigerait un excellent article de blog (ou poserait une question avec une bonne réponse), puis "Google il" serait votre réponse. Dans l’état actuel, j’utilise un IDE de débogage (PhpStorm + XDEBUG, 49 US $ jusqu’en septembre 2010) et j’ai défini des points d’arrêt et suivi le code en cours d’exécution. Il y a peut-être un meilleur moyen, et si quelqu'un d'autre y a pensé, veuillez nous le faire savoir!
MikeSchinkel

Wow, c'est la meilleure réponse que j'ai jamais vue. Ici quand même.
Arlen Beiler

2
@ Mike: Petite question, pourquoi stockez-vous cela dans la base de données au lieu de la mémoire ou d'un flux temporaire?
hakre


2

Le Codex a une référence d'action et une référence de filtre . Adam Brown a créé une base de données de hooks qui contient tous les hooks dans le code source et ajoute la documentation des pages du wiki, des informations sur la version et des liens vers le code source. Vous pouvez l'améliorer en écrivant de la documentation dans le Codex.

Bien sûr, certains hooks sont dynamiques, en fonction d'autres données. Prenez la wp_transition_post_statusfonction:

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 vous enregistrez un type de message personnalisé eventet un statut de message personnalisé cancelled, vous aurez un cancelled_eventcrochet d'action.


La base de données Adam Browns n’est pas simplement une combinaison de ces 2 pages, elle répertorie toutes les actions et tous les filtres dans WordPress. Ou n'est-ce pas ce que vous vouliez dire?
Arlen Beiler

@Arlen: Oui en effet, je l'ai réécrit pour que ce soit plus clair.
Jan Fabry

1

Bien que primitif, peut-être que ce code de plugin peut aider? Basculez "add_action" avec "add_filter" si vous souhaitez plutôt examiner les filtres. Chargez le plug-in, puis actualisez la page d'accueil du site. Une fois chargé, la désactivation est très pénible. Il vous suffit donc de renommer le fichier plugin situé dans le dossier plugins et d'actualiser le site à nouveau. Il se désactivera automatiquement. J'ai utilisé cette astuce plusieurs fois pour résoudre des problèmes ou trouver un endroit où insérer quelque chose.

<?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;
}

Ce n'est peut-être pas joli, mais c'est peut-être le moyen le plus rapide et le plus simple dans certains scénarios (j'utilise souvent le «débogage printf» pour corriger de petites choses dans de petits projets Notepad + en ligne de commande au lieu d'utiliser un IDE complet).
Synetech

0

Je l'utilise pour trouver l'ordre des crochets. Pour obtenir le filtersjuste changement add_actionà 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');

0

Comme @kaiser suggère de ne pas poster que des liens, je l’améliore. mais il n’est pas possible d’utiliser tout le code ici, donc j’utilise peu d’images ici pour expliquer comment il contient une liste complète des points d'ancrage WordPress avec une description. vous pouvez le trouver ici pour les hooks , classes , fonctions , plugins , entrez la description de l'image ici

décrire chacun entrez la description de l'image ici


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.