wake-up-neo.net

Benutzer leiten nach der Anmeldung zur Ziel-URL weiter

Szenario: Wenn sich der Benutzer nicht anmeldet, leiten Sie den Benutzer um, um die Anmeldeseite anzupassen, und leiten Sie nach der Anmeldung erneut zur Zielseite. Ich benutze keine Funktion oder kein 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 zu? page = login und die URL kann nicht zur Zielseite umgeleitet werden. Wie man es macht? Könnte jemand helfen, bitte?

7
Juan Lie

Ich habe in letzter Zeit etwas Ähnliches gemacht.

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

2. Leiten Sie den Benutzer auf die Anmeldeseite um.

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 die URL, zu der der Benutzer nach der Anmeldung umgeleitet wird, mithilfe des Filters login_redirect filtern. Prüfen Sie einfach, ob Ihre zuvor hinzugefügte Abfragevariable 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 deren proprietären Login-Umleitungsfilter gefiltert, aber login_redirect ist die WP Standardversion derselben, sodass ich denke es sollte funktionieren, aber Port habe es nicht getestet.

3
helgatheviking

Ihr Schnipsel sollte gut funktionieren.

Zunächst wird in Ihrem benutzerdefinierten Anmeldeformular möglicherweise redirect_to nicht berücksichtigt. wp-login.php funktioniert, aber Sie müssen das Argument redirect_to auch an die Übermittlung des Formulars wp-login.php senden. Zeigen Sie den Code für Ihr Anmeldeformular an.

Sie müssen vorsichtig sein, wie Sie wp_redirect verwenden. 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 Teile Ihrer Seiten bereits geladen sind und Sie Ausgabepufferung nicht verwenden, funktioniert dies nicht. Headers already sent und das ganze Geschäft.

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

Zweitens sollten Sie immer exit oder die aufrufen, nachdem Sie wp_redirect verwendet haben. Dies bewirkt, dass die Ausführung des Skripts PHP (z. B. WordPress) beendet wird und Header und Kaution gesendet werden. Andernfalls können weiter unten auf der Seite die Umleitungsheader beschädigt werden.

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

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

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

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

Bitte beachten Sie: wp_redirect wird nicht aufgerufen, wenn die Seite gestartet wurde. Rufen Sie sie daher unbedingt 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

0
AnupRaj