Benutzer leitet nach der Anmeldung zur Ziel-URL weiter

7

Szenario: Wenn sich der Benutzer nicht anmeldet, leitet er um, um die Anmeldeseite anzupassen, und leitet nach der Anmeldung erneut zur Zielseite um. Ich benutze keine Funktion oder Plugin. Dieser Code zur Einschränkungsseite:

if (!is_user_logged_in()){ wp_redirect( get_option('home') . '?redirect_to=' . esc_url($_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]) );
}

erfolgreich zur Benutzeranmeldung, aber auf der Anmeldeseite ändert sich die URL in? page = login und die URL wird nicht zur Zielseite umgeleitet. Wie man es macht? Könnte jemand helfen, bitte?

Juan Lie
quelle

Antworten:

3

Ich habe kürzlich etwas Ähnliches gemacht.

1. Wenn der Benutzer nicht angemeldet ist, habe ich die URL der gewünschten / Zielseite erfasst und sie als Abfragearg zur URL der Anmeldeseite hinzugefügt.

2. Leiten Sie den Benutzer zur Anmeldeseite weiter.

function wpa_59205_redirect(){
    global $post;
    if ( ! is_user_logged_in() ) {
                // this will tack on the current page's url as a query arg for the login page's url
        $redirect = add_query_arg( 'redirect_to', get_permalink( $post->ID ), $url_of_your_login_page_here );
                // redirect to the login page
        wp_redirect( $redirect );
        exit();
    }
}
add_action( 'template_redirect', 'wpa_59205_redirect' );

3. Anschließend können Sie mithilfe des login_redirectFilters die URL filtern, zu der der Benutzer nach der Anmeldung umgeleitet wird . Überprüfen Sie einfach, ob Ihre zuvor hinzugefügte Abfrage var vorhanden ist:

function wpa_59205_login_redirect( $redirect_to ){
    if( isset( $_REQUEST['redirect_to'] ) ) {
        return $_REQUEST['redirect_to'];
    } else {
        return $redirect_to;
    }
}
add_filter( 'login_redirect', 'wpa_59205_login_redirect');

Ich habe dies mit einer WooCommerce-Anmeldeseite gemacht, also habe ich ihren proprietären Login-Umleitungsfilter gefiltert, aber es login_redirectist die WP-Standardversion derselben, daher denke ich, dass es funktionieren sollte, habe es aber nicht getestet.

Helgatheviking
quelle
2

Ihr Snippet sollte gut funktionieren.

Zunächst einmal wird Ihr benutzerdefiniertes Anmeldeformular möglicherweise nicht berücksichtigt redirect_to. wp-login.phptut, aber Sie müssen das redirect_toArgument auch an die wp-login.phpFormularübermittlung senden . Zeigen Sie den Code für Ihr Anmeldeformular an.

Sie müssen vorsichtig sein, wie Sie verwenden wp_redirect. Es funktioniert durch das Senden von Headern:

<?php
/**
 * Redirects to another page.
 *
 * @since 1.5.1
 * @uses apply_filters() Calls 'wp_redirect' hook on $location and $status.
 *
 * @param string $location The path to redirect to
 * @param int $status Status code to use
 * @return bool False if $location is not set
 */
function wp_redirect($location, $status = 302) {
    global $is_IIS;

    $location = apply_filters('wp_redirect', $location, $status);
    $status = apply_filters('wp_redirect_status', $status, $location);

    if ( !$location ) // allows the wp_redirect filter to cancel a redirect
        return false;

    $location = wp_sanitize_redirect($location);

    if ( !$is_IIS && php_sapi_name() != 'cgi-fcgi' )
        status_header($status); // This causes problems on IIS and some FastCGI setups

    header("Location: $location", true, $status);
}

Wenn also Teile Ihrer Seiten bereits geladen wurden und Sie keine Ausgabepufferung verwenden , funktioniert dies nicht. Headers already sentund das ganze Geschäft.

In diesem Fall ist es möglicherweise besser, nur eine Nachricht mit einem Link zum Anmeldeformular anzuzeigen oder das Formular selbst anzuzeigen (z. B. wp_login_form).

Zweitens sollten Sie immer aufrufen exitoder dienach wp_redirectdieser Verwendung wird die Ausführung des PHP-Skripts (z. B. WordPress) beendet, Header gesendet und Kaution. Andernfalls können Dinge weiter unten auf der Seite Ihre Umleitungsheader zerstören.

<?php
wp_redirect(site_url('wp-login.php'));
exit;

Wenn Sie den Host in Ihre redirect_toURL aufnehmen möchten, sollten Sie das Protokoll einschließen.

Sie können auch einfach verwenden $_SERVER['REQUEST_URI'].

<?php
$url = add_query_arg('redirect_to', $_SERVER['REQUEST_URI'], site_url('wp-login.php'));
wp_redirect($url);
exit;
chrisguitarguy
quelle
0

Bitte beachten Sie: wp_redirect wird nicht aufgerufen, wenn die Seite gestartet wurde. Rufen Sie sie daher höher auf.

<?php 

    if (!is_user_logged_in()){
        $current_url = $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"];
        wp_redirect( wp_login_url( $current_url ) ); 
        exit;
    }
?> 

wp_redirect: http://codex.wordpress.org/Function_Reference/wp_redirect

wp_login_url: http://codex.wordpress.org/Function_Reference/wp_login_url

AnupRaj
quelle
"wp_redirect wird nicht aufgerufen, wenn die Seite gestartet wurde". Scheint nicht so, als ob das wahr wäre. Es gibt keine wp_redirect
Eincheckvorgänge