rediriger les visiteurs vers une page de maintenance temporaire

11

Pour empêcher mes visiteurs de voir une version endommagée de mon site lors de la maintenance et pour les avertir 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 à coder 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. De nombreux plugins offrent cette fonctionnalité, mais je recherche une solution en code uniquement.

    
posée NewUser 26.11.2014 - 14:37

2 réponses

21

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

Lorsque vous mettez à niveau un plugin ou un noyau WordPress à partir d'un tableau de bord WP, WordPress entre en mode maintenance: il essaie de charger un fichier nommé maintenance.php situé dans le dossier de contenu (généralement /wp-content ), et si ce fichier n'y est pas , 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 souhaité. Pour le style, je vous suggère de mettre CSS dans le fichier lui-même, en utilisant <style> tag; En général, 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 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 put:

    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é, chargez le fichier créé au point 1 et quittez-le.

    Si vous souhaitez autoriser uniquement 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 pourriez-vous 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 un tiers, utilisez un thème enfant ; 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.

réponse donnée gmazzap 26.11.2014 - 16:05
2

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();
    }
});

NOTES

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.

    
réponse donnée a.barbieri 10.03.2017 - 16:52

Lire d'autres questions sur les étiquettes