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?
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 );