使用自定义字段的前端寄存器

时间:2017-11-11 作者:730wavy

我目前正在使用此处的一些代码编写前端表单-orginal

add_action(\'template_redirect\', \'register_a_user\');
function register_a_user(){
  if(isset($_GET[\'do\']) && $_GET[\'do\'] == \'register\'):
    $errors = array();
    if(empty($_POST[\'user\']) || empty($_POST[\'email\'])) $errors[] = \'provide a user and email\';
if(empty($_POST[\'first_name\']) || empty($_POST[\'last_name\'])) $errors[] = \'provide name\';
    if(!empty($_POST[\'spam\'])) $errors[] = \'gtfo spammer\';
    if(!empty($_POST[\'pass1\']) && !empty($_POST[\'pass2\'])) $error[] = \'The passwords you entered do not match\';

$account = esc_attr($_POST[\'account_type\']);
    $user_login = esc_attr($_POST[\'user\']);
    $user_email = esc_attr($_POST[\'email\']);
 $user_pass = esc_attr($_POST[\'pass1\']);
 $user_pass2 = esc_attr($_POST[\'pass2\']);
  $user_first = esc_attr($_POST[\'first_name\']);
    $user_last = esc_attr($_POST[\'last_name\']);
     $b_email = esc_attr($_POST[\'broker_email\']);
wp_update_user( array( \'ID\' => $current_user->ID, \'broker_email\' => esc_url( $_POST[\'broker_email\'] ) ) );
    require_once(ABSPATH.WPINC.\'/registration.php\');

    $sanitized_user_login = sanitize_user($user_login);
    $user_email = apply_filters(\'user_registration_email\', $user_email);

    if(!is_email($user_email)) $errors[] = \'invalid e-mail\';
    elseif(email_exists($user_email)) $errors[] = \'this email is already registered\';

    if(empty($sanitized_user_login) || !validate_username($user_login)) $errors[] = \'invalid user name\';
    elseif(username_exists($sanitized_user_login)) $errors[] = \'user name already exists\';

    if(empty($errors)):
 if ( $_POST[\'pass1\'] == $_POST[\'pass2\'] ) {

 $user_data = array (
        \'user_login\' => $sanitized_user_login,
        \'user_pass\' => $user_pass,     
        \'user_email\' => $user_email,
 \'user_first\' => $user_first,
 \'user_last\' => $user_last,
 \'b_email\' => $b_email,
        \'role\' => $account
    );

    // Create the user
    $user_id = wp_insert_user( $user_data );

} else { 
$errors[] = \'passwords dont match\'; 
}


      if(!$user_id):
        $errors[] = \'registration failed...\';
      else:
        wp_new_user_notification($user_id);
      endif;
    endif;

    if(!empty($errors)) define(\'REGISTRATION_ERROR\', serialize($errors));
    else define(\'REGISTERED_A_USER\', $user_email);
  endif;
}
在我的注册表中,我尝试添加这3个字段

<input type="text" name="broker_email" class="form-control" value="" />
<input type="text" name="first_name" class="form-control" value="" />
<input type="text" name="last_name" class="form-control" value="" />
除了名称字段未保存和“broker email”字段未保存外,所有内容几乎都正常工作。我做错了什么?

2 个回复
最合适的回答,由SO网友:730wavy 整理而成

在“Turtletreed”所说的帮助下,我成功地让它工作了。我的代码很好,只是需要更改两件事。我从中删除了自定义字段$user_data, 在后面加上这个wp_insert_user --

  add_user_meta($user_id, \'broker_email\', $b_email);
这是我函数中的最终代码。php文件--

add_action(\'template_redirect\', \'register_a_user\');
function register_a_user(){
    if(isset($_GET[\'do\']) && $_GET[\'do\'] == \'register\'):
    $errors = array();
    if(empty($_POST[\'user\']) || empty($_POST[\'email\'])) $errors[] = \'provide a user and email\';
    if(!empty($_POST[\'spam\'])) $errors[] = \'gtfo spammer\';
    if(!empty($_POST[\'pass1\']) && !empty($_POST[\'pass2\'])) $error[] = \'The passwords you entered do not match\';

    $account = esc_attr($_POST[\'account_type\']);
    $user_login = esc_attr($_POST[\'user\']);
    $user_email = esc_attr($_POST[\'email\']);
    $user_pass = esc_attr($_POST[\'pass1\']);
    $user_pass2 = esc_attr($_POST[\'pass2\']);
    $user_first = $_POST[\'first_name\'];
    $user_last = $_POST[\'last_name\'];
    $b_email = $_POST[\'broker_email\'];

    require_once(ABSPATH.WPINC.\'/registration.php\');

    $sanitized_user_login = sanitize_user($user_login);
    $user_email = apply_filters(\'user_registration_email\', $user_email);

    if(!is_email($user_email)) $errors[] = \'invalid e-mail\';
    elseif(email_exists($user_email)) $errors[] = \'this email is already registered\';

    if(empty($sanitized_user_login) || !validate_username($user_login)) $errors[] = \'invalid user name\';
    elseif(username_exists($sanitized_user_login)) $errors[] = \'user name already exists\';

    if(empty($errors)):
    if ( $_POST[\'pass1\'] == $_POST[\'pass2\'] ) {

    $user_data = array (
        \'user_login\' => $sanitized_user_login,
        \'user_pass\' => $user_pass,     
        \'user_email\' => $user_email,
        \'user_first\' => $user_first,
        \'user_last\' => $user_last,
        \'role\' => $account
    );

    // Create the user
    $user_id = wp_insert_user( $user_data );
    add_user_meta($user_id, \'broker_email\', $b_email);
} else { 
$errors[] = \'passwords dont match\'; 
}
      if(!$user_id):
        $errors[] = \'registration failed...\';
      else:
        wp_new_user_notification($user_id);
      endif;
    endif;

    if(!empty($errors)) define(\'REGISTRATION_ERROR\', serialize($errors));
    else define(\'REGISTERED_A_USER\', $user_email);
  endif;
}
此外,如果您想让他们自动登录,您可以在之后立即添加此功能--

function auto_login_new_user( $user_id ) {
        wp_set_current_user($user_id);
        wp_set_auth_cookie($user_id);
            // You can change home_url() to the specific URL,such as 
        wp_redirect( \'http://YOURURL.COM\' );
    }
    add_action( \'user_register\', \'auto_login_new_user\' );

SO网友:TurtleTread

我知道你是个设计师,所以你可能对编码和数据库没有太多经验。从代码中的问题来看,您对PHP和WordPress函数的了解很少。不要把这当作冒犯,因为我只是简单地指出,您可能需要更多地阅读PHP和WordPress文档(如果您想编写更多工作的PHP和WP脚本,这是一种痛苦,但也是必要的)。

导致字段无法保存的三个主要问题:

第四次验证检查只是检查两个密码是否都为空,如果您为两个字段都提供了输入,则始终会返回true。后面代码中的匹配检查是正确的,您应该在那里使用它。

  • wp_insert_user 只接受链接文档中指定的预定义键。看看这个,然后修改您的关键点。

    您的b\\u电子邮件是一个自定义的usermeta字段(如果您有数据库访问权限,您可以查看wp\\u用户,其中的列基本上是您可以使用wp_insert_userwp_update_user). 因此,要存储自定义字段,需要使用add_user_metaupdate_user_meta (请仔细阅读这些函数的参数,因为它们允许您添加多个相同的usermeta键或仅添加一个唯一的meta\\u键,具体取决于您如何设置参数。)

    其他函数使用问题以及错误的代码逻辑:

    您使用的wp_update_user 在wp\\u insert\\u用户之前。当前用户是否也在尝试创建新用户并将broker\\u电子邮件存储为自己的元字段add_user_meta 功能和用途get_current_user_id() 函数而不是调用$current_user 因为这个全局变量不能在函数中直接访问。您需要在函数中使用global $current_user 如果您想访问它,但使用WP函数更好

  • esc_attr 其他过滤功能不应用于更改某些用户字段,这些字段需要与用户输入的字段保持完全相同,否则它们只会得到修改后的登录用户名或密码,这在大多数情况下显然是不需要的。您可以对这些字段运行验证方法,并告诉用户这些字段是不可接受的,但您不应该只是修改它们并将其保存在db中。对于文本内容,如帖子内容,这取决于您的系统等,但绝对不适用于用户凭据
  • 使用PHP手册和WordPress codex查找函数的具体用法。要做好可湿性粉剂的开发工作,需要准确了解它们的工作方式。

    结束

    相关推荐

    为什么wp_users表中的USER_PASS列是varchar(64)

    在处理项目时,我发现“wp\\u users”表中的“user\\u pass”列是varchar(64)。WordPress总是将用户密码存储在md5中,md5是一个32字符的ASCII字符串。那么,为什么不将其存储在具有ascii排序规则的char(32)中呢。我这样问是因为我正在处理一个存储用户密码的表。使用varchar(64)还有其他好处吗。