Quand on développe un thème WordPress ou un site entier, on a souvent envie (ou besoin) de bichonner un peu notre page d’accueil. Et pour ça, il faut bien mettre les mains dans le code du thème. Pourtant, s’il y a bien un point qui prête à confusion, c’est comment WordPress gère cette page d’accueil. Quel template est utilisé ? Comment savoir si on est sur l’accueil ? Sur le blog ? etc…

Le moins que l’on puisse dire, c’est que la majorité des explications que l’on trouve ne sont pas super claires. Que ce soit dans la documentation officielle, ou sur divers articles que l’on peut trouver, ce n’est pas toujours hyper transparent, et énormément de développeurs se trompent encore sur la façon dont WordPress traite votre page d’accueil.

Dans cet article, je vais essayer de dissiper un peu la confusion. J’espère y arriver, et pour ce faire, je vais essayer d’être le plus direct et simple possible.

WordPress et la template hierarchy

WordPress nous fournit plusieurs fonctions utiles pour déterminer sur quel type de page on se situe et quel type de contenu est affiché. On a is_single() qui va nous indiquer si on est bien sur une page d’article simple, is_archive() qui va nous indiquer si on est sur une page d’archives, etc…

En général, on peut aussi établir une correspondance entre ces fonctions et les templates présents dans votre thème. Par exemple, sur vos pages d’articles simples, is_single() renvoie true, et WordPress cherche à utiliser le modèle singular.php ou single.php s’ils sont présents. Sur une page simple, page.php renvoie true et WordPress cherche à utiliser page.php.

Je dis bien “WordPress cherche à utiliser” car le modèle choisi au final dépend fortement de votre thème. Si WordPress trouve un template plus spécifique qui peut être utilisé pour une certaine page, il le fera. Et de la même façon, s’il ne trouve pas le template générique standard à utiliser, il en prendra un plus générique, et se rabattant en dernier recours sur index.php.

Le but ici n’est pas de détailler la hierarchie des templates WordPress complètement, j’ai déjà écrit un article sur ce sujet et vous pouvez le lire ici : Comprendre son thème WordPress.

On va donc tenter de dissiper la confusion autour des fonctions is_front_page() et is_home() et aussi autour des templates front-page.php et home.php, car leur logique, malgré toutes les explications tordues ou confuses qu’on peut trouver sur internet, est en réalité ultra simple.

is_front_page() et is_home()

La fonction is_front_page() renvoie true si vous êtes sur l’url “nue” de votre domaine (https://example.com, ou https://monsite.fr), et ce quel que soit votre réglage de page d’accueil et quel que soit le contenu affiché. C’est tout. Rien de plus.

La fonction is_home() renvoie true si vous êtes sur la page listant vos articles (votre blog), quel que soit votre réglage de page d’accueil.

Ce n’est pas plus compliqué que ça.

front-page.php et home.php

Si votre thème inclut un fichier home.php, alors ce modèle sera utilisé pour la page listant vos articles (votre blog) quel que soit votre réglage de page d’accueil.

Si votre thème inclut un fichier front-page.php alors ce modèle sera utilisé à l’url nue de votre domaine (https://example.com, ou https://monsite.fr), quel que soit votre réglage de page d’accueil et quel que soit le contenu affiché.

Et c’est tout !

Vraiment, il n’y a rien d’autre à savoir. Si vous voulez jouer/expérimenter un peu, ou si vous ne me croyez pas sur parole, lisez la suite. Mais honnêtement, les deux sections au dessus résument TOUT ce qu’il y a à savoir. Si vous êtes téméraire, continuez la lecture. Sinon sautez directement à la conclusion. Sans rancune.

Pour les courageux qui veulent s’amuser

Si vous voulez creuser un peu, on peut s’amuser sur un site local. Créez un site local de test, et créez un thème enfant du thème par défaut.

N’utilisez pas Twenty Seventeen pour vos tests ! Ce thème a un modèle de page d’accueil front-page.php et a sa propre logique qui vient court-circuiter un peu la hierarchie des templates de WordPress. Cela va tout fausser.

Dans votre fichier functions.php ou dans un petit plugin, ajoutez le code suivant :

add_action( 'wp_body_open', 'twentytwenty_child_page_template' );
/**
 * Displays data about the `is_home()` and `is_front_page()` function, and
 * displays the name of the current template 
 */
function twentytwenty_child_page_template(){
    global $template;
    echo '<div style="padding: 10px">';
    
    if( is_home() ){
        printf( '<h2>This is the blog listing page</h2>' );
    }
    if( is_front_page() ){
        printf('<h2>This is the front page of your site.</h2>');
    }
    printf( '<p><code>is_home()</code> returns : <code>%s</code></p>', is_home() ? 'true' : 'false' );
    printf( '<p><code>is_front_page()</code> returns : <code>%s</code></p>', is_front_page() ? 'true' : 'false' );
    printf( '<p>The template used is : <code>%s</code></p>', basename( $template ) );
    
    echo '</div>';
}

Cette fonction se hooke sur wp_body_open(), juste après la balise <body> et affiche un titre si vous êtes sur votre blog, ou à la racine de votre domaine. Aussi, elle affiche le retour des fonctions is_home() et is_front_page() ainsi que le modèle de page utilisé.

Sur mon site local, j’ai mis la page “The New UMoMA Opens its Doors” en tant que page d’accueil, et mes articles s’affichent sur la page “Blog”. Cela donne ça :

La page d'accueil de mon site test. is_front_page() renvoie true.
La page d’accueil de mon site test. is_front_page() renvoie true.
La page affichant le blog. is_home() renvoie true.
La page affichant le blog. is_home() renvoie true.

Sur ma page d’accueil, is_front_page() renvoie true. Normal. Aussi, c’est une page standard, donc is_home() renvoie false. Normal. Le template singular.php est utilisé. Normal, ce thème utilise un seul template singular.php en lieu et place de single.php et page.php (qui aurait dû être utilisé).

Su ma page “Blog”, is_front_page() renvoie false. Normal, on n’est plus à la racine du site. La fonction is_home() renvoie true. Normal car on est sur la page listant les articles.

Par contre, vous pouvez voir que c’est index.php qui est le modèle utilisé sur le blog. Normal, car le thème ne contient pas de home.php. Créez un fichier home.php dans votre thème enfant, copiez-collez-y le code de index.php et vous verrez que c’est celui-ci qui est utilisé pour la page listant les articles, quel que soit le réglage de la page d’accueil.

Jusque là tout va bien.

Maintenant, on va tout péter.

Maintenant, créez un fichier front-page.php dans votre thème enfant. BOOM.

Explosion

Vous allez remarquer que c’est ce modèle qui est utilisé à la racine de votre site, que vous ayez demandé d’afficher une page simple, ou la liste de vos derniers articles.

D’ailleurs, même si vous voulez afficher votre blog sur la page d’accueil et qu’un fichier home.php est présent dans le thème, c’est front-page.php qui sera utilisé s’il est là !

Par contre, les fonctions is_front_page() et is_home() n’ont pas cessé de fonctionner (haha…). is_front_page() renvoie true sur la page affichée à la racine de votre domaine, et is_home() renvoie true sur la page listant vos articles, qu’elle soit en accueil ou non.

Ce qu’il faut retenir simplement c’est que front-page.php court-circuite toute la hiérarchie des templates de WordPress ! S’il est présent, il sera obligatoirement utilisé sur la page racine du site.

C’est pour ça que si vous voulez publier un thème sur le répertoire officiel, je déconseille en général d’inclure un template front-page.php, car il devra gérer élégamment le cas où l’utilisateur a choisi une page statique ET celui où il a choisi d’afficher son blog en accueil. Par contre, pour un client avec une page d’accueil sophistiquée, pas de souci.

Conclusion

Si la section précédente et vos petites expériences vous ont un peu embrouillé, voici un résumé clair.

  • is_front_page() renvoie true à la racine de votre domaine, quel que soit votre réglage de page d’accueil et quel que soit le contenu affiché.
  • is_home() renvoie true sur la page listant vos articles, quel que soit votre réglage de page d’accueil.
  • home.php est utilisé sur la page listant vos articles, qu’elle soit en accueil ou non.
  • front-page.php court-circuite la hiérarchie des templates (y compris la ligne précédente) et est utilisé sur la page affichée à la racine de votre domaine, quel que soit votre réglage de page d’accueil et quel que soit son contenu.

Au final, ce n’est pas si compliqué.

J’espère avoir clarifié cette problématique et que la gestion de la page d’accueil par WordPress n’a plus de secret pour vous ! Si vous avez encore un souci, n’hésitez pas à me poser vos questions en commentaires ! Et si vous voulez bien débuter le développement pour WordPress, inscrivez-vous juste en dessous 😉 !