Người dùng chuyển hướng đến URL đích sau khi đăng nhập


7

Kịch bản: nếu người dùng không đăng nhập, người dùng chuyển hướng để tùy chỉnh trang đăng nhập và chuyển hướng lại đến trang đích sau khi đăng nhập. Tôi không sử dụng chức năng hoặc plugin. Mã này để hạn chế trang:

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

thành công để đăng nhập người dùng nhưng trong trang đăng nhập, URL thay đổi thành? page = đăng nhập và không thể chuyển hướng URL đến trang đích. Làm thế nào để làm cho nó? Bất cứ ai có thể giúp đỡ, xin vui lòng?

Câu trả lời:


3

Tôi đã làm một cái gì đó tương tự gần đây.

1. Nếu người dùng chưa đăng nhập, tôi đã bắt URL của trang đích / mong muốn và thêm nó dưới dạng truy vấn vào URL của trang đăng nhập.

2. Chuyển hướng người dùng đến trang đăng nhập.

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. Sau đó, bạn có thể lọc URL mà người dùng được chuyển hướng đến sau khi đăng nhập, sử dụng login_redirectbộ lọc. Chỉ cần kiểm tra sự hiện diện của var truy vấn đã thêm trước đó của bạn:

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

Tôi đã làm điều này với trang đăng nhập WooC Commerce, vì vậy tôi đã lọc bộ lọc chuyển hướng đăng nhập độc quyền của họ, nhưng login_redirectlà phiên bản mặc định của WP giống nhau nên tôi nghĩ nó nên hoạt động, nhưng chưa thử nghiệm.


2

Đoạn mã của bạn sẽ hoạt động tốt.

Trước hết, hình thức đăng nhập tùy chỉnh của bạn có thể không tôn trọng redirect_to. wp-login.phpkhông, nhưng bạn cũng sẽ phải gửi redirect_tođối số để wp-login.phpgửi biểu mẫu. Hiển thị mã cho mẫu đăng nhập của bạn.

Bạn cần cẩn thận với cách bạn sử dụng wp_redirect. Nó hoạt động bằng cách gửi các tiêu đề:

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

Vì vậy, nếu các phần của trang của bạn đã được tải và bạn không sử dụng bộ đệm đầu ra , nó sẽ không hoạt động. Headers already sentvà tất cả các doanh nghiệp đó.

Nếu đó là trường hợp bạn có thể tốt hơn là chỉ hiển thị một thông báo có liên kết đến biểu mẫu đăng nhập hoặc hiển thị biểu mẫu đó (ví dụ. wp_login_form).

Thứ hai, bạn phải luôn gọi exithoặc diesau khi sử dụng wp_redirectđiều này khiến cho việc thực thi tập lệnh PHP (ví dụ: WordPress) kết thúc, gửi tiêu đề và bảo lãnh. Nếu không, những thứ tiếp theo xuống trang có thể giết chết các tiêu đề chuyển hướng của bạn.

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

Cuối cùng, nếu bạn định đưa máy chủ vào redirect_toURL của mình, bạn nên bao gồm giao thức.

Bạn cũng có thể chỉ cần sử dụng $_SERVER['REQUEST_URI'].

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

0

Xin lưu ý: wp_redirect sẽ không được gọi nếu trang đã bắt đầu, vì vậy hãy đảm bảo gọi nó cao hơn.

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


"Wp_redirect sẽ không được gọi nếu trang đã bắt đầu". Có vẻ như điều đó không đúng. Không có kiểm tra wp_redirectđể xem liệu đầu ra đã bắt đầu chưa, v.v.
chrisguitarguy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.