Comment les filtres et les hooks fonctionnent-ils vraiment en PHP

19

Comment les filtres et les points d'ancrage fonctionnent-ils 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.

    
posée Aaron Lee 13.08.2013 - 10:53

2 réponses

32

Présentation

En gros, la " API de plug-in ", qui appelle les filtres et les crochets, comprend les 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, quelques globals (quoi d'autre dans le monde WordPress) sont impliqués:

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

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

Brief 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 callbacks 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’avance.

Lorsque vous ajoutez un rappel en utilisant add_action ou add_filter , WordPress commence par calculer un ID "unique" pour ne pas écraser les rappels déjà joints.

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

Ensuite, votre rappel est ajouté à la pile global $wp_filter :

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

Comme vous pouvez voir que le sous-tableau principal est le $tag (ou action / nom du filtre), tout est appelé 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é (ce qui se passe avec $tag / action- / nom-filtre), 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']
        )
    );
}
    
réponse donnée kaiser 13.08.2013 - 15:22
4
Des

crochets sont inclus à la fois dans les fichiers de base WordPress et dans certains fichiers de thèmes parent. 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 les crochets d'action que vous pouvez utiliser dans un thème enfant pour faire la même chose. . Voici une carte visuelle contenant tous les crochets d'action et la position de sortie de votre contenu dans le cadre du thème Genesis. / p>

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 des points d'ancrage WordPress que vous pouvez utiliser de différentes manières.

Les

Filtres vous permettent de modifier la sortie d'une fonction existante. Ils sont inclus à la fois dans les fichiers de base WordPress et dans certains cadres de thèmes parents 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 le texte dans vos commentaires. Cela fonctionne dans n'importe quel thème.

Voici un autre exemple permettant de personnaliser 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 cela 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é.

    
réponse donnée Brad Dalton 14.08.2013 - 11:05

Lire d'autres questions sur les étiquettes