web-dev-qa-db-fra.com

WordPress: Comment obtenir toutes les fonctions enregistrées pour le filtre 'the_content'

J'ai une question concernant WordPress, en particulier la version 3.0 et plus récente.

Quelqu'un sait-il comment obtenir un tableau ou une liste de toutes les fonctions qui seront appliquées ou qui sont "enregistrées" dans le filtre_contenu?

L'idée est de générer une liste de cases à cocher des fonctions possibles à supprimer du filtre, telles que wpautop. Je sais comment supprimer des fonctions du filtre avec des étiquettes codées en dur, mais j'espère créer une solution plus dynamique.

Si quelqu'un a des idées si cela est possible et comment cela pourrait être fait, je serais très intéressé. Merci.

55
macguru2000

Fonction simple pour imprimer à partir du tableau de filtres?

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

Appelez-le là où vous en avez besoin.

print_filters_for( 'the_content' );
115
t31os

Ceci est un exemple un peu plus avancé qui, en plus des données du tableau $wp_filter, Montrera le chemin du fichier auquel le crochet est attaché, ainsi que la ligne de code où la fonction est définie.

Pour obtenir une liste de base des fonctions accrochées à une action (ou un filtre) spécifique, il suffit de récupérer les éléments du tableau de filtres, mais comme les fonctions peuvent être attachées de différentes manières (comme méthode de classe ou fermeture), cette liste contiendra une tonne de données non pertinentes qui comprend des objets présentés sous forme de chaîne. Cet exemple n'affichera que les données pertinentes, par ordre de priorité:

  • nom de la fonction (selon la syntaxe des rappels):
    • rappel de fonction: 'function_name'
    • méthode objet: array( $object, 'function_name' )
    • méthode de classe statique: array( 'class_name', 'function_name' ) et 'class_name::function_name'
    • fermeture: function() {}
    • méthode de classe statique relative: array( 'class_name', 'parent::function_name' )
  • arguments acceptés
  • nom de fichier
  • ligne de départ
  • id
  • priorité

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

Étant donné que des hooks peuvent être ajoutés et supprimés tout au long de l'exécution, la sortie dépend du moment où la fonction est appelée (l'action wp_footer Est un bon endroit pour obtenir la liste complète)

Exemple print_r Pour le filtre the_content:

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
        )

    .....

Modifier: 2017-05-05

  • adapté pour la classe WP_Hook
  • priorité ajoutée
  • corrigé: erreur levée si le rappel n'existe pas, bien que WordPress déclenche également un avertissement pour cela
  • fixe: le crochet avec le même id mais une priorité différente écrase le précédent
25
Danijel