title: WooCommerce - redirect to previous page after login
body: <p>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.</p>
  
  <p><code>wp_get_referer()</code> doesn't return anything and <code>$_SERVER["HTTP_REFERER"]</code> returns my account page if put within function hooked to <code>woocommerce_login_redirect</code> (I used PHP debug console to check).</p>
  
  <p>Here is my code:</p>
  
  <pre><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-&gt;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;
  
  }
  </code></pre>
  
  <p>Here is where filter which I used appears in WooCommerce code:</p>
  
  <pre><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'] ) &amp;&amp; wp_verify_nonce( $nonce_value, 'woocommerce-login' ) ) { 
  
            try { 
                $creds = array( 
                    'user_password' =&gt; $_POST['password'],  
                    'remember' =&gt; 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-&gt;get_error_code() ) { 
                    throw new Exception( '&lt;strong&gt;' . __( 'Error:', 'woocommerce' ) . '&lt;/strong&gt; ' . $validation_error-&gt;get_error_message() ); 
                } 
  
                if ( empty( $username ) ) { 
                    throw new Exception( '&lt;strong&gt;' . __( 'Error:', 'woocommerce' ) . '&lt;/strong&gt; ' . __( 'Username is required.', 'woocommerce' ) ); 
                } 
  
                if ( is_email( $username ) &amp;&amp; apply_filters( 'woocommerce_get_username_from_email', true ) ) { 
                    $user = get_user_by( 'email', $username ); 
  
                    if ( isset( $user-&gt;user_login ) ) { 
                        $creds['user_login'] = $user-&gt;user_login; 
                    } else { 
                        throw new Exception( '&lt;strong&gt;' . __( 'Error:', 'woocommerce' ) . '&lt;/strong&gt; ' . __( '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 &amp;&amp; ! is_user_member_of_blog( $user_data-&gt;ID, get_current_blog_id() ) ) { 
                        add_user_to_blog( get_current_blog_id(), $user_data-&gt;ID, 'customer' ); 
                    } 
                } 
  
                // Perform the login 
                $user = wp_signon( apply_filters( 'woocommerce_login_credentials', $creds ), is_ssl() ); 
  
                if ( is_wp_error( $user ) ) { 
                    $message = $user-&gt;get_error_message(); 
                    $message = str_replace( '&lt;strong&gt;' . esc_html( $creds['user_login'] ) . '&lt;/strong&gt;', '&lt;strong&gt;' . esc_html( $username ) . '&lt;/strong&gt;', $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-&gt;getMessage() ), 'error' ); 
                do_action( 'woocommerce_login_failed' ); 
            } 
        } 
    } 
  </code></pre>