Comment fonctionnent réellement les filtres et les hooks en PHP

21

Comment les filtres et les crochets fonctionnent-ils réellement dans WordPress?

Je demande quelque chose de avancé. Comment est-il implémenté en PHP? Par exemple, comment recueille-t-il tous les crochets des différents plugins et les "attache" aux crochets principaux, etc.

Aaron Lee
la source
2
Pour autant que je sache, il n'y a pas de «hooks» ou de «filtres» en php, il y a des fonctions. Wordpress a des fonctions spéciales qui, avant leur exécution, utilisent un rappel d'autres fonctions.
Ofir Baruch
3
@OfirBaruch, je suis presque sûr que l'OP faisait référence à leur implémentation dans WordPress, et ne suggérait pas qu'il y avait une implémentation PHP native de celui-ci.
Tom Auger

Réponses:

33

Présentation

Fondamentalement, l '" API de plug-in ", qui appelle des filtres et des crochets, se compose des fonctions suivantes:

  1. apply_filters()- exécuter
  2. do_action- exécuter
  3. apply_filters_ref_array()- exécuter
  4. do_action_ref_array()- exécuter
  5. add_filter()- ajouter à la pile
  6. add_action()- ajouter à la pile

Internes de base

Globalement, il y a quelques globaux (quoi d'autre dans le monde WordPress) impliqués:

global $wp_filter, $wp_actions, $wp_current_filter, $merged_filters;

Le premier $wp_filterest un global Arrayqui contient tous les noms de filtre en tant que sous-réseaux. Chacun de ces sous-réseaux contient alors encore plus de sous-réseaux qui sont des rappels appelés sous un tableau de priorité.

Bref en profondeur

Ainsi, lorsqu'une fonction d' exécution est appelée, WordPress recherche dans ces tableaux globaux les clés portant ce nom. Ensuite, les rappels attachés sont exécutés priorité après priorité. La seule chose qui se produit à l'avant est les rappels attachés au allfiltre.

Lorsque vous ajoutez un rappel à l'aide de add_actionou add_filter, WordPress calcule d'abord un ID "unique" pour ne pas écraser les rappels déjà joints.

$idx = _wp_filter_build_unique_id($tag, $function_to_add, $priority);

Ensuite, il ajoute votre rappel à la global $wp_filterpile:

$wp_filter[ $tag ][ $priority ][ $idx ] = array(
    'function'      => $function_to_add,
    'accepted_args' => $accepted_args
);

Comme vous pouvez le voir, le sous-tableau principal est le $tag(ou le nom de l'action / du filtre), puis tout est invoqué sous une priorité spécifique, puis la chaîne de rappel / ID "unique" est utilisée comme clé.

Plus tard, lorsqu'un filtre est appelé - avec le nom $tag/ action- / filter-name - le tableau est recherché et les rappels sont appelés. Comme il l'utilise call_user_func_array, peu importe le nombre d'arguments attachés. WordPress résout cela par lui-même.

foreach ( (array) current( $wp_filter[ $tag ] ) as $the_ )
{
    call_user_func_array(
        $the_['function'], 
        array_slice(
            $args, 
            0, 
            (int) $the_['accepted_args']
        )
    );
}
kaiser
la source
3
n'oubliez pas que pendant qu'il passe par les rappels, il ordonne l'exécution de plusieurs rappels sur le même hook en utilisant leur "priorité", qui est définie (facultativement) avec add_action () et apply_filters () et par défaut à 10.
Tom Auger
1
@TomAuger N'hésitez pas à ajouter des notes et des modifications supplémentaires à la réponse.
kaiser
5

Les crochets sont inclus à la fois dans les fichiers principaux de WordPress et dans certains fichiers de thèmes parents. Ils vous permettent de connecter du contenu à un emplacement spécifique du fichier.

Un exemple est le crochet wp_head dans WordPress. Vous pouvez utiliser ce crochet dans votre thème enfant pour ajouter du contenu à cet emplacement "

Exemple:

add_action('wp_head', 'add_content_to_head');
function add_content_to_head() {
echo 'Your Content';
}

Certains thèmes premium incluent également des crochets d'action que vous pouvez utiliser dans un thème enfant pour faire la même chose. Voici une carte visuelle qui comprend tous les crochets d'action et la position de sortie de votre contenu dans le cadre du thème Genesis.

Exemple:

add_action('genesis_header', 'add_content_to_header');
function add_content_to_header() {
echo 'Your Content';
}

Voici à quoi ressemble le hook si vous avez ouvert le fichier header.php dans le cadre du thème Genesis:

do_action( 'genesis_header' );

Voici une liste de crochets WordPress que vous pouvez utiliser de plusieurs façons.

Les filtres vous permettent de modifier la sortie d'une fonction existante et sont inclus à la fois dans les fichiers principaux de WordPress et dans certains cadres de thèmes parents comme Genesis.

Voici une liste des filtres que vous pouvez utiliser avec Genesis Design Framework

Voici une liste des filtres inclus dans WordPress

Voici un exemple de la façon dont vous pouvez utiliser un filtre dans un cadre de thème comme Genesis:

add_filter( 'comment_author_says_text', 'custom_comment_author_says_text' );
function custom_comment_author_says_text() {
return 'author says';
}

Le code ci-dessus peut être utilisé dans un thème enfant pour modifier l'auteur dit le texte dans vos commentaires. Cela fonctionne dans n'importe quel thème.

Voici un autre exemple qui personnalise la longueur des extraits à 50 mots:

add_filter( 'excerpt_length', 'change_excerpt_length' );
function change_excerpt_length($length) {
return 50; 
}

Vous trouverez la fonction the_excerpt () dans le fichier wp-includes / post-template.php.

Voici à quoi ça ressemble:

  function the_excerpt() {
        echo apply_filters('the_excerpt', get_the_excerpt());
}

Vous pouvez également utiliser des crochets et des filtres dans les plugins pour faire exactement la même chose et le code ne sera pas perdu lorsque vous mettrez à jour le thème parent ou WordPress.

Fondamentalement, les crochets et les filtres vous permettent de personnaliser et de modifier à la fois WordPress et votre thème parent sans modifier les fichiers WordPress de base ou vos fichiers de thème parent.

Il est beaucoup plus facile de personnaliser un thème enfant lorsque le cadre de thème parent comprend des crochets et des filtres car vous n'avez jamais besoin de modifier les fichiers de modèle de thèmes parents. De cette façon, vous pouvez également changer les thèmes en toute sécurité.

Brad Dalton
la source
2
C'est un excellent aperçu général des hooks et des filtres, mais je crains que la question de l'OP ne soit totalement ignorée, qui concerne les aspects internes du fonctionnement des hooks et de la façon dont WordPress les crée, les stocke et les traite. Très bonne réponse; vous devriez probablement créer un lien vers votre tutoriel sur WP Sites.
Tom Auger
Ok je vais le supprimer. Mon mauvais, car j'aurais dû mieux lire la question, mais je pensais que les réponses déjà données seraient plus faciles à comprendre pour les débutants s'ils connaissaient d'abord les bases.
Brad Dalton
2
Brad, je l'ai restitué car je pense qu'il pourrait être utile d'avoir cette information ici également. Si vous n'êtes pas d'accord, mentionnez-moi / envoyez-moi un ping ici et je le supprimerai à nouveau.
kaiser