Créer un Thème WordPress : 7. Les Templates Single Post, Attachment et 404
16 juillet 2009
Cet article est une traduction du tutoriel How To Create a WordPress Theme rédigé par Ian Stewart, l’auteur du framework WordPress Thematic disponible sur son site ThemeShaper. Avec son aimable autorisation et mes remerciements.
Vous avez construit la liste de tous vos articles dans index.php. Maintenant il faut créer un template pour afficher chaque élément individuellement (et gérer lorsqu’il n’y a rien à afficher).
Le Modèle pour les Templates
La structure de single.php (et de presque tous les autres templates que nous allons créer) est pratiquement la même que index.php. En fait on peut considérer que c’est notre modèle de template.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <?php get_header(); ?> <div id="container"> <div id="content"> <div id="nav-above" class="navigation"> </div><!-- #nav-above --> <div id="post-<?php the_ID(); ?>" <?php post_class(); ?>> </div><!-- #post-<?php the_ID(); ?> --> <div id="nav-below" class="navigation"> </div><!-- #nav-below --> </div><!-- #content --> </div><!-- #container --> <?php get_sidebar(); ?> <?php get_footer(); ?> |
Il va quand même y avoir quelques différences, à commencer par the_post() et comments_template().
Nous allons appeler the_post() prêt du haut de la page juste après l’ouverture de la div #content et avant la navigation entre pages d’articles. Nous n’avons pas besoin d’une boucle dans ce template car WordPress sait déjà quel article nous voulons afficher grâce au lien généré par the_permalink().
Et comme c’est un article unique, nous allons y ajouter la gestion des commentaires avec comments_template(). De plus nous voulons séparer les commentaires des trackbacks (rétroliens ou pings), il faut donc appeler la fonction comme ceci :
1 | <?php comments_template('', true); ?> |
comments_template() doit être placé juste avant la fermeture de la div #content, après la navigation.
Navigation entre Articles
Au lieu d’utiliser les mal nommés next_posts_link() et previous_posts_link() nous allons utiliser previous_post_link() et next_post_link() qui sont plus appropriés. Eux, font exactement ce à quoi on s’attend.
1 2 3 4 | <div id="nav-above" class="navigation"> <div class="nav-previous"><?php previous_post_link( '%link', '<span class="meta-nav">«</span> %title' ) ?></div> <div class="nav-next"><?php next_post_link( '%link', '%title <span class="meta-nav">»</span>' ) ?></div> </div><!-- #nav-above --> |
1 2 3 4 | <div id="nav-below" class="navigation"> <div class="nav-previous"><?php previous_post_link( '%link', '<span class="meta-nav">«</span> %title' ) ?></div> <div class="nav-next"><?php next_post_link( '%link', '%title <span class="meta-nav">»</span>' ) ?></div> </div><!-- #nav-below --> |
Le Titre des Articles Uniques
Si vous vous rappelez notre leçon sur header.php, nous avons utilisé des instructions IF pour faire en sorte que le titre des articles soient visibles des moteurs de recherche. Nous allons en tirer avantage ici, et dans les autres templates, en mettant le titre dans une balise h1.
1 | <h1 class="entry-title"><?php the_title(); ?></h1> |
Vous remarquerez aussi que le code pour le titre est également plus simple. C’est l’avantage ici de n’avoir rien à lier.
Liens Utiles pour les Articles Uniques
La gestion des liens utiles est plutôt complexe. Vous allez donc voir ici le bénéfice de s’appuyer sur les épaules de quelqu’un d’autre qui a déjà codé cela pour vous.
Avant de regarder le code, penchons-nous sur les raisons qui font que c’est complexe. En raison de la manière dont sont gérés les commentaires dans WordPress, nous devons prendre en compte différents scenarii : commentaires et trackbacks (= ping ou rétroliens) ouverts, seulement les trackbacks ouverts, seulement les commentaires ouverts ou commentaires et trackbacks fermés. Ce qui aboutit à un enchevêtrement d’instructions IF.
Cela peut-être déroutant mais le code est commenté et il suffit de suivre les blocs d’instructions IF et ELSIF pour comprendre.
Nous voulons également afficher un lien vers notre permalien pour permettre l’enregistrement dans les favoris et un lien vers le flux RSS de cet article, très utile pour suivre les conversations.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <div class="entry-utility"> <?php printf( __( 'This entry was posted in %1$s%2$s. Bookmark the <a href="%3$s" title="Permalink to %4$s" rel="bookmark">permalink</a>. Follow any comments here with the <a href="%5$s" title="Comments RSS to %4$s" rel="alternate" type="application/rss+xml">RSS feed for this post</a>.', 'your-theme' ), get_the_category_list(', '), get_the_tag_list( __( ' and tagged ', 'your-theme' ), ', ', '' ), get_permalink(), the_title_attribute('echo=0'), comments_rss() ) ?> <?php if ( ('open' == $post->comment_status) && ('open' == $post->ping_status) ) : // Comments and trackbacks open ?> <?php printf( __( '<a class="comment-link" href="#respond" title="Post a comment">Post a comment</a> or leave a trackback: <a class="trackback-link" href="%s" title="Trackback URL for your post" rel="trackback">Trackback URL</a>.', 'your-theme' ), get_trackback_url() ) ?> <?php elseif ( !('open' == $post->comment_status) && ('open' == $post->ping_status) ) : // Only trackbacks open ?> <?php printf( __( 'Comments are closed, but you can leave a trackback: <a class="trackback-link" href="%s" title="Trackback URL for your post" rel="trackback">Trackback URL</a>.', 'your-theme' ), get_trackback_url() ) ?> <?php elseif ( ('open' == $post->comment_status) && !('open' == $post->ping_status) ) : // Only comments open ?> <?php _e( 'Trackbacks are closed, but you can <a class="comment-link" href="#respond" title="Post a comment">post a comment</a>.', 'your-theme' ) ?> <?php elseif ( !('open' == $post->comment_status) && !('open' == $post->ping_status) ) : // Comments and trackbacks closed ?> <?php _e( 'Both comments and trackbacks are currently closed.', 'your-theme' ) ?> <?php endif; ?> <?php edit_post_link( __( 'Edit', 'your-theme' ), "\n\t\t\t\t\t<span class=\"edit-link\">", "</span>" ) ?> </div><!-- .entry-utility --> |
Contenu de l’Article
Au contraire de index.php, le contenu est plutôt simple. Un seul appel de fonction suivi de wp_link_pages().
1 2 | <?php the_content(); ?> <?php wp_link_pages('before=<div class="page-link">' . __( 'Pages:', 'your-theme' ) . '&after=</div>') ?> |
Fichier Attachés
Peu de personnes utilisent les fichiers attachés bien qu’ils soient assez intéressants. Quand vous ajoutez une image à votre article, en fait vous l’attachez à l’article. Et bien évidemment, vous pouvez attacher plus que des images. Nous allons mettre en place un template attachment.php que vous pourrez adapter si vous le voulez par la suite à d’autres types de fichiers comme des vidéos, de l’audio ou des applications en développant des templates video.php, audio.php et application.php. Il existe plein de manières d’être créatif avec les rattachements WordPress.
Le plus simple est de copier single.php, le renommer en attachment.php et de faire les modifications qui suivent.
Premièrement supprimez la navigation du haut, nous n’en avons pas besoin. Remplacez-la par un titre de page qui fait un lien vers l’article parent.
1 | <h1 class="page-title"><a href="<?php echo get_permalink($post->post_parent) ?>" title="<?php printf( __( 'Return to %s', 'your-theme' ), wp_specialchars( get_the_title($post->post_parent), 1 ) ) ?>" rev="attachment"><span class="meta-nav">« </span><?php echo get_the_title($post->post_parent) ?></a></h1> |
Comme nous avons mis le titre de la page dans une balise h1, le titre de notre article sera donc placé dans une balise h2 :
1 | <h2 class="entry-title"><?php the_title(); ?></h2> |
Et comme le contenu de notre template attachment doit afficher le fichier attaché, la section contenu doit donc être la suivante. De plus comme la plupart de nos fichier attachés seront des images, nous le vérifions à l’aide d’instructions IF.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <div class="entry-content"> <div class="entry-attachment"> <?php if ( wp_attachment_is_image( $post->id ) ) : $att_image = wp_get_attachment_image_src( $post->id, "medium"); ?> <p class="attachment"><a href="<?php echo wp_get_attachment_url($post->id); ?>" title="<?php the_title(); ?>" rel="attachment"><img src="<?php echo $att_image[0];?>" width="<?php echo $att_image[1];?>" height="<?php echo $att_image[2];?>" class="attachment-medium" alt="<?php $post->post_excerpt; ?>" /></a> </p> <?php else : ?> <a href="<?php echo wp_get_attachment_url($post->ID) ?>" title="<?php echo wp_specialchars( get_the_title($post->ID), 1 ) ?>" rel="attachment"><?php echo basename($post->guid) ?></a> <?php endif; ?> </div> <div class="entry-caption"><?php if ( !empty($post->post_excerpt) ) the_excerpt() ?></div> <?php the_content( __( 'Continue reading <span class="meta-nav">»</span>', 'your-theme' ) ); ?> <?php wp_link_pages('before=<div class="page-link">' . __( 'Pages:', 'your-theme' ) . '&after=</div>') ?> </div><!-- .entry-content --> |
Effacez maintenant la navigation du bas de ce qui était auparavant votre ancien single.php et votre template attachment.php est terminé.
Le Template 404
Une erreur 404 est le code d’erreur renvoyé par le serveur pour l’évènement « la page ne peut être trouvée » et vous devez prendre en compte cet évènement dans vos thèmes WordPress. Que se passe-t-il si un lien de votre blog a une adresse URL mal saisie? Ou bien lorsque vous supprimez un article? Votre serveur génère une erreur 404.
Heureusement, WordPress a un template pour ce cas, 404.php. La technique que j’utilise pour le template 404 est assez directe mais elle fonctionne. Affichez des excuses et un formulaire de recherche. Il peut y avoir des solutions alternatives, mais aucune ne sera plus rapide pour votre visiteur.
Retournez au modèle de template que nous avons utilisé plus haut, enlevez la navigation et ajoutez ceci à la section content :
1 2 3 4 5 6 7 | <div id="post-0" class="post error404 not-found"> <h1 class="entry-title"><?php _e( 'Not Found', 'your-theme' ); ?></h1> <div class="entry-content"> <p><?php _e( 'Apologies, but we were unable to find what you were looking for. Perhaps searching will help.', 'your-theme' ); ?></p> <?php get_search_form(); ?> </div><!-- .entry-content --> </div><!-- #post-0 --> |
Cet article fait partie du tutoriel Créer un Thème WordPress :
- Introduction
- Outils de Développement
- Structure HTML du Thème
- Structure des Dossiers et Templates
- Template Header
- Template Index
- Templates Single, Attachment et 404
- Template Comments
- Template Search et Page
- Template Archives, Auteur, Catégories et Mots clés
- Template Sidebar
- Design du Thème, Initialisation et Construction CSS

Bonjour,
Félicitations pour ce tutoriel simple, concis, précis et j’espère exhaustif. Merci
Je suis arrivé sur cette page via Google « au hasard » d’une requête « précise »… :
« Comment maitriser (au sens zoologique:) la fonction ‘wp comments_template’ ? »
En peu de mots et quelques coups de pinceau, je vais tenter de planter le décor de cette requête.
Je ne suis ni informaticien, ni marketeur, ni bloggeur, rien de tout ça et un peu autodidacte malgré tout.
J’ai un « savoir-faire maison » singulier, lequel me place aujourd’hui malgré moi en position de pionnier,
avec 40 (!) ans d’avance sur ce qui est considéré à présent comme d’avant-garde et à la pointe (!)
dans ce domaine de compétences qui est le mien.
Un savoir-faire que j’aimerais donc faire connaitre, mettre en valeur, amplifier,
partager et si possible monétiser via cette formidable opportunité qu’est le web…
Seulement voilà.
Dans ce domaine-là, je ne suis qu’un bien modeste débutant et j’avance laborieusement…
Je n’ai pas par ailleurs hélas l’aisance financière ni les fonds
qui permettraient de faire « lancer le navire » par des professionnels.
Mais bon, j’y crois, même si j’avance lentement, mais sûrement, et le défi est intéressant.
Après un premier essai « raté » il y a deux ans à travers un « site-vitrine » traditionnel (et mal conçu),
j’ai donc tout démonté et je retourne à la case départ avec un « site-blog » sur moteur WordPress.
Mon nouveau challenge est de pouvoir me porter ainsi davantage au devant de mes futurs prospects,
histoire de mieux comprendre leurs besoins et ce que je pourais leur apporter, et comment.
J’ai donc mis ma petite mailing-liste de prospects, ou plutôt de curieux intéressés, en stand-by…
Afin de pouvoir les ramener prochainement sur ce blog en chantier,
je suis en train de construire pas après pas un petit espace-membre,
qui reprendra mon message « grand-public » de manière beaucoup plus ciblée.
Après avoir exploré (tout) ce qui se présente en matière de plugins tous faits,
et ne trouvant pas ce qui me permet de synchroniser cet espace (y compris via les standards de Wp),
avec ma propre plateforme de gestion de mailing-list (‘PMP’ de albovision.com + ‘Cybermailing’),
j’ai donc décidé de batir cet espace de toutes pièces, « en dur », via un template ou pseudo-template Wp.
Voici pour ce faire le noyau du code, simple, que j’ai adopté :
(Je ne sais pas si cette boite à commentaires censure le code alors je vais l’altérer un peu…)
[ balise debut php]
require (‘/chemin-absolu-du-serveur/chemin-relatif-de-mon-blog-wordpress/wp-load.php’) ;
include(‘/chemin-absolu-du-serveur/chemin-relatif-de-mon-blog-wordpress/wp-content/themes/ici-le-nom-du-theme/header-membres.php’); // header selon wp
include (‘/chemin-absolu-du-serveur/chemin-relatif-du-fichier-corps-de-page/corpsdepage.inc.php’) ;
include(‘/chemin-absolu-du-serveur/chemin-relatif-de-mon-blog-wordpress/wp-content/themes/ici-le-nom-du-theme/footer-membres.php’); // footer selon wp
[ balise fin php ]
J’obtiens bien un espace personnalisé,
à la fois élégant, graphiquement intégré dans le visuel du blog ET totalement indépendant, avec des liens php « en dur »,
sur lequel je peux ouvrir une session, jongler avec les tableaux ‘get’ & ‘post’, logguer des visiteurs inscrits dans une base de données indépendante, etc.
Seulement, voilà.
Je n’arrive pas à satisfaire aux « cahier des charges » que je me suis fixé,
à savoir intégrer des commentaires dans les pages de cet espace.
J’ai essayé de tordre et manipuler ‘wp_comments’ dans tous les sens pour l’intégrer dans mon footer : RIEN !
Wp se refuse obstinément à ouvrir les commentaires.
Et s’il y a plein de doc sur Google sur « Comment désactiver les commentaires »,
!
il n’y a RIEN sur « Comment forcer l’ouverture des commentaires »
Il me semble vous voir avoir de bonnes connaissances et un bon savoir-faire,
pourriez-vous svp m’aider ?
Merci infiniment,
Bien cordialement,
Michael
http://www.ibredutabac.com
Bonjour,
Je reviens faire les questions et les réponses aussi…
En fait, ca y est, j’ai trouvé la solution
C’était d’une simplicité enfantine…
Si cela vous intéresse, faites-moi signe, je vous raconterai.
Bien cordialement.
Bonjour,
Désolé pour la réponse tardive, juste quelques jours de congés…
Content que vous ayez trouvé la solution, cela m’intéresse de savoir comment vous avez fait. Contrairement à ce que l’on peut croire je ne suis pas un expert en WordPress, comme je l’ai indiqué en début de cette série sur la création de thème WordPress il s’agit juste d’une reprise en français d’articles publiés par Ian Stewart (avec son autorisation évidemment).