Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WooCommerce - redirect to previous page after login

I've been searching for plugins and snippets which would handle it for hours, but no success. Every single answer doesn't work for me. I have "Log in" link in menu, leading to WooCommerce "My account" page, which shows login form. I want customers to return to page where "Log in" link was clicked after successful login.

wp_get_referer() doesn't return anything and $_SERVER["HTTP_REFERER"] returns my account page if put within function hooked to woocommerce_login_redirect (I used PHP debug console to check).

Here is my code:

// Redirect user after login.
add_filter( 'woocommerce_login_redirect', 'wc_custom_user_redirect', 10, 2 );
function wc_custom_user_redirect( $redirect, $user ) {
    // Get the first of all the roles assigned to the user
    $role = $user->roles[0];
    $dashboard = admin_url();       

    if (in_array($role, array('administrator', 'shop_manager', 'editor', 'author', 'contributor'))) {
        $redirect = $dashboard;         
    } elseif (in_array($role, array('customer', 'subscriber'))) {
        $redirect = $_SERVER["HTTP_REFERER"];          
    } else {
        $redirect = $_SERVER["HTTP_REFERER"];       
    }

    return $redirect;

}

Here is where filter which I used appears in WooCommerce code:

/** 
   * Process the login form. 
   */ 
  public static function process_login() { 
      $nonce_value = isset( $_POST['_wpnonce'] ) ? $_POST['_wpnonce'] : ''; 
      $nonce_value = isset( $_POST['woocommerce-login-nonce'] ) ? $_POST['woocommerce-login-nonce'] : $nonce_value; 

      if ( ! empty( $_POST['login'] ) && wp_verify_nonce( $nonce_value, 'woocommerce-login' ) ) { 

          try { 
              $creds = array( 
                  'user_password' => $_POST['password'],  
                  'remember' => isset( $_POST['rememberme'] ),  
 ); 

              $username = trim( $_POST['username'] ); 
              $validation_error = new WP_Error(); 
              $validation_error = apply_filters( 'woocommerce_process_login_errors', $validation_error, $_POST['username'], $_POST['password'] ); 

              if ( $validation_error->get_error_code() ) { 
                  throw new Exception( '<strong>' . __( 'Error:', 'woocommerce' ) . '</strong> ' . $validation_error->get_error_message() ); 
              } 

              if ( empty( $username ) ) { 
                  throw new Exception( '<strong>' . __( 'Error:', 'woocommerce' ) . '</strong> ' . __( 'Username is required.', 'woocommerce' ) ); 
              } 

              if ( is_email( $username ) && apply_filters( 'woocommerce_get_username_from_email', true ) ) { 
                  $user = get_user_by( 'email', $username ); 

                  if ( isset( $user->user_login ) ) { 
                      $creds['user_login'] = $user->user_login; 
                  } else { 
                      throw new Exception( '<strong>' . __( 'Error:', 'woocommerce' ) . '</strong> ' . __( 'A user could not be found with this email address.', 'woocommerce' ) ); 
                  } 
              } else { 
                  $creds['user_login'] = $username; 
              } 

              // On multisite, ensure user exists on current site, if not add them before allowing login. 
              if ( is_multisite() ) { 
                  $user_data = get_user_by( 'login', $username ); 

                  if ( $user_data && ! is_user_member_of_blog( $user_data->ID, get_current_blog_id() ) ) { 
                      add_user_to_blog( get_current_blog_id(), $user_data->ID, 'customer' ); 
                  } 
              } 

              // Perform the login 
              $user = wp_signon( apply_filters( 'woocommerce_login_credentials', $creds ), is_ssl() ); 

              if ( is_wp_error( $user ) ) { 
                  $message = $user->get_error_message(); 
                  $message = str_replace( '<strong>' . esc_html( $creds['user_login'] ) . '</strong>', '<strong>' . esc_html( $username ) . '</strong>', $message ); 
                  throw new Exception( $message ); 
              } else { 

                  if ( ! empty( $_POST['redirect'] ) ) { 
                      $redirect = $_POST['redirect']; 
                  } elseif ( wp_get_referer() ) { 
                      $redirect = wp_get_referer(); 
                  } else { 
                      $redirect = wc_get_page_permalink( 'myaccount' ); 
                  } 

                  wp_redirect( apply_filters( 'woocommerce_login_redirect', $redirect, $user ) ); 
                  exit; 
              } 
          } catch ( Exception $e ) { 
              wc_add_notice( apply_filters( 'login_errors', $e->getMessage() ), 'error' ); 
              do_action( 'woocommerce_login_failed' ); 
          } 
      } 
  } 
like image 923
Ryszard Jędraszyk Avatar asked Sep 16 '25 16:09

Ryszard Jędraszyk


2 Answers

Please try the below code, i hope it helps you. Paste the below code in current active theme functions.php file.

// start global session for saving the referer url
function start_session() {
    if(!session_id()) {
        session_start();
    }
}
add_action('init', 'start_session', 1);

// get  referer url and save it 
function redirect_url() {
    if (! is_user_logged_in()) {
        $_SESSION['referer_url'] = wp_get_referer();
    } else {
        session_destroy();
    }
}
add_action( 'template_redirect', 'redirect_url' );

//login redirect 
function login_redirect() {
    if (isset($_SESSION['referer_url'])) {
        wp_redirect($_SESSION['referer_url']);
    } else {
        wp_redirect(home_url());
    }
}
add_filter('woocommerce_login_redirect', 'login_redirect', 1100, 2);
like image 184
dineshkashera Avatar answered Sep 19 '25 06:09

dineshkashera


I tried the answer of @dineshkashera but it throws an error as starting a session is not a good practice and also wp_get_referer hook is not working and thus $_SERVER['HTTP_REFERER'].

So my only solution is creating a cookie that will save our previous link.

Here's my Code:

//First we need to set a cookie that will save the previous url
setcookie('nlcrc', $_SERVER['HTTP_REFERER'], time() + 86000, COOKIEPATH, COOKIE_DOMAIN, false);

//Then initiate Woocommerce redirect hook

//This is for the WC login redirect
add_filter('woocommerce_login_redirect', 'wcc_redirects', 9999, 2);

//I have added also WC registration redirect
add_filter('woocommerce_registration_redirect', 'wcc_redirects', 9999, 1);

//Then this will be the handler
function wcc_redirects ($redirect) {
    if (isset($_COOKIE['nlcrc'])) {
        $redirect = $_COOKIE['nlcrc'];
        return $redirect;
    } else {
        $redirect = home_url();
        return $redirect;
    }
}

or you can also somewhat quick and dirty with Javascript. If your default login page is Woocommerce My Account Page.

add_filter('woocommerce_login_redirect', 'wc_cstm_login_redirect', 99 );

function wc_cstm_login_redirect () {
    echo "<script type='text/javascript'>
    history.go(-2);
    </script>";
}
like image 30
webbteche Avatar answered Sep 19 '25 06:09

webbteche



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!