Rediriger les visiteurs vers une page de maintenance temporaire

13

Pour empêcher mes visiteurs de voir une version cassée de mon site pendant 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 utilisable sur n'importe quel site, sans URL de codage en dur.

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

Nouvel utilisateur
la source
copier le code d'un plugin?
Mark Kaplun
Pourquoi réinventer la roue? Utilisez un plugin. Plus précisément, l'accès restreint au site.
vancoder
2
J'essaie d'utiliser le moins de plugins possible pour mon thème personnalisé. "Moins c'est plus";)
Nouvel utilisateur

Réponses:

24

WordPress a une fonctionnalité intégrée pour gérer le mode de maintenance.

Lorsque vous mettez à niveau un plugin ou un noyau WordPress à partir du tableau de bord WP, ​​WordPress passe en mode maintenance: il essaie de charger un fichier nommé maintenance.phpsitué dans le dossier de contenu (généralement /wp-content), et si ce fichier n'est pas là, WP affiche un message par défaut.

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

Comment

  1. Créez d'abord le maintenance.phpfichier 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 <style>tag; généralement ce n'est pas un bon conseil, mais dans ce cas, il vous donne la possibilité d'utiliser le fichier pour le mode de maintenance géré par WordPress, quand aucun thème n'est chargé (et le thème peut être mis à niveau, donc pas 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.phpposition:

    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.

    Si vous souhaitez autoriser uniquement les utilisateurs dotés de capacités spécifiques, utilisez current_user_can('capability_to_allow')plutôt que is_user_logged_in(). Voir Codex pour plus d'informations.

    Vous pouvez peut-être ajouter maintenance.phpun lien vers la page de connexion; de cette façon, un utilisateur non connecté peut cliquer dessus sans avoir à saisir 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 façon, 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.phpet mettez-le:

    define('IN_MAINTENANCE', true);

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

gmazzap
la source
Ceci est une réponse très détaillée et un excellent moyen de résoudre mon problème avec moins d'effort que possible! Je vais l'essayer plus tard et accepter la réponse si cela fonctionne. Merci beaucoup GM!
NewUser
Salut GM - j'utilise un répertoire personnalisé "wp-content" mais je ne sais pas comment changer le WP_CONTENT_DIR ..... pour le faire fonctionner? meilleur
NewUser
Vieux fil, je sais .. mais juste au cas où quelqu'un aurait besoin de cette réponse, c'est aussi simple que d'ajouter define('WP_CONTENT_DIR','/url/to/define/');votre wp-config.phpfichier.
OGM
@gmazzap, c'est incroyable. Cela signifie-t-il que si et seulement si vous êtes déjà connecté (par exemple en tant qu'administrateur), vous pourrez toujours accéder à la console d'administration et y apporter des modifications?
paranza
@paranza oui, correct.
gmazzap
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 avoir en un seul endroit, vous pouvez déposer les lignes suivantes dans le function.phpfichier et créer un maintenance.phpfichier dans votre répertoire de thèmes.

Cela est particulièrement utile si votre référentiel Git pointe uniquement vers 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 header('HTTP/1.1 503 Service Temporarily Unavailable');car celui ci-dessus ne fonctionnait pas pour moi.

a.barbieri
la source
Je peux voir le point de cela, mais notez quelques choses - WordPress n'utilisera pas ce fichier de maintenance dans le répertoire du thème lors de sa propre maintenance (donc ce serait une bonne idée de créer wp-content / maintenance.php comme bien et ensuite exiger () votre thème en un); définir également des constantes comme celle-ci se trouve généralement dans votre wp-config.php ou en tant que variable d'environnement, plutôt que d'avoir à gérer le mode de maintenance en étant activé / désactivé en effectuant des validations. :)
Tim Malone
@TimMalone, je suis d'accord. À la fin, c'est une solution de contournement qui fonctionnera bien sur une courte période de temps, pendant que vous (développeur) effectuez toutes les mises à jour.
a.barbieri