diff --git a/src/wp-includes/post-template.php b/src/wp-includes/post-template.php index 598ea3d608..15dfc67d6f 100644 --- a/src/wp-includes/post-template.php +++ b/src/wp-includes/post-template.php @@ -1780,6 +1780,7 @@ function get_the_password_form( $post = 0 ) { $invalid_password_html = ''; $aria = ''; $class = ''; + $redirect_field = ''; // If the referrer is the same as the current request, the user has entered an invalid password. if ( ! empty( $post->ID ) && wp_get_raw_referer() === get_permalink( $post->ID ) && isset( $_COOKIE[ 'wp-postpass_' . COOKIEHASH ] ) ) { @@ -1798,7 +1799,14 @@ function get_the_password_form( $post = 0 ) { $class = ' password-form-error'; } - $output = '
'; diff --git a/src/wp-login.php b/src/wp-login.php index c1b06bbc3b..0d824dea65 100644 --- a/src/wp-login.php +++ b/src/wp-login.php @@ -764,8 +764,10 @@ switch ( $action ) { break; case 'postpass': + $redirect_to = $_POST['redirect_to'] ?? wp_get_referer(); + if ( ! isset( $_POST['post_password'] ) || ! is_string( $_POST['post_password'] ) ) { - wp_safe_redirect( wp_get_referer() ); + wp_safe_redirect( $redirect_to ); exit; } @@ -782,18 +784,17 @@ switch ( $action ) { * * @param int $expires The expiry time, as passed to setcookie(). */ - $expire = apply_filters( 'post_password_expires', time() + 10 * DAY_IN_SECONDS ); - $referer = wp_get_referer(); + $expire = apply_filters( 'post_password_expires', time() + 10 * DAY_IN_SECONDS ); - if ( $referer ) { - $secure = ( 'https' === parse_url( $referer, PHP_URL_SCHEME ) ); + if ( $redirect_to ) { + $secure = ( 'https' === parse_url( $redirect_to, PHP_URL_SCHEME ) ); } else { $secure = false; } setcookie( 'wp-postpass_' . COOKIEHASH, $hasher->HashPassword( wp_unslash( $_POST['post_password'] ) ), $expire, COOKIEPATH, COOKIE_DOMAIN, $secure ); - wp_safe_redirect( wp_get_referer() ); + wp_safe_redirect( $redirect_to ); exit; case 'logout':