Cet article fait suite à un article écrit il y a quelques temps de celà (en fait, il y a longtemps déjà et vous m’en voyez désolé…): Wordpress, des filtres et des actions (1ère partie).

Rappelez-vous, dans l’article précédent j’expliquais la différence entre un filtre et une action… Un filtre est une fonction qui va recevoir un paramètre en entrée, le transformer et renvoyer le résultat de la transformation. L’action, quant à elle, reçoit 0, 1 ou plusieurs paramètres en entrée et effectue une action; cette action ne renvoie pas de résultat, ce n’est pas nécessaire.

Je vais vous donner un exemple concret d’utilisation de filtres et actions, repris d’un de mes projets.

Voici le contexte: il s’agit d’une extension Wordpress transformant un site Wordpress en annuaire. Les entrées de l’annuaire peuvent être des sites internet ou des adresses physiques, et peuvent contenir un tas d’informations supplémentaires.

L’une de mes priorités lors de la conception de ce projet était d’écrire un noyau aussi léger que possible et facile à maintenir. J’ai donc décidé d’écrire les fonctionnalités avancées de l’extension dans des modules qui peuvent être chargés et déchargés via les options de l’extension dans l’administration du site. Je me suis alors demandé comment rendre mon extension assez souple pour pouvoir gérer tout type de modules sans savoir encore quels genre de fonctionnalités ils allaient contenir. Et c’est là que j’ai commencé à sérieusement m’intéresser aux filtres et actions de Wordpress…

Je vais vous donner un exemple pratique: Par défaut, l’annuaire ne gère que les adresses de type internet. C’est un annuaire extrêmement basique, une entrée contient un titre, une url et une description. Pour ajouter des adresses physiques, il faut charger le module d’adresse physique. Cela va ajouter des informations supplémentaires qui seront affichées dans le template de l’extension.

Voici une version simplifiée du template:

1
2
3
4
5
6
# <?php echo get_the_title(); ?>

<div id="details">
    <div id="url"><?php echo $url; ?></div>
    <?php do_action( 'plus_de_details', get_the_ID() ); ?>
</div>

Et maintenant une version simplifiée du module gérant les adresses physiques:

1
2
3
4
5
6
7
8
9
10
11
12
function action_plus_de_details( $id ) {
    $champs = getExtraInfo(); // fonction renvoyant les informations supplémentaires gérées par le module (rue, numéro, code postal, ...)
    ob_start();
    ?>
    **Rue**: <?php echo $champs['rue']; ?>       **N°**: <?php echo $champs['numero']; ?>

    **Ville**: <?php echo $champs['ville']; ?>   **Code Postal**: <?php echo $champs['cp']; ?>

    <?php
    echo ob_get_clean();
}
add_action( 'plus_de_details', 'action_plus_de_details' );

Vous remarquerez que le template affiche seulement les informations de base d’une entrée de l’annuaire (en l’occurrence, l’url). Par contre, le template offre la possibilité d’effectuer des actions supplémentaires juste après ce champ “Url”, ce qui permet au module Adresse d’ajouter ses propres champs.

Maintenant que nous avons vu un exemple d’action, ce serait pas mal de faire de même pour les filtres, n’est-ce pas? Continuons avec notre projet d’annuaire en ligne. Nous sommes en 2014 (c’est la date d’écriture de l’article en tout cas…) et il est pratiquement inconcevable d’utiliser un annuaire en ligne qui ne soit pas “Oueb 2.0”, c’est-à-dire interactif! Une des fonctionnalités de base de tout annuaire qui se respecte est l’évaluation faite par les internautes. Notre module ajoute donc un champ permettant à l’internaute d’évaluer l’entrée de l’annuaire lors de l’ajout d’un commentaire. Cette évaluation doit s’afficher à côté du titre de l’entrée.

Voici une version simplifiée du template:

1
2
3
4
5
6
# <?php echo apply_filters( 'filtre_sur_le_titre', get_the_title(), get_the_ID() ); ?>

<div id="details">
    <div id="url"><?php echo $url; ?></div>
    <?php do_action( 'plus_de_details', get_the_ID() ); ?>
</div>

Et maintenant une version simplifiée du module affichant les évaluations:

1
2
3
4
5
6
7
8
function mon_filtre_sur_le_titre( $titre, $post_id ) {
    if( is_singular() && is_main_query() && in_the_loop() ) {
        $eval = getEvaluation( $post_id );
        return sprintf( '%s<span class="rating">%d</span>', $titre, $eval );
    }
    return $titre;
}
add_filter( 'filtre_sur_le_titre', 'mon_filtre_sur_le_titre' ) ;

Vous aurez remarqué qu’il est extrêmement facile d’ajouter des fonctionnalités grâce à l’utilisation des actions et des filtres. L’exemple du filtre est plutôt explicite: on a pu ajouter un affichage des évaluations des visiteurs rien que grâce à l’utilisation d’un filtre! C’est-y pas beau ça?

Si vous voulez jeter un oeil à mon extension d’évaluation, mon répertoire Github vous accueillera à bras ouverts :)

Quelques nouvelles

Bien…. Ca fait plus de 5 mois que je n’ai plus rien posté sur ce blog, la honte! Pourtant les idées se bousculent au portillon…## Ce qu …… Continuer la lecture