Le template single.php
sert à afficher un seul Post. On peut le considérer comme le dernier dans la hiérarchie des Posts :
- page d’accueil
home.php
(avec liste des derniers Posts) - page d’archive
archive.php
ou bien plus précisément :- catégorie
category.php
- année, mois, ou jour
date.php
- mot-clef
tag.php
- résultats de recherche
search.php
- catégorie
- page dédiée
single.php
Une boucle légèrement différente
Parce qu’il joue un rôle bien précis, le template single.php
va disposer d’une boucle différente. On ne va pas utiliser l’include loop.php
mais plutôt le copier-coller puis le modifier.
Le code de single.php
ressemble donc à ceci :
<?php get_header(); ?> <div class="main single"> <?php if (have_posts()) : ?> <?php while (have_posts()) : the_post(); ?> <div class="post"> <h1 class="post-title"><?php the_title(); ?></h1> <p class="post-info"> Posté le <?php the_date(); ?> dans <?php the_category(', '); ?> par <?php the_author(); ?>. </p> <div class="post-content"> <?php the_content(); ?> </div> <div class="post-comments"> <?php comments_template(); ?> </div> </div> <?php endwhile; ?> <?php endif; ?> </div> <?php get_sidebar(); ?> <?php get_footer(); ?>
On retrouve la div « main » qui peut servir de colonne principale. J’ai rajouté la classe « single » qui nous permettra de différencier le style des post-title, post-info, post-content… si besoin est.
La boucle n’est plus appelée via l’include loop.php
mais est directement intégrée à single.php
:
- le post-title perd son lien <a> étant donné que l’on se trouve déjà sur la page dédiée
- il devient d’ailleurs un <h1> parce qu’il correspond au titre de la page où l’on est. Avec celui du
header.php
, cela fait donc deux <h1>. Il faudra donc modifier le header en conséquence. On fera ça plus tard. - le post-excerpt devient un post-content, et la fonction s’en trouve modifiée aussi : on appelle maintenant
the_content(
); - un template (qui ici est un include) de commentaires !
- on a viré la partie « else » qui ne sert pas à grand chose étant donné qu’il y a toujours un Post (sinon, on ne serait pas capable d’avoir un lien vers lui)
C’est la seule fois où l’on verra le contenu d’un Post s’affiche en entier.
Une discussion, des commentaires
La fonction comments_template() génère :
- un titre du style Un commentaire pour « Hello world! »
- une liste de commentaires, où chacun a :
- un avatar
- un auteur (avec lien, si fourni)
- une date (qui sert de permalien)
- un contenu
- un lien « Répondre/Reply » pour répondre à un commentaire plutôt qu’à l’article
- un lien « Editer » pour les admin
- un titre « Poster une réponse »
- un formulaire pour poster un commentaire
Beaucoup de choses pour une seule fonction, n’est-ce pas ?
Ce qu’il faut savoir, c’est que ce template de commentaires est intégré à WordPress. En effet, il est n’est pas nécessaire de créer un template/include comments.php
pour que cette fonction affiche quelque chose. Libre à vous néanmoins d’en créer un vous même, mais je ne vous le conseille pas. Le fichier comments.php
est une usine à gaz.
Avant WordPress 3, comments.php
contenait non seulement le code entier de la liste des commentaires mais aussi le code entier du formulaire. Je l’avais « nettoyé » et amélioré pour qu’il soit plus lisible, plus facile à modifier et plus correct au niveau du HTML.
Depuis WordPress 3, je préfère laisser le template de base qui génère un code globalement correct.
Différence avec page.php
Si single.php
est le template dédiée à l’affichage d’un seul Post, page.php
est celui dédiée à l’affichage d’une Page. Du coup, leur similitude semble évidente. Mais il faudra tout de même passer par deux templates et pas qu’un car WordPress fonctionne ainsi : single.php
pour les Posts, page.php
pour les Pages, et pas moyen de les fusionner.
En même temps, une Page a des informations dififérentes à afficher :
- on enlève la catégorie (vu qu’elle n’en a pas)
- on enlève la date (car elle a peu d’intérêt pour du contenu statique, intemporel)
- on enlève les commentaires (vous pouvez les garder mais il est rare de les laisser sur une Page)
En somme, on reprend le code de single.php
et on en enlève des morceaux pour créer page.php
:
<?php get_header(); ?> <div class="main page"> <?php if (have_posts()) : ?> <?php while (have_posts()) : the_post(); ?> <div class="post"> <h1 class="post-title"><?php the_title(); ?></h1> <div class="post-content"> <?php the_content(); ?> </div> </div> <?php endwhile; ?> <?php endif; ?> </div> <?php get_sidebar(); ?> <?php get_footer(); ?>
La classe « single » devient une classe « page » et l’on supprime les parties « post-info » et « post-comments ».