自定义登录和注册表

时间:2016-10-06 作者:frederikvdbe

我想为WordPress系统中的特定用户角色创建一个自定义注册/登录表单。访问者应该能够注册(立即分配正确的角色)并登录以访问特定页面(仅此特定角色可用)。

我找到了一些文章,其中他们在模板文件的顶部检查$\\u POST参数,并在那里执行所有逻辑。我更喜欢函数中的表单处理。php

注意:我还更喜欢使用模板获得解决方案,在模板中我对表单进行编码,并在函数中处理它们。php文件。我发现一篇文章指出,处理表单的正确方法是将表单发送到管理员邮箱。php,这是可行的,但我无法得到任何验证。如果出现新的wp\\U错误,则重定向回时无法显示这些错误。。

任何输入都是高度赞赏的!

编辑:换句话说,我希望有一个关于如何处理自定义表单和自定义表单验证的深入回答或链接到任何文章。首选流程:带有标记的自定义模板,并在函数中处理表单(可能在提交后发送邮件,为注册表创建用户,甚至可能在前端添加帖子)。php

再次感谢!

1 个回复
SO网友:Carl Willis

我将此函数用作插件,但您也可以在函数中使用它。php。

但我仍然没有找到添加用户角色的方法,我像文本框一样使用它,但我们也可以在select中使用它,但我不知道它是否正常工作,如果不正确,我希望有人可以添加它。

<?php

/*
  Plugin Name: Registration Form
  Description: Custom sign up form.
  Version: 1.1
  Author: Me
 */



/////////////////
// PLUGIN CORE //
/////////////////

function cr(&$fields, &$errors) {

  // Check args and replace if necessary
  if (!is_array($fields))     $fields = array();
  if (!is_wp_error($errors))  $errors = new WP_Error;

  // Check for form submit
  if (isset($_POST[\'submit\'])) {

    // Get fields from submitted form
    $fields = cr_get_fields();

    // Validate fields and produce errors
    if (cr_validate($fields, $errors)) {

      // If successful, register user
      wp_insert_user($fields);

      // And display a message
      echo \'Registration complete. Goto <a href="\' . get_site_url() . \'/wp-login.php">login page</a>.\';

      // Clear field data
      $fields = array(); 
    }
  }

  // Santitize fields
  cr_sanitize($fields);

  // Generate form
  cr_display_form($fields, $errors);
}

function cr_sanitize(&$fields) {
  $fields[\'user_login\']   =  isset($fields[\'user_login\'])  ? sanitize_user($fields[\'user_login\']) : \'\';
  $fields[\'user_pass\']    =  isset($fields[\'user_pass\'])   ? esc_attr($fields[\'user_pass\']) : \'\';
  $fields[\'user_email\']   =  isset($fields[\'user_email\'])  ? sanitize_email($fields[\'user_email\']) : \'\';
  $fields[\'user_url\']     =  isset($fields[\'user_url\'])    ? esc_url($fields[\'user_url\']) : \'\';
  $fields[\'first_name\']   =  isset($fields[\'first_name\'])  ? sanitize_text_field($fields[\'first_name\']) : \'\';
  $fields[\'last_name\']    =  isset($fields[\'last_name\'])   ? sanitize_text_field($fields[\'last_name\']) : \'\';
  $fields[\'nickname\']     =  isset($fields[\'nickname\'])    ? sanitize_text_field($fields[\'nickname\']) : \'\';
  $fields[\'description\']  =  isset($fields[\'description\']) ? esc_textarea($fields[\'description\']) : \'\';
  $fields[\'role\']  =  isset($fields[\'role\']) ? esc_textarea($fields[\'role\']) : \'\';
}

function cr_display_form($fields = array(), $errors = null) {

  // Check for wp error obj and see if it has any errors  
  if (is_wp_error($errors) && count($errors->get_error_messages()) > 0) {

    // Display errors
    ?><ul><?php
    foreach ($errors->get_error_messages() as $key => $val) {
      ?><li>
        <?php echo $val; ?>
      </li><?php
    }
    ?></ul><?php
  }

  // Disaply form

  ?><form action="<?php $_SERVER[\'REQUEST_URI\'] ?>" method="post">
    <div>
      <label for="user_login">Username <strong>*</strong></label>
      <input type="text" name="user_login" value="<?php echo (isset($fields[\'user_login\']) ? $fields[\'user_login\'] : \'\') ?>">
    </div>

    <div>
      <label for="user_pass">Password <strong>*</strong></label>
      <input type="password" name="user_pass">
    </div>

    <div>
      <label for="email">Email <strong>*</strong></label>
      <input type="text" name="user_email" value="<?php echo (isset($fields[\'user_email\']) ? $fields[\'user_email\'] : \'\') ?>">
    </div>

    <div>
      <label for="website">Website</label>
      <input type="text" name="user_url" value="<?php echo (isset($fields[\'user_url\']) ? $fields[\'user_url\'] : \'\') ?>">
    </div>

    <div>
      <label for="firstname">First Name</label>
      <input type="text" name="first_name" value="<?php echo (isset($fields[\'first_name\']) ? $fields[\'first_name\'] : \'\') ?>">
    </div>

    <div>
      <label for="website">Last Name</label>
      <input type="text" name="last_name" value="<?php echo (isset($fields[\'last_name\']) ? $fields[\'last_name\'] : \'\') ?>">
    </div>

    <div>
      <label for="role">Role : Author, Contributor, Editor and Subscriber</label>
      <input type="text" name="role" value="<?php echo (isset($fields[\'role\']) ? $fields[\'role\'] : \'\') ?>">
    </div>

    <div>
      <label for="nickname">Nickname</label>
      <input type="text" name="nickname" value="<?php echo (isset($fields[\'nickname\']) ? $fields[\'nickname\'] : \'\') ?>">
    </div>

    <div>
      <label for="bio">About / Bio</label>
      <textarea name="description"><?php echo (isset($fields[\'description\']) ? $fields[\'description\'] : \'\') ?></textarea>
    </div>

    <input type="submit" name="submit" value="Register">
    </form><?php
}

function cr_get_fields() {
  return array(
    \'user_login\'   =>  isset($_POST[\'user_login\'])   ?  $_POST[\'user_login\']   :  \'\',
    \'user_pass\'    =>  isset($_POST[\'user_pass\'])    ?  $_POST[\'user_pass\']    :  \'\',
    \'user_email\'   =>  isset($_POST[\'user_email\'])   ?  $_POST[\'user_email\']        :  \'\',
    \'user_url\'     =>  isset($_POST[\'user_url\'])     ?  $_POST[\'user_url\']     :  \'\',
    \'first_name\'   =>  isset($_POST[\'first_name\'])   ?  $_POST[\'first_name\']        :  \'\',
    \'last_name\'    =>  isset($_POST[\'last_name\'])    ?  $_POST[\'last_name\']        :  \'\',
    \'nickname\'     =>  isset($_POST[\'nickname\'])     ?  $_POST[\'nickname\']     :  \'\',
    \'description\'  =>  isset($_POST[\'description\'])  ?  $_POST[\'description\']  :  \'\',
    \'role\'  =>  isset($_POST[\'role\'])  ?  $_POST[\'role\']  :  \'\'
  );
}

function cr_validate(&$fields, &$errors) {

  // Make sure there is a proper wp error obj
  // If not, make one
  if (!is_wp_error($errors))  $errors = new WP_Error;

  // Validate form data

  if (empty($fields[\'user_login\']) || empty($fields[\'user_pass\']) || empty($fields[\'user_email\'])) {
    $errors->add(\'field\', \'Required form field is missing\');
  }

  if (strlen($fields[\'user_login\']) < 4) {
    $errors->add(\'username_length\', \'Username too short. At least 4 characters is required\');
  }

  if (username_exists($fields[\'user_login\']))
    $errors->add(\'user_name\', \'Sorry, that username already exists!\');

  if (!validate_username($fields[\'user_login\'])) {
    $errors->add(\'username_invalid\', \'Sorry, the username you entered is not valid\');
  }

  if (strlen($fields[\'user_pass\']) < 5) {
    $errors->add(\'user_pass\', \'Password length must be greater than 5\');
  }

  if (!is_email($fields[\'user_email\'])) {
    $errors->add(\'email_invalid\', \'Email is not valid\');
  }

  if (email_exists($fields[\'user_email\'])) {
    $errors->add(\'email\', \'Email Already in use\');
  }

  if (!empty($fields[\'user_url\'])) {
    if (!filter_var($fields[\'user_url\'], FILTER_VALIDATE_URL)) {
      $errors->add(\'user_url\', \'Website is not a valid URL\');
    }
  }

  // If errors were produced, fail
  if (count($errors->get_error_messages()) > 0) {
    return false;
  }

  // Else, success!
  return true;


}



///////////////
// SHORTCODE //
///////////////

// The callback function for the [cr] shortcode
function cr_cb() {
  $fields = array();
  $errors = new WP_Error();

  // Buffer output
  ob_start();

  // Custom registration, go!
  cr($fields, $errors);

  // Return buffer
  return ob_get_clean();
}
add_shortcode(\'cr\', \'cr_cb\');