WordPress注册新用户功能给出错误



我正在使用register_new_user($user_login, $user_email)在我的wordpress网站上注册用户。但它给了我错误 喜欢

{"error":true,"message":{"errors":

{"registerfail":["缺少安全性 来自提交的令牌。"]},"error_data":[]}}

我还在表单中使用了wp_nonce_field以确保安全性。有人可以帮助我修复此错误"提交中缺少安全令牌"吗?

这是我的HTML表单`

<form id="registration_form" action="<?php echo home_url( '/' ); ?>" method="POST">
<div class="form-field">
<span class="screen-reader-text"><?php _e('Username', 'wp-ajax-login'); ?></span>
<input class="form-control input-lg required" name="pt_user_login" type="text" placeholder="<?php _e('Username', 'wp-ajax-login'); ?>" />
</div>
<div class="form-field">
<span class="screen-reader-text"><?php _e('Email', 'wp-ajax-login'); ?></span>
<input class="form-control input-lg required" name="pt_user_email" id="pt_user_email" type="email" placeholder="<?php _e('Email', 'wp-ajax-login'); ?>" />
</div>
<div class="form-field">
<input type="hidden" name="action" value="pt_register_member"/>
<button class="btn btn-theme btn-lg" data-loading-text="<?php _e('Loading...', 'wp-ajax-login') ?>" type="submit"><?php _e('Sign up', 'wp-ajax-login'); ?></button>
</div>
<?php wp_nonce_field('ajax-register-nonce','user-register-security'); ?>
</form>

AJAX CODE: //获取变量

    $user_login = $_POST['pt_user_login'];  
    $user_email = $_POST['pt_user_email'];
    // Check CSRF token
    if( !check_ajax_referer( 'ajax-register-nonce', 'user-register-security', false) ){
        echo json_encode(array('error' => true, 'message'=> '<div class="alert alert-danger">'.__('Session token has expired, please reload the page and try again', 'wp-ajax-login').'</div>'));
        die();
    }
    // Check if input variables are empty
    elseif( empty($user_login) || empty($user_email) ){
        echo json_encode(array('error' => true, 'message'=> '<div class="alert alert-danger">'.__('Please fill all form fields', 'wp-ajax-login').'</div>'));
        die();
    }
    $errors = register_new_user($user_login, $user_email);  
    if( is_wp_error($errors) ){
      //Display errors
    }

'

替换 ajax 代码中的以下行

 if( !check_ajax_referer( 'ajax-register-nonce', 'user-register-security', false) )

if( !check_ajax_referer( 'user-register-security', 'ajax-register-nonce', false) )

注意:操作的名称是第二个参数,而不是第一个参数

参考: wp_nonce_field

试试这个

$user_login = $_POST['pt_user_login'];  
$user_email = $_POST['pt_user_email'];
// Check CSRF token
if( !check_ajax_referer( 'user-register-security', 'ajax-register-nonce', false) ){
    echo json_encode(array('error' => true, 'message'=> '<div class="alert alert-danger">'.__('Session token has expired, please reload the page and try again', 'wp-ajax-login').'</div>'));
    die();
}
// Check if input variables are empty
elseif( empty($user_login) || empty($user_email) ){
    echo json_encode(array('error' => true, 'message'=> '<div class="alert alert-danger">'.__('Please fill all form fields', 'wp-ajax-login').'</div>'));
    die();
}
$errors = register_new_user($user_login, $user_email);  
if( is_wp_error($errors) ){
  //Display errors
}

https://codex.wordpress.org/Function_Reference/wp_nonce_field

<form method="post">
   <!-- some inputs here ... -->
   <?php wp_nonce_field( 'name_of_my_action', 'name_of_nonce_field' ); ?>
</form>

<?php
if ( 
    ! isset( $_POST['name_of_nonce_field'] ) 
    || ! wp_verify_nonce( $_POST['name_of_nonce_field'], 'name_of_my_action' ) 
) {
   print 'Sorry, your nonce did not verify.';
   exit;
} else {
   // process form data
}

您也可以使用 wp_verify_nonce() 方法验证随机变量。

所以以下应该是你的 if 条件

if (wp_verify_nonce( $_POST['user-register-security'], 'ajax-register-nonce' ) ) {
        // valid nonce. 
        // other code.
}
else{
     // invalid nonce, do appropriate action.
}

如果您需要任何进一步的帮助,请告诉我们。

我找到了 register_new_user() 函数的替代品。以下是新用户注册的工作代码:

    // Get variables
    $user_login = $_POST['pt_user_login'];  
    $user_email = $_POST['pt_user_email'];
    // Check CSRF token
    if( !check_ajax_referer( 'ajax-register-nonce', 'user-register-security', false) ){
        echo json_encode(array('error' => true, 'message'=> '<div class="alert alert-danger">'.__('Session token has expired, please reload the page and try again', 'wp-ajax-login').'</div>'));
        die();
    }
    // Check if input variables are empty
    elseif( empty($user_login) || empty($user_email) ){
        echo json_encode(array('error' => true, 'message'=> '<div class="alert alert-danger">'.__('Please fill all form fields', 'wp-ajax-login').'</div>'));
        die();
    }

    if( null == email_exists( $user_email ) ) {
      // Generate the password and create the user
      $password = wp_generate_password( 12, false );
      $user_id = wp_create_user( $user_login, $password, $user_email );
      // Set the nickname
      wp_update_user(
        array(
          'ID'          =>    $user_id,
          'nickname'    =>    $user_email
        )
      );
      // Set the role
      $user = new WP_User( $user_id );
      $user->set_role( 'contributor' );
      // Email the user
      //wp_mail( $user_email 'Welcome!', 'Your Password: ' . $password );
        echo json_encode(array('error' => false, 'message' => '<div class="alert alert-success">'.__( 'Registration complete. Please check your e-mail.', 'wp-ajax-login').'</p>'));
            die();
    } // end if
    else
    {
        echo json_encode(array('error' => true, 'message'=> '<div class="alert alert-danger">'.__('This email already exists.Please use different email address.', 'wp-ajax-login').'</div>'));
        die();
    }

感谢所有回答我问题的人,我已经测试了您的代码,但wp_nonce或验证随机数值没有问题。我认为问题是由于某些插件使用registration_errors钩子在其中添加错误。

最新更新