2016-01-13 43 views
1

该项目使用WordPress,由于WordPress登录/注册表单只是部分可定制的,我需要构建自己的HTML表单并将用户名+密码提交给WordPress。从HTML表单提交证书到WordPress登录过程

我有一个问题,因为我不知道如何从表单字段获取数据并将它们提交给(通过)用于WordPress登录的PHP处理器。

假设我有这样的形式比较简单的短代码:

function project_login_form() { 

if(!is_user_logged_in()) { 

    $output = project_login_form_fields(); 
} 
return $output; 
} 
add_shortcode('login_form', 'project_login_form'); 

然后字段在该功能定义:

function project_login_form_fields() { 

ob_start(); 
    // show any error messages after form submission 
    project_show_error_messages(); ?> 
    <form id="project_login_form" class="col-md-8" action="" method="post"> 
     <div class="row"> 
      <div class="input-field col-md-3"> 
       <label for="project_user_login">Username</label> 
       <input name="project_user_login" id="project_user_login" class="required" type="text"/> 

      </div> 
      <div class="input-field col-md-3"> 
       <label for="project_user_pass">Password</label> 
       <input name="project_user_pass" id="project_user_pass" class="required" type="password"/> 
      </div> 
       <input type="hidden" name="project_login_nonce" value="<?php echo wp_create_nonce('project-login-nonce'); ?>"/> 
       <input id="project_login_submit" type="submit" value="Login"/> 

     <div> 
    </form> 
<?php 
return ob_get_clean(); 
} 

什么是“连接”这一正确的方法所以要从 project_user_loginproject_user_pass得到的值,传递给WordPress登录过程?

这下面是我到目前为止,但是当我打的登录按钮,我得到 Invalid usernameIncorrect password (是的,他们是正确的,我相信:))

function project_login_member() { 

if(isset($_POST['project_user_login']) && wp_verify_nonce($_POST['project_login_nonce'], 'project-login-nonce')) { 

    // this returns the user ID and other info from the user name 
    $user = get_user_by('login','some-name'); 

    if(!$user) { 
     // if the user name doesn't exist 
     project_errors()->add('empty_username', __('Invalid username')); 
    } 

    if(!isset($_POST['project_user_pass']) || $_POST['project_user_pass'] == '') { 
     // if no password was entered 
     project_errors()->add('empty_password', __('Please enter a password')); 
    } 

    // check the user's login with their password 
    if(!wp_check_password($_POST['project_user_pass'], $user->user_pass, $user->ID)) { 
     // if the password is incorrect for the specified user 
     project_errors()->add('empty_password', __('Incorrect password')); 
    } 

    // retrieve all error messages 
    $errors = project_errors()->get_error_messages(); 

    // only log the user in if there are no errors 
    if(empty($errors)) { 

     wp_set_auth_cookie($_POST['project_user_login'], $_POST['project_user_pass'], true); 
     wp_set_current_user($user->ID, $_POST['project_user_login']); 
     do_action('wp_login', $_POST['project_user_login']); 

     wp_redirect(home_url()); exit; 
    } 
} 
} 
add_action('init', 'project_login_member'); 

回答

1

project_login_member()将成为您正在侦听POST特定请求的回调函数。你想钩入add_action('wp', 'project_login_member');

接下来,你可以像这样在你的表单中添加一个wp_nonce_field;

$registration_token = strtolower(wp_generate_password(10, false, false)) ?> 

<input type="hidden" name="registration_token" value="<?php echo  esc_attr($registration_token) ?>"> 

<?php wp_nonce_field('user_registration-' . $registration_token, 'registration_nonce') ?> 

<p> 
<button type="submit" id="submit-registration">Submit</button> 
</p> 

最后,设置回调监听正确的事情,验证您的随机数场,然后添加其余检查你的回调。

function project_member_login() { 
    //Check to see if 'POST' exists 
    if ( 
     'POST' !== $_SERVER['REQUEST_METHOD'] 
     || 
     ! isset($_POST['registration_token']) 
     || 
     ! isset($_POST['registration_nonce']) 
     || 
     false === wp_verify_nonce($_POST['registration_nonce'], 'user_registration-' . $_POST['registration_token']) 

     ) { 
      return; 
     } 
     //sign user into WP 
     //save your $_POST vars into vars and use wp_signon() to log them in. 
     $creds = array(
      'user_login' => $user_login, 
      'user_password' => $user_pass, 
      'remember'  => true, 
     ); 

     $user = wp_signon($creds, false); 

     wp_redirect(home_url()); 
     exit; 
} 
0

您可以通过电子邮件或用户名时,通过自定义表单提交

$user = get_user_by('email', '[email protected]'); 
$user = get_user_by('login', '[email protected]'); 

然后通过用户ID和用户登录到该函数如下如下得到用户对象:

if($user) { 
    wp_set_current_user($user->ID, $user->user_login); 
    wp_set_auth_cookie($user->ID); 
    do_action('wp_login', $user->user_login); 
} 

这将使您的用户登录发布用户名和密码

注意WP_error,但成功登录