it-swarm.com.de

Benutzer zur Homepage umleiten, wenn keine andere Umleitung angegeben ist

Grundsätzlich möchte ich einen Code schreiben, der entscheidet, ob ein Benutzer zur Startseite der Website oder zu der Seite weitergeleitet wird, von der der Benutzer vor dem Anmelden gekommen ist.

Ich habe diesen Code, der Benutzer erfolgreich auf die Seite umleitet, von der sie gekommen sind, wenn eine Umleitung zurück auf diese Seite angegeben wurde. Wenn jedoch keine bestimmte Umleitungsanforderung vorliegt, werden Benutzer an das Back-End-Administrationsfenster gesendet.

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

Wie kann ich dies optimieren, damit die Benutzer das Admin-Panel nicht sehen können?

2
Philipp K

OK, schauen wir uns genauer an, wie dieser Hook in WP verwendet wird ... Er wird in wp-login.php (in Zeile 901) ausgelöst:

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

Die Variable, die Sie $request genannt haben (was ein bisschen irreführend ist, sie sollte $requested_redirect_to heißen), sollte leer sein, damit Ihr Code einwandfrei funktioniert. Aber ... es gibt immer ein aber;)

Wenn Sie wp-login.php aufrufen und sich das Anmeldeformular genauer ansehen, werden Sie feststellen, dass darin eine versteckte Eingabe mit dem Namen redirect_to enthalten ist und die URL von wp-admin enthält. Also ist diese Bedingung if($request){ immer wahr.

Sie können dies folgendermaßen beheben:

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