web-dev-qa-db-fra.com

Comment fonctionnent vraiment les filtres et les crochets PHP

Comment fonctionnent réellement les filtres et les points d'ancrage dans WordPress?

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

21
Aaron Lee

Vue d'ensemble

Fondamentalement, le " API de plugin }", qui appelle filtres et crochets, comprend les fonctions suivantes:

  1. apply_filters() - execute
  2. do_action - execute
  3. apply_filters_ref_array() - execute
  4. do_action_ref_array() - execute
  5. add_filter() - add to stack
  6. add_action() - add to stack

Internes de base

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

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

Le premier $wp_filter est une Array globale qui contient tous les noms de filtres sous forme de sous-tableaux. Chacun de ces sous-matrices contient alors encore plus de sous-matrices qui sont des rappels invoqués sous un tableau de priorité.

Bref en profondeur

Ainsi, lorsqu'une fonction execute est appelée, WordPress recherche dans ces tableaux de globales les clés portant ce nom. Ensuite, les rappels attachés sont exécutés priorité après priorité. Les rappels attachés au filtre all sont la seule chose qui se passe à l’avant.

Lorsque vous ajoutez un rappel à l'aide de add_action ou 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 pile global $wp_filter:

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

Comme vous pouvez le constater, le sous-tableau principal est le $tag (ou le nom de l'action/du filtre), puis tout est appelé avec 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 $tag/action-/filter-name -, le tableau est recherché et les rappels sont appelés. Comme il utilise call_user_func_array, le nombre d'arguments attachés n'a pas vraiment d'importance. WordPress résout cela tout seul.

foreach ( (array) current( $wp_filter[ $tag ] ) as $the_ )
{
    call_user_func_array(
        $the_['function'], 
        array_slice(
            $args, 
            0, 
            (int) $the_['accepted_args']
        )
    );
}
33
kaiser

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

Un exemple est le hook 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 crochets d'action que vous pouvez utiliser dans un thème enfant pour faire la même chose. Voici une carte visuelle qui inclut 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 crochet si vous ouvrez le fichier header.php dans le framework de thèmes Genesis:

do_action( 'genesis_header' );

Voici une liste de points d'ancrage WordPress que vous pouvez utiliser de différentes manières.

Filtres vous permet de modifier le résultat d’une fonction existante. Il est inclus à la fois dans les fichiers de base WordPress et dans certains cadres de thèmes parent tels que 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 d'utilisation d'un filtre dans un cadre de thème tel que 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 du 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 points d'ancrage 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 WordPress et votre thème parent sans modifier les fichiers WordPress principaux ni les fichiers de votre thème parent.

Il est beaucoup plus facile de personnaliser un thème enfant lorsque la structure 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 parent. De cette façon, vous pouvez également changer de thème en toute sécurité.

5
Brad Dalton