. WebdeZign
web design, intégration web et WordPress

un template pour chaque catégorie ? c’est une histoire de ‘hook’

Bonjour !!

Vous vous souvenez de l’étape « c’est quoi, un hook ? » … Ca fait déjà pas mal de temps et il m’en aura fallu tout autant pour ronger cet os jusqu’à sa substantifique moelle ^^ mais la semaine dernière, j’ai créé mon premier hook ! en l’occurrence, un ‘hook_filter’ si je peux m’exprimer ainsi (par opposition à ‘hook_action’, étant donné que les hooks peuvent être soit un filtre, soit une action).

 

 

Mon problème était le suivant : comment faire en sorte que l’arrière-plan d’un ‘single.php’ soit modifié en fonction de la catégorie dans laquelle se trouve l’article ?
Je précise que, sur ce projet, je travaille sur un thème-enfant dont le thème-parent (ColorMag, pour ne pas le citer) est bien fourni en fonctions en tous genres et qu’il s’agissait également pour moi de préserver l’intégrité de cette base.

Si j’avais, dès le départ, créé des CPT (Custom Post Types) plutôt que des catégories pour différencier les ‘objets’ et ainsi pouvoir profiter de la hiérarchie des templates de WordPress, j’aurais simplement eu à créer des fichiers ‘single-cpt1.php’, single-cpt2.php’, … et le tour était joué. Mais là, l’objet est d’une seule nature – des posts (articles) – et WordPress fera donc systématiquement appel à ‘single.php’ pour leur affichage, quelle que soit la catégorie qui leur aura été attribuée. Il me fallait donc trouver comment imposer à WordPress, au moment du déclenchement de ‘single.php’, l’appel à un template dédié à chaque catégorie.

J’ai lu, grâce à notre ami Google, plein plein plein de questions/réponses et de tutos se rapprochant plus ou moins de mon objectif, mais rien ne fonctionnait sans toucher au thème-parent … il y avait bien un tuto qui utilisait le tag ‘single_template’ du Codex WordPress qui semblait prometteur mais, ô malheur, il est ‘deprecated’ (il ne doit plus être utilisé parce qu’obsolète) … j’ai ainsi erré d’idée en essai pendant quelques jours et finalement la solution m’est venue du même Willy … et du ‘template_include’ dont il parlait (cf l’article cité « c’est quoi, un hook ?« ) ! mais, tête de linotte à ma manière, je n’avais même pas pris la peine de relire mon propre article !!! … pas taper !

Willy m’a guidé sur le bout de code à insérer dans le fichier ‘functions.php’ du thème-enfant et, l’air de rien, j’ai fait mon premier hook !

Donc, si vous désirez attribuer un template spécifique à l’affichage des articles de chaque catégorie présente sur votre site, il s’agira d’intégrer ce ‘snippet’ dans le fichier ‘functions.php’ de votre thème :

add_filter('template_include','template_type_by_cat');
function template_type_by_cat( $template ) {
  if ( is_single() && in_category( 'category1' )  ) {
        $new_template = locate_template( array( 'single-category1.php' ) );
        if ( '' != $new_template ) {
            return $new_template ;
        }
    }    
    elseif ( is_single() && in_category( 'category2' )  ) {
        $new_template = locate_template( array( 'single-category2.php' ) );
        if ( '' != $new_template ) {
            return $new_template ;
        }
    }    
    elseif ( is_single() && in_category( 'category3' )  ) {
	$new_template = locate_template( array( 'single-category3.php' ) );
        if ( '' != $new_template ) {
            return $new_template ;
	}
    }
  return $template;
  }

Ensuite, en dupliquant le fichier ‘single.php’, vous allez créer vos différents ‘single-categoryx.php’ que vous personnaliserez en fonction de vos besoins.

Eh bien, le code ci-dessus est un HOOK et, comme son nom ‘add_filter’ l’indique, il est de type ‘filtre’.

Pourquoi est-ce que je cherche toujours plus compliqué que cela n’est en réalité ? Vous avez deux heures…!

Tita

Conceptrice & CEO chez Tita Créations
Passionnée de chevaux, de nature, d'écriture... et d'informatique, j'ai découvert cette dernière avec un tout premier modèle d'ordinateur portable : un SHARP écran cristaux liquides d'au moins 10kg ! ... 1988
Aujourd'hui, je donne libre cours à ma créativité dans les domaines du web design, de la gestion de projet et de la gestion de contenu.


Commenter