Ce tutoriel WordPress est entièrement gratuit.
Merci de désactiver votre bloqueur de pub ! =)

Conditional Tags

Afficher du différents contenu d'un même template selon certaines conditions.

Jusqu’à présent, on a laissé le système de templates de WordPress gérer les différents cas de navigation dans le site :

Mais qu’en est-il des includes ? Ne sont-ils pas exactement les mêmes pour tous les templates qui les utilisent ? Pour l’instant, oui.

On va y remédier.

Des conditions pour les includes

Rappelez-vous… On a mis un <h1> pour le titre d’un Post sur la page single.php et du coup, on avait deux <h1> sur la même page (en comptant celui du header). Même si le W3C ne l’interdit pas, c’est une bien mauvaise pratique. Et un SEO Guru m’a déjà dit qu’il était préférable d’avoir des titres différents selon les pages que l’on visite. Et le <h1> joue ce rôle : c’est en quelque sorte le titre de la page. Du coup, en arrivant sur une page single.php, il n’y a qu’un seul Post, et le titre de la page est logiquement celui du Post, et pas celui du site.

On va reprendre le header.php pour l’améliorer :

<!DOCTYPE html>
<html <?php language_attributes(); ?>>
  <head>
    <meta charset="<?php bloginfo('charset'); ?>">
    <title><?php the_title(); ?></title>
    <link rel="stylesheet" href="<?php bloginfo('stylesheet_url'); ?>" type="text/css">
    <?php wp_head(); ?>
  </head>
  <body>
    <div>
      <header>
        <?php if (is_single()) : ?>
          <p><a href="<?php bloginfo('home'); ?>"><?php bloginfo('name'); ?></a></p>
          <p><?php bloginfo('description'); ?></p>
        <?php else : ?>
          <h1><a href="<?php bloginfo('home'); ?>"><?php bloginfo('name'); ?></a></h1>
          <h2><?php bloginfo('description'); ?></h2>
        <?php endif; ?>
      </header>

On vient d’utiliser notre premier Conditional Tag. Il en existe énormément, et permettent, entre autres, de savoir :

La sidebar est un fichier très friand de ces Conditional Tags.

Cumuler pour mieux régner

Comme pour toute condition PHP, Il est tout à fait possible de cumuler plusieurs conditions en les imbriquant.

<?php if (is_user_logged_in()) { ?>
  <?php if (is_home()) { ?>
    <p>Hello toi !</p>
  <?php } ?>
<?php } ?>

Les opérateurs usuels sont bien sûr acceptés.

if ( is_home() || is_single() ) {
  the_content();
} else {
  the_excerpt();
}

Vous aurez remarqué que j’utilise ici des { accolades }. C’est juste pour vous montrer que l’on peut aussi utiliser de simples accolades, et c’est parfois plus pratique lors d’imbrication de conditions.

Eviter de se répéter

Le concept du DRY (cher notamment à ces Rubistes…) est toujours de rigueur, que ce soit en CSS, Python, ou dans le code PHP de notre thème.

Si l’on prend nos fichiers archive.php et category.php, ils sont quasiment identiques. Et pour cause : on a utilisé le premier pour créer le second. Il y a bien une raison à cette division : category.php contenait un bout de HTML supplémentaire qui contenait le nom de la catégorie (la fonction single_cat_title ). Et étant donné que archive.php était utilisé pour tout type d’archive (de date, de tag, de catégorie, de taxonomy…) mais que la fonction single_cat_title ne marchait pas pour toute (sans compter le mot « Catégorie » en dur dans le HTML), il fallait créer séparément category.php.

Mais avec ces Conditional Tags, quoi de plus simple de créer un bout de code conditionnel dans archive.php ?

<?php get_header(); ?>
<div class="main">
  <?php if ( is_category() ) : ?>
    <h1>Catégorie : <?php single_cat_title(); ?></h1>
  <?php endif; ?>
  <?php get_template_part('loop'); ?>
</div>
<?php get_sidebar(); ?>
<?php get_footer(); ?>

J’ai supprimé le query_posts('posts_per_page=20') qui n’était pas indispensable.
Supprimez category.php pour que WP utilise archive.php. Vous verrez que la partie « Catégorie : » ne s’affichera que lorsqu’une page de catégorie sera appelée.

Du coup, on peut imaginer un archive.php plus riche :

<?php get_header(); ?>
<div class="main">
  <?php if ( is_category() ) : ?>
    <h1>Catégorie : <?php single_cat_title(); ?></h1>
  <?php elseif ( is_tag() ) : ?>
    <h1>Mot-clef : <?php single_cat_title(); ?></h1>
  <?php elseif ( is_year() ) : ?>
    <h1>Année : <?php the_time('Y'); ?></h1>
  <?php elseif ( is_month() ) : ?>
    <h1>Mois : <?php the_time('F Y'); ?></h1>
  <?php elseif ( is_day() ) : ?>
    <h1>Jour : <?php the_time('j F Y'); ?></h1>
  <?php endif; ?>
  <?php get_template_part('loop'); ?>
</div>
<?php get_sidebar(); ?>
<?php get_footer(); ?>

Du coup, on évite de créer category.php, tag.php et date.php.

« Mais du coup bbx, on pourrait pas aller plus loin en utilisant uniquement index.php ? »

Petit scarabée, tu ne crois pas si bien dire…

Un seul index to rule them all

Admettons. Ce n’est pas quelque chose que j’ai déjà fait, mais admettons…
Admettons que l’on veuille regrouper tout notre système de templates en un seul fichier, est-ce bien possible ?

Oui c’est possible.

Du coup, étant donné que les includes header, loop, footer et sidebar seront appelés par un seul template (index.php), il sera inutile de créer des includes et donc préférable de mettre directement le code PHP de ces includes dans index.php.

Faites-le si vous le souhaitez, j’ai la flemme de faire la démonstration… Je vois d’ailleurs venir des problèmes de lisibilité du code, de maintenance, de performance…

Attardons nous plutôt sur les Widgets WordPress.