在文章《WordPress注册界面:用户填写密码》中介绍了如何允许用户填写密码,今天还想练习一下添加自定义注册字段,比如qq、新浪微博、google+,另外还想让用户填写网站,很多用户注册后想不起来去更新资料,不如让他们注册的时候就填一下,以后制作会员列表会用得到。

向注册表单添加自定义字段

添加QQ、新浪微博、Google+和网站四项,前三项存储在wp_usermeta表中,网站是WordPress Profile的默认字段,存储在wp_user表中,有固定的id叫做user_url。这四项全部设置为可选,用户不填也无所谓。

首先改一下注册界面,通过action register_form

add_action( 'register_form', 'ugp_show_extra_register_fields' );
function ugp_show_extra_register_fields(){
	?>
	<p>
	<label for="password"><?php _e( 'Password', 'ugp-domain' );?><br/>
	<input id="password" class="input" type="password" tabindex="30"  size="25" value="" name="password" />
	</label>
	</p>
	<p>
	<label for="repeat_password"><?php _e( 'Repeat password', 'ugp-domain' );?><br/>
	<input id="repeat_password" class="input" type="password" tabindex="40" size="25" value="" name="repeat_password" />
	</label>
	</p>
	<p>
	<label for="url"><?php _e( 'Your Website', 'ugp-domain');?> <?php _e('(Optional)', 'ugp-domain' ); ?><br/>
	<input id="url" class="input" type="text" tabindex="50" size="25" value="<?php if( empty($_POST['url']) ) echo 'http://'; else echo $_POST['url']; ?>" name="url" />
	</label>
	</p>
	<p>
	<label for="qq">QQ <?php _e('(Optional)', 'ugp-domain' ); ?><br/>
	<input id="qq" class="input" type="text" tabindex="60"  size="25" value="<?php echo $_POST['qq']?>" name="qq" />
	</label>
	</p>
	<p>
	<label for="sina_weibo"><?php _e( 'Sina Weibo', 'ugp-domain' ); ?> <?php _e('(Optional)', 'ugp-domain' ); ?><br/>
	<input id="sina_weibo" class="input" type="text" tabindex="70" size="25" value="<?php echo $_POST['sina_weibo']?>" name="sina_weibo" />
	</label>
	</p>
	<p>
	<label for="googleplus">Google+ <?php _e('(Optional)', 'ugp-domain' ); ?><br/>
	<input id="googleplus" class="input" type="text" tabindex="80" size="25" value="<?php echo $_POST['googleplus']?>" name="googleplus" />
	</label>
	</p>
	<p>
	<label for="are_you_human" style="font-size:12px"><?php _e( 'Sorry, but we must check if you are human. What is the name of website you are registering for?' , 'ugp-domain' ); ?><br/>
	<input id="are_you_human" class="input" type="text" tabindex="90" size="25" value="" name="are_you_human" />
	</label>
	</p>
	<?php
}

其次,改一下提交后的处理程序,更新自定义字段。如果用户填写了网址,需要简单的验证一下。

add_action( 'user_register', 'ugp_register_extra_fields', 100 );
function ugp_register_extra_fields( $user_id ){
    $userdata = array();
    
    $userdata['ID'] = $user_id;
    if( $_POST['qq'] !== '' )     $userdata['qq'] = $_POST['qq'];
    if( $_POST['sina_weibo'] !== '' )    $userdata['sina_weibo'] = $_POST['sina_weibo'];
    if( $_POST['googleplus'] !== '' )    $userdata['googleplus'] = $_POST['googleplus'];
    if( $_POST['url'] !== '' )    $userdata['user_url'] = $_POST['url'];
    if( $_POST['url'] !== '' || $_POST['url'] !== 'http://') {
        $userdata['user_url'] = esc_url_raw( $_POST['url'] );
        $userdata['user_url'] = preg_match('/^(https?|ftps?|mailto|news|irc|gopher|nntp|feed|telnet):/is', $userdata['user_url']) ? $userdata['user_url'] : 'http://'.$userdata['user_url'];
    }
    
    if ( $_POST['password'] !== '' ) {
        $userdata['user_pass'] = $_POST['password'];
    }
    $new_user_id = wp_update_user( $userdata );
}

用户资料增加字段

既然注册的时候允许用户填写一些基本信息,在用户资料中也要有所体现,方法在文章《WordPress小技巧:为用户资料添加新的联系方式》中介绍过,不在赘述。

去掉WordPress默认的资料字段,添加自定义字段

add_filter( 'user_contactmethods', 'ugp_custom_contact_fields' );
function ugp_custom_contact_fields( $contactmethods ) {
	$contactmethods['qq'] = 'QQ';
	$contactmethods['sina_weibo'] = __('Sina Weibo', 'ugp-domain');
	$contactmethods['googleplus'] = 'Google+';
	
	unset( $contactmethods['yim'] );
	unset( $contactmethods['aim'] );
	unset( $contactmethods['jabber'] );
	
	return $contactmethods;
}

最终效果

注册时填写更多的资料

插件下载

把这些代码封装成了小插件,仅供测试。

User Generate Password 添加更多注册字段 已下载 276 次

15条留言

  1. 楼主不好意思啊,再问个问题,就是如果我要添加一个必填的选项代码该怎么写啊?

    1. 用registration_errors检测必填字段是否填写,没填就返回一个错误。
      文档在此http://codex.wordpress.org/Plugin_API/Filter_Reference/registration_errors

    2. 这个示例更完整http://codex.wordpress.org/Customizing_the_Registration_Form

  2. 楼主你好,为何使用了你的方法,在注册后发送来的邮件中显示的密码是wordpress自动生成的密码,但是登陆的时候必须用注册时候填写的密码?

    1. 因为这段代码只是修改字段的,不涉及发邮件过程,所以邮件还是wordpress默认的

        1. 这问题之前也有人问过,但我到现在还没抽出空来研究…我一般是用到了就研究下,最近在折腾电子商务

          1. 呵呵好的,谢谢。希望楼主以后有时间可以研究下嘿嘿!

  3. 请问如何增加一个单选框,让用户同意遵守法律及网站相关规定(链接到一个规则页面),才可以注册……?

    1. 请参考这篇文章中的步骤1和2,为注册表单添加验证信息的方法,按照相同的方式可以增加一个checkbox并检测用户是否选中

    1. 看不懂也挺好啊,不用做苦逼的程序员

      1. 莫非你是传说中的女程序猿?!!幸会。

        1. 非也非也,我是传说中的家庭主妇

          1. 你们聊的真有意思

评论功能已关闭