WP的注册和登录功能小结 | WordPress Register and Login
今天发生了一件因遗漏手机导致失联的事件。作为一个小站的维护人,当然第一时间想到邮件系统和私信系统。前者实现失效的情况下,引发了苏歌在站内搭建论坛的想法。
WordPress搭建论坛有若干方法,通常要么利用插件bbPress,要么利用WP和Discuz的整合。后者要再多维护一个程序,麻烦。前者功能简单,容易上手。于是计划用bbPress实施。 可是,WP的用户管理十分令人无语。新用户注册不给密码,要管理员给。管理员还得手动给注册者发邮件(这又牵涉到VPS是否支持邮件函数)。好,就算你注册成功了,登录的时候不跳转,跳转了有时登录不成功,总之一堆麻烦事。
WP的前台注册和登录功能,要怎么改善呢?(当然你可以花钱买个插件实现)
一、添加注册表单(记得养成备份的好习惯)
1、首先在当前主题的目录下新建一个php文件,命名为reg-page.php,然后将page.php中的所有代码复制到reg-page.php中;需要我们前面几篇文章提过的工具WinSCP。在主题目录下把page.php下载回来改名字,改代码即可。
2、删除reg-page.php开头的所有注释,即 /* 与 */ ,以及它们之间的所有内容;
3、搜索:the_content,可以查找到类似代码:<?php the_content(); ?>,将这段代码替换成以下代码(注意使用UTF-8编码另存为替换原来的reg-page.php) 如果你在reg-page.php中找不到the_content,那么你可以查找:get_template_part,可找到类似代码:<?php get_template_part( ‘content’, ‘page’ ); ?>,将content-page.php中的所有代码替换这部分代码即可。再用下面的代码替换<?php the_content(); ?>
<?php the_content(); ?></span> <span style="font-family: 'comic sans ms', sans-serif;"><?php if(!empty($error)) {</span> <span style="font-family: 'comic sans ms', sans-serif;">echo '<p class="ludou-error">'.$error.'</p>';</span> <span style="font-family: 'comic sans ms', sans-serif;">}</span> <span style="font-family: 'comic sans ms', sans-serif;">if (!is_user_logged_in()) { ?></span> <span style="font-family: 'comic sans ms', sans-serif;"><form name="registerform" method="post" action="<?php echo $_SERVER["REQUEST_URI"]; ?>" class="ludou-reg"></span> <span style="font-family: 'comic sans ms', sans-serif;"><p></span> <span style="font-family: 'comic sans ms', sans-serif;"><label for="user_login">用户名<br /></span> <span style="font-family: 'comic sans ms', sans-serif;"><input type="text" name="user_login" tabindex="1" id="user_login" class="input" value="<?php if(!empty($sanitized_user_login)) echo $sanitized_user_login; ?>" /></span> <span style="font-family: 'comic sans ms', sans-serif;"></label></span> <span style="font-family: 'comic sans ms', sans-serif;"></p></span> <span style="font-family: 'comic sans ms', sans-serif;"> </span> <span style="font-family: 'comic sans ms', sans-serif;"><p></span> <span style="font-family: 'comic sans ms', sans-serif;"><label for="user_email">电子邮件<br /></span> <span style="font-family: 'comic sans ms', sans-serif;"><input type="text" name="user_email" tabindex="2" id="user_email" class="input" value="<?php if(!empty($user_email)) echo $user_email; ?>" size="25" /></span> <span style="font-family: 'comic sans ms', sans-serif;"></label></span> <span style="font-family: 'comic sans ms', sans-serif;"></p></span> <span style="font-family: 'comic sans ms', sans-serif;"> </span> <span style="font-family: 'comic sans ms', sans-serif;"><p></span> <span style="font-family: 'comic sans ms', sans-serif;"><label for="user_pwd1">密码(至少6位)<br /></span> <span style="font-family: 'comic sans ms', sans-serif;"><input id="user_pwd1" class="input" tabindex="3" type="password" tabindex="21" size="25" value="" name="user_pass" /></span> <span style="font-family: 'comic sans ms', sans-serif;"></label></span> <span style="font-family: 'comic sans ms', sans-serif;"></p></span> <span style="font-family: 'comic sans ms', sans-serif;"> </span> <span style="font-family: 'comic sans ms', sans-serif;"><p></span> <span style="font-family: 'comic sans ms', sans-serif;"><label for="user_pwd2">重复密码<br /></span> <span style="font-family: 'comic sans ms', sans-serif;"><input id="user_pwd2" class="input" tabindex="4" type="password" tabindex="21" size="25" value="" name="user_pass2" /></span> <span style="font-family: 'comic sans ms', sans-serif;"></label></span> <span style="font-family: 'comic sans ms', sans-serif;"></p></span> <span style="font-family: 'comic sans ms', sans-serif;"> </span> <span style="font-family: 'comic sans ms', sans-serif;"><p class="submit"></span> <span style="font-family: 'comic sans ms', sans-serif;"><input type="hidden" name="ludou_reg" value="ok" /></span> <span style="font-family: 'comic sans ms', sans-serif;"><button class="button button-primary button-large" type="submit">注册</button></span> <span style="font-family: 'comic sans ms', sans-serif;"></p></span> <span style="font-family: 'comic sans ms', sans-serif;"></form></span> <span style="font-family: 'comic sans ms', sans-serif;"><?php } else {</span> <span style="font-family: 'comic sans ms', sans-serif;">echo '<p class="ludou-error">您已注册成功,并已登录!</p>';</span> <span style="font-family: 'comic sans ms', sans-serif;">} ?>
二、添加表单处理代码
在reg-page.php开头处中,将第一个 <?php 改成代码二(注意使用UTF-8编码保存):
<?php</span> <span style="font-family: 'comic sans ms', sans-serif;">/**</span> <span style="font-family: 'comic sans ms', sans-serif;">* Template Name: 前台注册</span> <span style="font-family: 'comic sans ms', sans-serif;">* 作者:露兜</span> <span style="font-family: 'comic sans ms', sans-serif;">* 博客:https://www.ludou.org/</span> <span style="font-family: 'comic sans ms', sans-serif;">*</span> <span style="font-family: 'comic sans ms', sans-serif;">* 2013年02月02日 :</span> <span style="font-family: 'comic sans ms', sans-serif;">* 首个版本</span> <span style="font-family: 'comic sans ms', sans-serif;">*/</span> <span style="font-family: 'comic sans ms', sans-serif;"> </span> <span style="font-family: 'comic sans ms', sans-serif;">if( !empty($_POST['ludou_reg']) ) {</span> <span style="font-family: 'comic sans ms', sans-serif;">$error = '';</span> <span style="font-family: 'comic sans ms', sans-serif;">$sanitized_user_login = sanitize_user( $_POST['user_login'] );</span> <span style="font-family: 'comic sans ms', sans-serif;">$user_email = apply_filters( 'user_registration_email', $_POST['user_email'] );</span> <span style="font-family: 'comic sans ms', sans-serif;"> </span> <span style="font-family: 'comic sans ms', sans-serif;">// Check the username</span> <span style="font-family: 'comic sans ms', sans-serif;">if ( $sanitized_user_login == '' ) {</span> <span style="font-family: 'comic sans ms', sans-serif;">$error .= '<strong>错误</strong>:请输入用户名。<br />';</span> <span style="font-family: 'comic sans ms', sans-serif;">} elseif ( ! validate_username( $sanitized_user_login ) ) {</span> <span style="font-family: 'comic sans ms', sans-serif;">$error .= '<strong>错误</strong>:此用户名包含无效字符,请输入有效的用户名<br />。';</span> <span style="font-family: 'comic sans ms', sans-serif;">$sanitized_user_login = '';</span> <span style="font-family: 'comic sans ms', sans-serif;">} elseif ( username_exists( $sanitized_user_login ) ) {</span> <span style="font-family: 'comic sans ms', sans-serif;">$error .= '<strong>错误</strong>:该用户名已被注册,请再选择一个。<br />';</span> <span style="font-family: 'comic sans ms', sans-serif;">}</span> <span style="font-family: 'comic sans ms', sans-serif;"> </span> <span style="font-family: 'comic sans ms', sans-serif;">// Check the e-mail address</span> <span style="font-family: 'comic sans ms', sans-serif;">if ( $user_email == '' ) {</span> <span style="font-family: 'comic sans ms', sans-serif;">$error .= '<strong>错误</strong>:请填写电子邮件地址。<br />';</span> <span style="font-family: 'comic sans ms', sans-serif;">} elseif ( ! is_email( $user_email ) ) {</span> <span style="font-family: 'comic sans ms', sans-serif;">$error .= '<strong>错误</strong>:电子邮件地址不正确。!<br />';</span> <span style="font-family: 'comic sans ms', sans-serif;">$user_email = '';</span> <span style="font-family: 'comic sans ms', sans-serif;">} elseif ( email_exists( $user_email ) ) {</span> <span style="font-family: 'comic sans ms', sans-serif;">$error .= '<strong>错误</strong>:该电子邮件地址已经被注册,请换一个。<br />';</span> <span style="font-family: 'comic sans ms', sans-serif;">}</span> <span style="font-family: 'comic sans ms', sans-serif;"> </span> <span style="font-family: 'comic sans ms', sans-serif;">// Check the password</span> <span style="font-family: 'comic sans ms', sans-serif;">if(strlen($_POST['user_pass']) < 6)</span> <span style="font-family: 'comic sans ms', sans-serif;">$error .= '<strong>错误</strong>:密码长度至少6位!<br />';</span> <span style="font-family: 'comic sans ms', sans-serif;">elseif($_POST['user_pass'] != $_POST['user_pass2'])</span> <span style="font-family: 'comic sans ms', sans-serif;">$error .= '<strong>错误</strong>:两次输入的密码必须一致!<br />';</span> <span style="font-family: 'comic sans ms', sans-serif;"> </span> <span style="font-family: 'comic sans ms', sans-serif;">if($error == '') {</span> <span style="font-family: 'comic sans ms', sans-serif;">$user_id = wp_create_user( $sanitized_user_login, $_POST['user_pass'], $user_email );</span> <span style="font-family: 'comic sans ms', sans-serif;"> </span> <span style="font-family: 'comic sans ms', sans-serif;">if ( ! $user_id ) {</span> <span style="font-family: 'comic sans ms', sans-serif;">$error .= sprintf( '<strong>错误</strong>:无法完成您的注册请求... 请联系<a href="mailto:%s">管理员</a>!<br />', get_option( 'admin_email' ) );</span> <span style="font-family: 'comic sans ms', sans-serif;">}</span> <span style="font-family: 'comic sans ms', sans-serif;">else if (!is_user_logged_in()) {</span> <span style="font-family: 'comic sans ms', sans-serif;">$user = get_user_by( 'login', $sanitized_user_login );</span> <span style="font-family: 'comic sans ms', sans-serif;">$user_id = $user->ID;</span> <span style="font-family: 'comic sans ms', sans-serif;"> </span> <span style="font-family: 'comic sans ms', sans-serif;">// 自动登录</span> <span style="font-family: 'comic sans ms', sans-serif;">wp_set_current_user($user_id, $user_login);</span> <span style="font-family: 'comic sans ms', sans-serif;">wp_set_auth_cookie($user_id);</span> <span style="font-family: 'comic sans ms', sans-serif;">do_action('wp_login', $user_login);</span> <span style="font-family: 'comic sans ms', sans-serif;">}</span> <span style="font-family: 'comic sans ms', sans-serif;">}</span> <span style="font-family: 'comic sans ms', sans-serif;">}
进入WordPress管理后台 – 页面 – 创建页面,标题为注册(可以自己起名),内容填上注册说明等,右侧可以选择模板,选择 前台注册 即可。此页面即前台注册页面,将该页面的链接放到网站任何位置,供用户点击注册即可。
登录功能跟上述类似。
一、添加登录表单
1、首先在当前主题的目录下新建一个php文件,命名为page-login.php,然后将page.php中的所有代码复制到page-login.php中;
2、删除page-login.php开头的所有注释,即 /* 与 */ ,以及它们之间的所有内容;
3、搜索:the_content,可以查找到类似代码<?php the_content(); ?>,将其替换成代码一(注意使用UTF-8编码保存) 如果你在page-login.php中找不到the_content,那么你可以查找:get_template_part,可找到类似代码:<?php get_template_part( ‘content’, ‘page’ ); ?>,将content-page.php中的所有代码替换这部分代码即可。再用下面的代码替换其中的<?php the_content(); ?>
<?php the_content(); ?></span> <span style="font-family: 'comic sans ms', sans-serif;"><?php if(!empty($error)) {</span> <span style="font-family: 'comic sans ms', sans-serif;">echo '<p class="ludou-error">'.$error.'</p>';</span> <span style="font-family: 'comic sans ms', sans-serif;">}</span> <span style="font-family: 'comic sans ms', sans-serif;">if (!is_user_logged_in()) { ?></span> <span style="font-family: 'comic sans ms', sans-serif;"><form name="loginform" method="post" action="<?php echo $_SERVER["REQUEST_URI"]; ?>" class="ludou-login"></span> <span style="font-family: 'comic sans ms', sans-serif;"><p></span> <span style="font-family: 'comic sans ms', sans-serif;"><label for="log">用户名<br /></span> <span style="font-family: 'comic sans ms', sans-serif;"><input type="text" name="log" id="log" class="input" value="<?php if(!empty($user_name)) echo $user_name; ?>" size="20" /></span> <span style="font-family: 'comic sans ms', sans-serif;"></label></span> <span style="font-family: 'comic sans ms', sans-serif;"></p></span> <span style="font-family: 'comic sans ms', sans-serif;"><p></span> <span style="font-family: 'comic sans ms', sans-serif;"><label for="pwd">密码(至少6位)<br /></span> <span style="font-family: 'comic sans ms', sans-serif;"><input id="pwd" class="input" type="password" size="25" value="" name="pwd" /></span> <span style="font-family: 'comic sans ms', sans-serif;"></label></span> <span style="font-family: 'comic sans ms', sans-serif;"></p></span> <span style="font-family: 'comic sans ms', sans-serif;"> </span> <span style="font-family: 'comic sans ms', sans-serif;"><p class="forgetmenot"></span> <span style="font-family: 'comic sans ms', sans-serif;"><label for="rememberme"></span> <span style="font-family: 'comic sans ms', sans-serif;"><input name="rememberme" type="checkbox" id="rememberme" value="1" <?php checked( $rememberme ); ?> /></span> <span style="font-family: 'comic sans ms', sans-serif;">记住我</span> <span style="font-family: 'comic sans ms', sans-serif;"></label></span> <span style="font-family: 'comic sans ms', sans-serif;"></p></span> <span style="font-family: 'comic sans ms', sans-serif;"> </span> <span style="font-family: 'comic sans ms', sans-serif;"><p class="submit"></span> <span style="font-family: 'comic sans ms', sans-serif;"><input type="hidden" name="redirect_to" value="<?php if(isset($_GET['r'])) echo $_GET['r']; ?>" /></span> <span style="font-family: 'comic sans ms', sans-serif;"><input type="hidden" name="ludou_token" value="<?php echo $token; ?>" /></span> <span style="font-family: 'comic sans ms', sans-serif;"><button class="button button-primary button-large" type="submit">登录</button></span> <span style="font-family: 'comic sans ms', sans-serif;"></p></span> <span style="font-family: 'comic sans ms', sans-serif;"></form></span> <span style="font-family: 'comic sans ms', sans-serif;"><?php } else {</span> <span style="font-family: 'comic sans ms', sans-serif;">echo '<p class="ludou-error">您已登录!(<a href="'.wp_logout_url().'" title="登出">登出?</a>)</p>';</span> <span style="font-family: 'comic sans ms', sans-serif;">} ?>
二、添加表单处理代码 在page-login.php开头处中,将第一个 <?php 替换成以下代码(注意使用UTF-8编码保存),
<?php</span> <span style="font-family: 'comic sans ms', sans-serif;">/**</span> <span style="font-family: 'comic sans ms', sans-serif;">* Template Name: 前台登录</span> <span style="font-family: 'comic sans ms', sans-serif;">* 作者:露兜</span> <span style="font-family: 'comic sans ms', sans-serif;">* 博客:https://www.ludou.org/</span> <span style="font-family: 'comic sans ms', sans-serif;">*</span> <span style="font-family: 'comic sans ms', sans-serif;">* 2013年5月6日 :</span> <span style="font-family: 'comic sans ms', sans-serif;">* 首个版本</span> <span style="font-family: 'comic sans ms', sans-serif;">*</span> <span style="font-family: 'comic sans ms', sans-serif;">* 2013年5月21日 :</span> <span style="font-family: 'comic sans ms', sans-serif;">* 防止刷新页面重复提交数据</span> <span style="font-family: 'comic sans ms', sans-serif;">*/</span> <span style="font-family: 'comic sans ms', sans-serif;"> </span> <span style="font-family: 'comic sans ms', sans-serif;">if(!isset($_SESSION))</span> <span style="font-family: 'comic sans ms', sans-serif;">session_start();</span> <span style="font-family: 'comic sans ms', sans-serif;"> </span> <span style="font-family: 'comic sans ms', sans-serif;">if( isset($_POST['ludou_token']) && ($_POST['ludou_token'] == $_SESSION['ludou_token'])) {</span> <span style="font-family: 'comic sans ms', sans-serif;">$error = '';</span> <span style="font-family: 'comic sans ms', sans-serif;">$secure_cookie = false;</span> <span style="font-family: 'comic sans ms', sans-serif;">$user_name = sanitize_user( $_POST['log'] );</span> <span style="font-family: 'comic sans ms', sans-serif;">$user_password = $_POST['pwd'];</span> <span style="font-family: 'comic sans ms', sans-serif;">if ( empty($user_name) || ! validate_username( $user_name ) ) {</span> <span style="font-family: 'comic sans ms', sans-serif;">$error .= '<strong>错误</strong>:请输入有效的用户名。<br />';</span> <span style="font-family: 'comic sans ms', sans-serif;">$user_name = '';</span> <span style="font-family: 'comic sans ms', sans-serif;">}</span> <span style="font-family: 'comic sans ms', sans-serif;"> </span> <span style="font-family: 'comic sans ms', sans-serif;">if( empty($user_password) ) {</span> <span style="font-family: 'comic sans ms', sans-serif;">$error .= '<strong>错误</strong>:请输入密码。<br />';</span> <span style="font-family: 'comic sans ms', sans-serif;">}</span> <span style="font-family: 'comic sans ms', sans-serif;"> </span> <span style="font-family: 'comic sans ms', sans-serif;">if($error == '') {</span> <span style="font-family: 'comic sans ms', sans-serif;">// If the user wants ssl but the session is not ssl, force a secure cookie.</span> <span style="font-family: 'comic sans ms', sans-serif;">if ( !empty($user_name) && !force_ssl_admin() ) {</span> <span style="font-family: 'comic sans ms', sans-serif;">if ( $user = get_user_by('login', $user_name) ) {</span> <span style="font-family: 'comic sans ms', sans-serif;">if ( get_user_option('use_ssl', $user->ID) ) {</span> <span style="font-family: 'comic sans ms', sans-serif;">$secure_cookie = true;</span> <span style="font-family: 'comic sans ms', sans-serif;">force_ssl_admin(true);</span> <span style="font-family: 'comic sans ms', sans-serif;">}</span> <span style="font-family: 'comic sans ms', sans-serif;">}</span> <span style="font-family: 'comic sans ms', sans-serif;">}</span> <span style="font-family: 'comic sans ms', sans-serif;"> </span> <span style="font-family: 'comic sans ms', sans-serif;">if ( isset( $_GET['r'] ) ) {</span> <span style="font-family: 'comic sans ms', sans-serif;">$redirect_to = $_GET['r'];</span> <span style="font-family: 'comic sans ms', sans-serif;">// Redirect to https if user wants ssl</span> <span style="font-family: 'comic sans ms', sans-serif;">if ( $secure_cookie && false !== strpos($redirect_to, 'wp-admin') )</span> <span style="font-family: 'comic sans ms', sans-serif;">$redirect_to = preg_replace('|^http://|', 'https://', $redirect_to);</span> <span style="font-family: 'comic sans ms', sans-serif;">}</span> <span style="font-family: 'comic sans ms', sans-serif;">else {</span> <span style="font-family: 'comic sans ms', sans-serif;">$redirect_to = admin_url();</span> <span style="font-family: 'comic sans ms', sans-serif;">}</span> <span style="font-family: 'comic sans ms', sans-serif;"> </span> <span style="font-family: 'comic sans ms', sans-serif;">if ( !$secure_cookie && is_ssl() && force_ssl_login() && !force_ssl_admin() && ( 0 !== strpos($redirect_to, 'https') ) && ( 0 === strpos($redirect_to, 'http') ) )</span> <span style="font-family: 'comic sans ms', sans-serif;">$secure_cookie = false;</span> <span style="font-family: 'comic sans ms', sans-serif;"> </span> <span style="font-family: 'comic sans ms', sans-serif;">$creds = array();</span> <span style="font-family: 'comic sans ms', sans-serif;">$creds['user_login'] = $user_name;</span> <span style="font-family: 'comic sans ms', sans-serif;">$creds['user_password'] = $user_password;</span> <span style="font-family: 'comic sans ms', sans-serif;">$creds['remember'] = !empty( $_POST['rememberme'] );</span> <span style="font-family: 'comic sans ms', sans-serif;">$user = wp_signon( $creds, $secure_cookie );</span> <span style="font-family: 'comic sans ms', sans-serif;">if ( is_wp_error($user) ) {</span> <span style="font-family: 'comic sans ms', sans-serif;">$error .= $user->get_error_message();</span> <span style="font-family: 'comic sans ms', sans-serif;">}</span> <span style="font-family: 'comic sans ms', sans-serif;">else {</span> <span style="font-family: 'comic sans ms', sans-serif;">unset($_SESSION['ludou_token']);</span> <span style="font-family: 'comic sans ms', sans-serif;">wp_safe_redirect($redirect_to);</span> <span style="font-family: 'comic sans ms', sans-serif;">}</span> <span style="font-family: 'comic sans ms', sans-serif;">}</span> <span style="font-family: 'comic sans ms', sans-serif;"> </span> <span style="font-family: 'comic sans ms', sans-serif;">unset($_SESSION['ludou_token']);</span> <span style="font-family: 'comic sans ms', sans-serif;">}</span> <span style="font-family: 'comic sans ms', sans-serif;"> </span> <span style="font-family: 'comic sans ms', sans-serif;">$rememberme = !empty( $_POST['rememberme'] );</span> <span style="font-family: 'comic sans ms', sans-serif;"> </span> <span style="font-family: 'comic sans ms', sans-serif;">$token = md5(uniqid(rand(), true));</span> <span style="font-family: 'comic sans ms', sans-serif;">$_SESSION['ludou_token'] = $token;
进入WordPress管理后台 – 页面 – 创建页面,标题为登录(可以自己起名),内容填上登录说明等,右侧可以选择模板,选择 前台登录 即可。该页面即前台登录页面。 如果想让用户登录后跳转到指定页面,可以在登录链接后面添加名为 r 的get参数,值为跳转的链接地址,如登录页面地址为http://soyee.me/login,如果你想让用户登录后跳转到首页,可以把登录地址改成下面的地址再提供给用户即可:http://soyee.me/login?r=http://soyee.me
以上教程和代码为露兜提供,经实测比众多插件有效。