有没有办法使重定向工作,而不是在PHP / WordPress中单击浏览器的后退按钮后返回到表单页面?

问题描述

我有一个小问题。我在页面上创建了一个表单,该表单使用$ _POST发送数据。正在检查数据是否有错误,如果有任何错误,则该页面将返回显示错误的表单。从$ _POST变量获取错误。如果最终输入正确的数据,我将被重定向到主页。但是,如果我单击“后退”按钮,则可以再次看到带有提交错误的表单(以前是从$ _POST获取)。是否可以返回但查看主页而不是出现错误登录表单?

此外,当我立即输入正确的数据时,这种情况就不会发生。如果发生这种情况,则单击“后退”按钮后,将看不到任何表单,只有主页。仅当我首先输入不正确的数据和正确的数据时,表单(单击后退按钮之后)才可见。

这是在wordpress中,因此您可以在下面的代码中看到一些与WP相关的内容

这是登录表单:

echo 'Login Form';

$tw_email_err = '';
$tw_email     = '';

$tw_form        = tw_login_process(); // This function is below. It processes the form input.
$tw_email       = $tw_form['email'];
$tw_email_err   = $tw_form['message'];
$tw_consent_err = $tw_form['consent_msg'];


echo '<h2>Form</h2>
<form method="post">';

    wp_nonce_field( 'tw_login_form','tw_login_nonce' );

    echo '<input type="text" placeholder="e-mail" name="tw_email" value="' . esc_attr( $tw_email ) . '">
    <span class="tw-error">* ' . esc_html( $tw_email_err ) . '</span>
    <br><br>
    
    <input type="checkBox" id="tw_consent_check" name="tw_consent" value="on">
    <label for="tw_consent_check">Zgoda</label><br>
    <span class="tw-error">* ' . esc_html( $tw_consent_err ) . '</span>
    <br><br>
    <p><span class="error">* required field</span></p>
    <input type="submit" name="submit" value="Submit"> 
</form>';

表格处理:

function tw_login_process() {

    $trzywu_users = tw_get_users(); // Get saved users from database,works OK.

    if ( isset( $_SERVER['REQUEST_METHOD'] ) && 'POST' === $_SERVER['REQUEST_METHOD'] ) {

        $tw_check_email = ( isset( $_POST['tw_email'],$_POST['tw_login_nonce'] ) && wp_verify_nonce( sanitize_key( $_POST['tw_login_nonce'] ),'tw_login_form' ) )
        ? sanitize_text_field( wp_unslash( $_POST['tw_email'] ) )
        : '';

        $tw_check_consent = ( isset( $_POST['tw_consent'],'tw_login_form' ) )
        ? sanitize_text_field( wp_unslash( $_POST['tw_consent'] ) )
        : '';

        if ( $tw_check_email ) {

            $tw_check_result['email'] = $tw_check_email;

            if ( $trzywu_users && filter_var( $tw_check_email,FILTER_VALIDATE_EMAIL ) && in_array( $tw_check_email,$trzywu_users,true ) ) {

                $tw_check_result['check']   = 'valid_existent';
                $tw_check_result['message'] = '';

            } elseif ( ! filter_var( $tw_check_email,FILTER_VALIDATE_EMAIL ) ) {

                $tw_check_result['check']   = 'not_valid';
                $tw_check_result['message'] = 'Nieprawidłowy format adresu e-mail.';

            } elseif ( ! $trzywu_users || ! in_array( $tw_check_email,true ) ) {

                $tw_check_result['check']   = 'not_existent';
                $tw_check_result['message'] = 'Adres e-mail nie jest zarejestrowany.';

            }
        } else {

            $tw_check_result['email']   = '';
            $tw_check_result['check']   = 'not_set';
            $tw_check_result['message'] = 'Podaj adres e-mail';

        }

        $tw_check_result['consent'] = 'on' === $tw_check_consent ? 'consent_granted' : 'no_consent';

        if ( 'on' === $tw_check_consent ) {

            $tw_check_result['consent']     = 'consent_granted';
            $tw_check_result['consent_msg'] = '';

        } else {

            $tw_check_result['consent']     = 'no_consent';
            $tw_check_result['consent_msg'] = 'Wyraź zgodę na warunki Polityki Prywatności.';

        }

        return $tw_check_result;

    }
}

最后是重定向

function tw_user_redirect() {

    global $tw_cookie_name; // This is cookie name for setcookie,don't worry about that.

    header( 'Cache-Control: no cache' ); // I'm using this to eliminate form resubmission error. Is it OK?
    session_cache_limiter( 'private_no_expire' );
    session_start();

    $tw_result     = tw_login_process(); //That's above form's processing.
    $tw_users      = tw_get_users(); // Just additional check,works OK.
    $tw_login_page = tw_get_login_page_id(); //this function gets login page ID,it works OK.

    if ( 'consent_granted' === $tw_result['consent'] && 'valid_existent' === $tw_result['check'] ) {

        if ( in_array( $tw_result['email'],$tw_users,true ) ) {

            $cokie_session_value = tw_password_hash( $tw_result['email'] );
            $_SESSION['user']    = $cokie_session_value;

            setcookie( $tw_cookie_name,$cokie_session_value,time() + ( 86400 * 7 ),'/' ); //Not important,I suppose?

        }

        wp_safe_redirect( home_url() );
        exit;

    }
    
    // This somehow doesn't work after clicking back button. It works in any other scenario though.
    if ( isset( $_SESSION['user'] ) && is_page( $tw_login_page ) ) {

        wp_safe_redirect( home_url() );
        exit;
    
    // This works as expected.
    } elseif ( ! isset( $_SESSION['user'] ) && ! is_page( $tw_login_page ) ) {

        wp_safe_redirect( get_permalink( $tw_login_page ) );
        exit;

    }
}
add_action( 'template_redirect','tw_user_redirect' );

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)