Mode maintenance sans plugin avec WordPress

Prenons le scénario suivant : vous souhaitez créer un blog sous WordPress, que vous souhaitiez créer un thème personnalisé et que vous ne voulez pas vous embêter à utiliser un plugin (par exemple wp maintenance mode ou l’un de ses équivalents).

La question est : comment faire ? En fait, la réponse est simple et vraiment pas compliquée à mettre en œuvre, de plus, vous profiterez d’une liberté totale en ce qui concerne l’apparence finale de cette page. N’hésitez donc pas à innover.

Banalement, quand vous mettez WordPress ou vos plugins à jour, le mode maintenance basique est activé sous WordPress. Il consiste en un fichier à la racine du blog : .maintenance (notez le « . » qu’il ne faut pas oublier).

Ici, nous allons créer ce fichier manuellement. Ouvrez donc votre logiciel ftp favori (ou votre console si vous travaillez sur votre serveur en SSH), et rendez-vous à la racine de votre blog. Là, créez un nouveau fichier que vous nommerez donc « .maintenance ». Éditez le là encore avec votre éditeur de texte favori.

<?php
function utilisateurConnecte(){
    $connecte = false;
    foreach ((array) $_COOKIE as $cookie => $value){
        if (stristr($cookie, 'wordpress_logged_in_'))
            $connecte = true;
    }
    return $connecte;
}
if (!stristr($_SERVER['REQUEST_URI'], '/wp-admin')
&& !stristr($_SERVER['REQUEST_URI'], '/wp-login.php')
&& !utilisateurConnecte())
    $upgrading = time();
?>

Oula, ça fait beaucoup, on va peut-être décortiquer un peu tout ça…

Le code est décomposé en deux parties : la première, une simple fonction « utilisateurConnecte. Son fonctionnement est simple ; Si l’utilisateur est connecté, elle renverra true, sinon elle renverra false. Explications.

$connecte = false;

Ici, simple initialisation de variable, rien de compliqué donc. C’est la valeur de cette variable qu’on renverra à la fin.

    foreach ((array) $_COOKIE as $cookie => $value){
        if (stristr($cookie, 'wordpress_logged_in_'))
            $connecte = true;
    }

Ici aussi, rien de compliqué (rien n’est compliqué une fois qu’on a compris…). On regarde les cookies de l’utilisateur. On cherche à cibler celui commençant par wordpress_logged_in. Un cookie créé automatiquement à partir du moment ou l’on est connecté sur le site. D’ailleurs, vous pouvez actuellement vérifier si vous êtes connecté ou non sur ce site (méthode sous Firefox)

Cliquez ensuite sur « view cookies »

Et là, cherchez dans la liste. Si vous voyez un cookie commençant par wordpress_logged_in_ pour blog.menutmathieu.fr, c’est que vous êtes connecté. Ça reste la seule façon pour WordPress de connaître votre statut actuel sur le site. Du coup, si vous êtes connecté, on change la valeur de la variable initialisée précédemment à true, qu’on renvoie par la suite.

Derrière – c’est la deuxième partie du code -, il reste à bloquer l’accès à toutes les pages ou les utilisateurs non connectées ne pourront pas aller. Ici, si l’on se situe sur $_SERVER[‘REQUEST_URI’]/wp-admin, /wp-login ou encore que l’utilisateur est connecté (fonction précédente), les utilisateurs auront accès à ces pages et pourront se connecter. Ils auront ainsi un accès au site que les autres n’auront pas.

Ici, $_SERVER[‘REQUEST_URI’] va nous permettre de récupérer la première partie de l’URL du site. Dans le cas présent, il s’agira de blog.menutmathieu.fr (sans le « / » final !).

Notez donc également la fonction time(); qui permet d’empêcher l’accès au site. Si vous spécifiez un nombre, cela signifiera que l’utilisateur n’aura pas accès au site pendant le temps restant (en secondes) entre le moment de l’activation du script (son upload sur le serveur) et le moment ou la durée spécifiée sera terminée.

Voila un script assez simple qui n’autorise donc la connexion qu’aux membres autorisés. Néanmoins, nous pouvons améliorer tout ça pour que, par exemple, uniquement les administrateurs puissent se connecter au site : Ajoutons donc la fonction rangUtilisateur();

function rangUtilisateur(){
    global $current_user;
    $rang = array_shift($current_user->roles);
    return $rang;
}

On regarde donc le rang de l’utilisateur. S’il est administrateur, $rang nous retourne « administrator ». Plus qu’à ajouter ceci à notre grande condition pour obtenir le code final suivant :

<?php
function utilisateurConnecte(){
    $connecte = false;
    foreach ((array) $_COOKIE as $cookie => $value){
        if (stristr($cookie, 'wordpress_logged_in_'))
            $connecte = true;
    }
    return $connecte;
}

function rangUtilisateur(){
    global $current_user;
    $rang = array_shift($current_user->roles);
    return $rang;
}

if (!stristr($_SERVER['REQUEST_URI'], '/wp-admin')
&& !stristr($_SERVER['REQUEST_URI'], '/wp-login.php')
&& !utilisateurConnecte()
&& !rangUtilisateur() == "administrator")
    $upgrading = time();
?>

Avec ça, vous avez déjà une bonne base pour bloquer l’accès aux utilisateurs de votre blog. N’hésitez donc pas à tester ce que ça donne.
« Temporairement indisponible pour cause de maintenance ».
Bon, ok, il y a un souci quelque part ou bien ? Non non, ceci est tout à fait normal… Il nous reste maintenant à créer une page maintenance.php dans le répertoire wp-content de votre blog. Si la page est détectée par WordPress, ce sera celle-ci qui sera chargée par défaut à la place de la page ne contenant que ce que vous devez avoir actuellement. Du coup il ne faut pas vous priver pour y mettre ce que vous voulez : textes, images, scripts, feuille de styles… tout est possible. Tout ce qu’il vous faudra c’est d’avoir la ligne suivante en haut de votre fichier (première ligne) :

<?php header( "$protocol 503 Service Unavailable", true, 503 ); ?>

L’intérêt ? Pouvoir permettre aux moteurs de recherche (principalement) de détecter cette page comme étant une page avec erreur 503. Plus commode d’un point de vue référencement. Après pour le reste, c’est à vous de jouer.

Du coup voila, vous avez toutes les cartes en main pour réaliser votre propre page de maintenance, le tout sans plugin, en pouvant personaliser dans le détail tout ce dont vous avez besoin. Si vous avez des questions, suggestions, remarques, n’hésitez surtout pas à les mettre juste en dessous dans les commentaires.

Envie de partager cet article ? Google+

Date de sortie : 12 mars 2013
Auteur : Bardyl
Consultations : 5105
Commentaires : 0
Catégorie : Développement

Bardyl, une histoire de pousin.

Poussin de son état, Mathieu Menut (alias Bardyl ou Bardylette suivant les lieux) est un simple passionné du Web depuis de nombreuses années. Mathieu aime tout ce qui attrait au développement, au graphisme, référencement... Il s'intéresse à plus ou moins tout et prône la généralisation des 35 heures par jour.

Twitter : @Bardylette / web : menutmathieu.fr