错误的代码后不要提交表格

时间:2016-07-24 11:39:36

标签: php wordpress forms

我正在开发一个WordPress插件,它会在登录表单中添加一个身份验证代码。

这是检查身份验证代码是否有效的过程:

add_action( 'wp_authenticate', 'authcode_check', 5 );
function authcode_check($username) {
    $options = get_option( 'authcode_settings' );
    if(!empty($options['code'])) {
        global $wpdb;

        if ( !username_exists( $username ) ) {
            return;
        }

        $set_code = $options['code'];
        $submit_code = $_POST['auth_key'];

        if(empty($submit_code)) {
            add_filter( 'login_errors', function( $error ) {$error = '<strong>ERROR</strong>: Authentication code cannot be empty.';return $error;} );
            return;
        } elseif ( ! ( $set_code == $submit_code ) ) {
            add_filter( 'login_errors', function( $error ) {$error = '<strong>ERROR</strong>: Authentication code is invalid.';return $error;} );
            return;
        }
    }
}

问题是;当用户正确输入他们的WordPress名称和密码,而不是auth代码时,表单仍然会提交并登录用户。

我尝试了return false,但这没有用。

有没有办法阻止表单在输入错误的身份验证代码时记录用户?

3 个答案:

答案 0 :(得分:1)

而不是return false使用return显然WordPress更喜欢它,看看它刚刚返回的现有用户名代码,而不是false,不是true,只返回 同时在返回语句之前放置添加过滤器函数,因为返回表示代码在该点停止运行,不再执行任何操作,因此除非您移动它们否则不会出现过滤器

答案 1 :(得分:1)

工作示例

与@ J.Doe

聊天后更新

我们可以挂钩/** * 'Authentication Code' Input */ add_action( 'login_form', function() { // Fetch the stored code $options = get_option( 'authcode_settings' ); // Display code input if( isset( $options['code'] ) ) printf( '<p class="login-authenticate"> <label for="auth_key">%s</label> <input type="text" name="so38551606_auth_key" id="so38551606_auth_key" class="input" value="" size="20" autocomplete="off" /> </p>', esc_html__( 'Authentication Code', 'mydomain' ) ); } ); 钩子,显示身份验证码的输入:

authenticate

您可以在wp_authenticate()函数中挂钩/** * Validate 'Authentication Code' Input */ add_filter( 'authenticate', function( $user ) { // Fetch stored code value $options = get_option( 'authcode_settings' ); // Nothing to do if there's no stored code value if( ! isset( $options['code'] ) ) return $user; // Fetch the user's code input $submit_code = isset( $_POST['so38551606_auth_key'] ) ? $_POST['so38551606_auth_key'] : null; // Validation's logic $is_valid_auth_code = ! is_null( $submit_code ) && ( $options['code'] === $submit_code ); // Valid auth code if( $is_valid_auth_code ) return $user; // Add an unvalid auth code error if( is_wp_error( $user ) ) $user->add( 'invalid_auth_code', sprintf( '<strong>%s</strong>: %s', esc_html__( 'ERROR', 'mydomain' ), esc_html__( 'Authentication code is invalid.', 'mydomain' ) ) ); // Create a new auth code error else $user = new WP_Error( 'invalid_auth_code', sprintf( '<strong>%s</strong>: %s', esc_html__( 'ERROR', 'mydomain' ), esc_html__( 'Authentication code is invalid.', 'mydomain' ) ) ); return $user; }, 100 ); 过滤器,以获取验证部分:

100

这里我们使用add_filter( 'authenticate', 'wp_authenticate_username_password', 20, 3 ); add_filter( 'authenticate', 'wp_authenticate_email_password', 20, 3 ); add_filter( 'authenticate', 'wp_authenticate_spam_check', 99 ); 的优先级,因为我们想在默认回调之后运行它:

so38551606_

我们将POST变量加上Unsupported URL protocol作为前缀,以避免可能的名称冲突。

输出示例:

auth input key validation example

答案 2 :(得分:0)

您能证明用户没有登录吗?或者您只是假设他们正在登录,因为错误消息没有显示?

return关键字之后的任何内容都无法运行。因此,在if语句中,如果auth键不匹配,则会有两个return false;,然后您将调用一个函数。此功能不会运行,因此不会显示错误代码。

然而,你可以做的是将函数移到return关键字之上。然后它将显示错误并返回false。