Séparer son site et son weblog propulsé par WordPress

Le but de cet article est de permettre l’utilisation de WordPress comme un gestionnaire de contenu faisant apparaitre un site classique et un blog de manière distincte.

Exemple de plan du site

Avec cette solution l’arborescence des pages WordPress sont visibles à la racine du site alors que les articles du blog apparaisse dans un dossier nommé blog.

Pour donner au weblog son propre répertoire dans l’arborescence des pages, il faut d’abord modifier les permaliens pour que les articles soient publiées dans un sous-répertoire en changeant la structure pour faire apparaitre un sous répertoire blog par exemple. La structure des permaliens devrait ressembler à ceci : /blog/%year%/%monthnum%/%day%/%postname%.

Ensuite vous pourrez remarquer que si vous allez à l’adresse http://www.votresite.com/blog une erreur 404 va apparaitre. C’est parce que WordPress n’interprète pas ce répertoire comme l’accueil du weblog. Pour cela il faut ajouter une règle de redirection pour ce répertoire en utilisant le filtre rewrite_rules_array qui permet d’ajouter des règles de redirections. Nous allons donc utiliser les point d’entrés fournis par WordPress pour les plugins.

Dans un thème WordPress la page d’accueil du weblog utilise le gabarit home.php si celui-ci existe, sinon c’est le fichier index.php qui est utilisé. Nous allons ajouter une règle permettant à WordPress d’afficher un autre gabarit quand nous sommes sur l’accueil du site et de rediriger vers le gabarit de l’accueil classique du blog lorsque nous sommes dans notre répertoire /blog/.

Pour cela il faut ajouter un fichier functions.php dans le thème, si celui-ci n’existe pas déjà. Ainsi notre modification sera active pour notre thème uniquement et ne sera pas dépendante de l’activation ou non d’un plugin. Cela évite les mauvaises manipulations et de voir notre mise en page totalement désordonnées en cas de désactivation du plugin ou de changement de thème.

Il va falloir mettre en place 2 fonctions pour gérer cette fonctionnalité :

Pour éviter que nos fonctions entrent en collision avec celles de WordPress, celles-ci seront encapsulées dans une classe. De la même manière que je le préconise pour les plugins.

  function add_rules($rules) {
// Récupération des informations de redirections d'adresse
    global $wp_rewrite;
// Génération des liens pour les commentaires, pagination, etc.
    $new_rules = $wp_rewrite->generate_rewrite_rules($wp_rewrite->front);
// Génértation de la règle de redirection principale
    $global_home_rule = substr($wp_rewrite->front,1).'?';
    $new_rules[$global_home_rule] = "index.php";

// ajout des nouvelles règles de redirection
    $rules += $new_rules;
    return $rules;
  }

  function redirect() {
//Récupération du contexte
    global $wp;
// S'il s'agit de l'accueil et de la racine du site charger le gabarit homepage.php
    if(is_home() and ($wp->matched_rule == '')) {
      if(file_exists(dirname(__FILE__).'/homepage.php')) {
        include(dirname(__FILE__).'/homepage.php');
      } else {
        include(get_query_template('homepage'));
      }
// La page est affichée on sort
      exit;
    }
  }

Cet article a été publié le 12/10/2006 par Seb