web-dev-qa-db-fra.com

Rediriger l'utilisateur vers la page d'accueil si aucune autre redirection n'est spécifiée

En gros, je veux écrire un code qui décide de rediriger un utilisateur vers la page d'accueil du site Web ou vers la page d'origine de l'utilisateur avant de se connecter.

J'ai ce code qui redirige avec succès les utilisateurs vers la page d'où ils viennent si une redirection vers cette page a été spécifiée. Cependant, s'il n'y a pas de demande de redirection spécifique, les utilisateurs sont envoyés au panneau d'administration principal.

<?php
function login_redirect( $redirect_to, $request, $user ) {

    if (isset($user->roles) && is_array($user->roles)) {

        if (in_array('subscriber', $user->roles)) {

            if($request){
                $redirect_to = $request;
            } else {
                $redirect_to =  home_url();
            }

        }
    }

    return $redirect_to;
}

add_filter( 'login_redirect', 'login_redirect', 10, 3 );

Comment puis-je modifier cela afin que les utilisateurs ne puissent pas voir le panneau d'administration?

2
Philipp K

OK, voyons comment ce crochet est utilisé dans WP ... Il est activé dans wp-login.php (à la ligne 901):

$requested_redirect_to = isset( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : '';
// ...
$redirect_to = apply_filters( 'login_redirect', $redirect_to, $requested_redirect_to, $user );

Ainsi, la variable que vous avez appelée $request (ce qui est un peu trompeur, elle devrait être appelée $requested_redirect_to) devrait être vide et votre code devrait donc fonctionner correctement. Mais ... Il y a toujours un mais;)

Si vous avez o wp-login.php et examinez de plus près le formulaire de connexion, vous verrez alors qu’il contient une entrée cachée appelée redirect_to et qu’elle contient une URL de wp-admin. Donc, cette condition if($request){ est toujours vraie.

Vous pouvez le réparer de cette façon:

function login_redirect( $redirect_to, $requested_redirect_to, $user ) {
    if ( isset($user->roles) && is_array($user->roles) ) {

        if ( in_array('subscriber', $user->roles) ) {

            if ( $requested_redirect_to && admin_url() != $requested_redirect_to ) {
                $redirect_to = $requested_redirect_to;
            } else {
                $redirect_to =  home_url();
            }

        }
    }
    return $redirect_to;
}
add_filter( 'login_redirect', 'login_redirect', 10, 3 );
2
Krzysiek Dróżdż