web-dev-qa-db-fra.com

Rediriger les visiteurs vers une page de maintenance temporaire

Pour empêcher mes visiteurs de voir une version endommagée de mon site lors de la maintenance et pour les informer des mises à jour, je souhaite les rediriger automatiquement vers une page de maintenance temporaire. Je recherche une solution portable pouvant être utilisée sur n'importe quel site, sans URL à codage en dur.

Les administrateurs connectés (ou un autre niveau d'utilisateur de choix) devraient avoir un accès complet au back-end et au front-end. Beaucoup de plugins offrent cette fonctionnalité, mais je recherche une solution en code uniquement.

12
NewUser

WordPress intègre une fonctionnalité permettant de gérer le mode maintenance.

Lorsque vous mettez à niveau un plug-in ou un noyau WordPress à partir du tableau de bord WP, WordPress entre en mode maintenance: il tente de charger un fichier nommé maintenance.php situé dans le dossier de contenu (généralement /wp-content), et si ce fichier n'existe WP affiche un message par défaut.

Je vous suggère d'utiliser ce fichier. Ainsi, vous serez cohérent pour votre maintenance déclenchée manuellement et pour la maintenance gérée par WordPress.

Comment

  1. Tout d’abord, créez le fichier maintenance.php et mettez-y le contenu que vous souhaitez. Pour le style, je vous suggère de mettre CSS dans le fichier lui-même, en utilisant la balise <style>; généralement, ce n'est pas un bon conseil, mais dans ce cas, cela vous donne la possibilité d'utiliser le fichier pour le mode de maintenance géré par WordPress, lorsqu'un thème n'est pas chargé (et que le thème est en cours de mise à niveau, donc non fiable).

  2. Enregistrez le fichier que vous venez de créer dans le dossier de contenu (généralement /wp-content).

  3. Dans votre functions.php, mettez:

    add_action( 'wp_loaded', function() {
        global $pagenow;
        if(
            defined( 'IN_MAINTENANCE' )
            && IN_MAINTENANCE
            && $pagenow !== 'wp-login.php'
            && ! is_user_logged_in()
        ) {
            header( 'HTTP/1.1 Service Unavailable', true, 503 );
            header( 'Content-Type: text/html; charset=utf-8' );
            header( 'Retry-After: 3600' );
            if ( file_exists( WP_CONTENT_DIR . '/maintenance.php' ) ) {
                require_once( WP_CONTENT_DIR . '/maintenance.php' );
            }
            die();
        }
    });
    

    Ce code vérifiera une constante (voir le point suivant) et si l'utilisateur n'est pas connecté, charge le fichier créé au point n ° 1 et quitte.

    Si vous souhaitez n'autoriser que les utilisateurs dotés de fonctionnalités spécifiques, utilisez current_user_can('capability_to_allow') au lieu de is_user_logged_in(). Voir Codex pour plus d'informations.

    Peut-être que vous pouvez ajouter à maintenance.php un lien vers la page de connexion; De cette manière, un utilisateur non connecté peut cliquer dessus sans avoir à entrer manuellement l'URL de connexion dans la barre d'adresse.

    Si vous utilisez un thème développé par une tierce partie, utilisez un thème child ; De cette manière, vous pourrez mettre à jour le thème en toute sécurité sans perdre vos modifications.

  4. Lorsque vous souhaitez activer le mode maintenance, ouvrez votre wp_config.php et mettez-y:

    define('IN_MAINTENANCE', true);
    

    Après cela, lorsque vous êtes prêt à rendre votre site à nouveau public, supprimez simplement cette ligne ou remplacez true par false pour une réactivation plus facile.

24
gmazzap

La réponse précédente est complète et bien écrite. Quoi qu'il en soit, si vous êtes comme moi et que vous souhaitez tout regrouper au même endroit, vous pouvez supprimer les lignes suivantes dans le fichier function.php et créer un fichier maintenance.php dans votre répertoire de thèmes.

Ceci est particulièrement utile si votre référentiel Git pointe uniquement sur le répertoire du thème.

add_action( 'wp_loaded', function() 
{
    global $pagenow;

    // - - - - - - - - - - - - - - - - - - - - - - 
    // Turn on/off you Maintenance Mode (true/false)
    define('IN_MAINTENANCE', true);
    // - - - - - - - - - - - - - - - - - - - - - - 

    if(
        defined( 'IN_MAINTENANCE' )
        && IN_MAINTENANCE
        && $pagenow !== 'wp-login.php'
        && ! is_user_logged_in()
    ) {
        header('HTTP/1.1 503 Service Temporarily Unavailable');
        header( 'Content-Type: text/html; charset=utf-8' );
        if ( file_exists( get_template_directory() . '/maintenance.php' ) ) {
            require_once( get_template_directory() . '/maintenance.php' );
        }
        die();
    }
});

REMARQUES

J'ai changé l'en-tête en header('HTTP/1.1 503 Service Temporarily Unavailable'); car celui ci-dessus ne fonctionnait pas pour moi.

2
a.barbieri