修改露兜大神ludou-custom-register.4.0插件使之贴合网站需求

大概十年前就造访过露兜博客了,那时候wordpress遇到搞不定的事,老是去他的博客上留言求助,和知更鸟WP大学一样,都是一些愿意帮助小白站长们的大神。近期又使用了ludou-custom-register这款wordpress注册免邮箱验证的插件,发现已经升级到4.0版本了,而且跟以前的版本不同,这个版本已经是一个独立的php文件,可以说非常之简洁了。由于个人对注册表单有不同的理解,于是对这款插件进行了小修改,让他更贴合我的网站需求。

首先要说一下ludou-custom-register.4.0这款插件,功能很强大,主要功能如下:
一,不需要验证邮箱,对于用户注册体验更友好(虽然会导致用户随便填写一个邮箱来注册)
二,用户注册时可以选择订阅者和投稿者,投稿者就意味着可以写文章,管理审核通过后能发表。
三,注册时即让用户填写好昵称,启用本插件可关闭用户修改个人资料的权限了。
四,支持验证码防止机器人恶意注册(不过使用时发现这功能有BUG不显示了,但不影响正常注册)

因为我只需要这个免邮箱验证和让用户填写昵称的功能(填写昵称后可配合代码,实现让站内注册用评论时显示昵称隐藏用户名,实现安全性的目的)。所以我需要对这款插件的代码进行修改。
原代码如下:

<pre class="prettyprint linenums" >
<?php
/*
Plugin Name: Ludou Custom User Register
Plugin URI: http://www.ludou.org/wordpress-ludou-custom-user-register.html
Description: 修改默认的后台用户注册表单,用户可以自行输入密码,不必用Email接收密码,跳过Email验证。用户可自行选择注册的身份角色。带有验证码功能,防止恶意注册。
Version: 3.0
Author: Ludou
Author URI: http://www.ludou.org
*/

if (!isset($_SESSION)) {
 	session_start();
	session_regenerate_id(TRUE);
}

/**
 * 后台注册模块,添加注册表单,修改新用户通知。
 */
if ( !function_exists('wp_new_user_notification') ) :
/**
 * Notify the blog admin of a new user, normally via email.
 *
 * @since 2.0
 *
 * @param int $user_id User ID
 * @param string $plaintext_pass Optional. The user's plaintext password
 */
function wp_new_user_notification($user_id, $plaintext_pass = '', $flag='') {
	if(func_num_args() > 1 && $flag !== 1)
		return;

	$user = new WP_User($user_id);

	$user_login = stripslashes($user->user_login);
	$user_email = stripslashes($user->user_email);

	// The blogname option is escaped with esc_html on the way into the database in sanitize_option
	// we want to reverse this for the plain text arena of emails.
	$blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);

	$message  = sprintf(__('New user registration on your site %s:'), $blogname) . "\r\n\r\n";
	$message .= sprintf(__('Username: %s'), $user_login) . "\r\n\r\n";
	$message .= sprintf(__('E-mail: %s'), $user_email) . "\r\n";

	@wp_mail(get_option('admin_email'), sprintf(__('[%s] New User Registration'), $blogname), $message);
	
	if ( empty($plaintext_pass) )
		return;

	// 你可以在此修改发送给用户的注册通知Email
	$message  = sprintf(__('Username: %s'), $user_login) . "\r\n";
	$message .= sprintf(__('Password: %s'), $plaintext_pass) . "\r\n";
	$message .= '登陆网址: ' . wp_login_url() . "\r\n";

	// sprintf(__('[%s] Your username and password'), $blogname) 为邮件标题
	wp_mail($user_email, sprintf(__('[%s] Your username and password'), $blogname), $message);
}
endif;

/* 修改注册表单 */
function ludou_show_password_field() {
  // 生成token,防止跨站攻击
	$token = md5(uniqid(rand(), true));
	
	$_SESSION['ludou_register_584226_token'] = $token;
	
	define('LCR_PLUGIN_URL', plugin_dir_url( __FILE__ ));
?>
<style type="text/css">
<!--
#user_role {
  padding: 2px;
  -moz-border-radius: 4px 4px 4px 4px;
  border-style: solid;
  border-width: 1px;
  line-height: 15px;
}

#user_role option {
	padding: 2px;
}
-->
</style>
<p>
	<label for="user_nick">昵称<br/>
		<input id="user_nick" class="input" type="text" size="25" value="<?php echo empty($_POST['user_nick']) ? '':$_POST['user_nick']; ?>" name="user_nick" />
	</label>
</p>
<p>
	<label for="user_pwd1">密码(至少6位)<br/>
		<input id="user_pwd1" class="input" type="password" size="25" value="" name="user_pass" />
	</label>
</p>
<p>
	<label for="user_pwd2">重复密码<br/>
		<input id="user_pwd2" class="input" type="password" size="25" value="" name="user_pass2" />
	</label>
</p>
<p style="margin:0 0 10px;">
	<label>用户身份:
		<select name="user_role" id="user_role">
			<option value="subscriber" <?php if(!empty($_POST['user_role']) && $_POST['user_role'] == 'subscriber') echo 'selected="selected"';?>>订阅者</option>
			<option value="contributor" <?php if(!empty($_POST['user_role']) && $_POST['user_role'] == 'contributor') echo 'selected="selected"';?>>投稿者</option>
		</select>
	</label>
	<br />
</p>
<p>
	<label>
	<img id="captcha_img" src="<?php echo constant("LCR_PLUGIN_URL"); ?>/captcha/captcha.php" title="看不清?点击更换" alt="看不清?点击更换" onclick="document.getElementById('captcha_img').src='<?php echo constant("LCR_PLUGIN_URL"); ?>/captcha/captcha.php?'+Math.random();document.getElementById('CAPTCHA').focus();return false;" />
	</label>
</p>
<input type="hidden" name="spam_check" value="<?php echo $token; ?>" />
<?php
}

/* 处理表单提交的数据 */
function ludou_check_fields($login, $email, $errors) {
  if(empty($_POST['spam_check']) || $_POST['spam_check'] != $_SESSION['ludou_register_584226_token'])
		$errors->add('spam_detect', "<strong>错误</strong>:请勿恶意注册");
	
	if (!isset($_POST['user_nick']) || trim($_POST['user_nick']) == '')
	  $errors->add('user_nick', "<strong>错误</strong>:昵称必须填写");
	  
	if(strlen($_POST['user_pass']) < 6)
		$errors->add('password_length', "<strong>错误</strong>:密码长度至少6位");
	elseif($_POST['user_pass'] != $_POST['user_pass2'])
		$errors->add('password_error', "<strong>错误</strong>:两次输入的密码必须一致");

	if($_POST['user_role'] != 'contributor' && $_POST['user_role'] != 'subscriber')
		$errors->add('role_error', "<strong>错误</strong>:不存在的用户身份");
}

/* 保存表单提交的数据 */
function ludou_register_extra_fields($user_id, $password="", $meta=array()) {
	$userdata = array();
	$userdata['ID'] = $user_id;
	$userdata['user_pass'] = $_POST['user_pass'];
	$userdata['role'] = $_POST['user_role'];
	$userdata['nickname'] = str_replace(array('<','>','&','"','\'','#','^','*','_','+','$','?','!'), '', $_POST['user_nick']);
  
	$pattern = '/[一-龥]/u';
  if(preg_match($pattern, $_POST['user_login'])) {
    $userdata['user_nicename'] = $user_id;
  }
  
	wp_new_user_notification( $user_id, $_POST['user_pass'], 1 );
	wp_update_user($userdata);
}

function remove_default_password_nag() {
	global $user_ID;
	delete_user_setting('default_password_nag', $user_ID);
	update_user_option($user_ID, 'default_password_nag', false, true);
}

function ludou_register_change_translated_text( $translated_text, $untranslated_text, $domain ) {
  if ( $untranslated_text === 'A password will be e-mailed to you.' || $untranslated_text === 'Registration confirmation will be emailed to you.' )
    return '';
  else if ($untranslated_text === 'Registration complete. Please check your e-mail.' || $untranslated_text === 'Registration complete. Please check your email.')
    return '注册成功!';
  else
    return $translated_text;
}

add_filter('gettext', 'ludou_register_change_translated_text', 20, 3);
add_action('admin_init', 'remove_default_password_nag');
add_action('register_form','ludou_show_password_field');
add_action('register_post','ludou_check_fields',10,3);
add_action('user_register', 'ludou_register_extra_fields');

</pre>

经过我的修改优化后,代码是这样的:

<pre class="prettyprint linenums" >
<?php
/*
Plugin Name: Ludou Custom User Register
Plugin URI: http://www.ludou.org/wordpress-ludou-custom-user-register.html
Description: 修改默认的后台用户注册表单,用户可以自行输入密码,不必用Email接收密码,跳过Email验证。用户可自行选择注册的身份角色。带有验证码功能,防止恶意注册。
Version: 3.0
Author: Ludou
Author URI: http://www.ludou.org
*/

if (!isset($_SESSION)) {
 	session_start();
	session_regenerate_id(TRUE);
}

/**
 * 后台注册模块,添加注册表单,修改新用户通知。
 */
if ( !function_exists('wp_new_user_notification') ) :
/**
 * Notify the blog admin of a new user, normally via email.
 *
 * @since 2.0
 *
 * @param int $user_id User ID
 * @param string $plaintext_pass Optional. The user's plaintext password
 */
function wp_new_user_notification($user_id, $plaintext_pass = '', $flag='') {
	if(func_num_args() > 1 && $flag !== 1)
		return;

	$user = new WP_User($user_id);

	$user_login = stripslashes($user->user_login);
	$user_email = stripslashes($user->user_email);

	// The blogname option is escaped with esc_html on the way into the database in sanitize_option
	// we want to reverse this for the plain text arena of emails.
	$blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);

	$message  = sprintf(__('New user registration on your site %s:'), $blogname) . "\r\n\r\n";
	$message .= sprintf(__('Username: %s'), $user_login) . "\r\n\r\n";
	$message .= sprintf(__('E-mail: %s'), $user_email) . "\r\n";

	@wp_mail(get_option('admin_email'), sprintf(__('[%s] New User Registration'), $blogname), $message);
	
	if ( empty($plaintext_pass) )
		return;

	// 你可以在此修改发送给用户的注册通知Email
	$message  = sprintf(__('Username: %s'), $user_login) . "\r\n";
	$message .= sprintf(__('Password: %s'), $plaintext_pass) . "\r\n";
	$message .= '登陆网址: ' . wp_login_url() . "\r\n";

	// sprintf(__('[%s] Your username and password'), $blogname) 为邮件标题
	wp_mail($user_email, sprintf(__('[%s] Your username and password'), $blogname), $message);
}
endif;

/* 修改注册表单 */
function ludou_show_password_field() {
  // 生成token,防止跨站攻击
	$token = md5(uniqid(rand(), true));
	
	$_SESSION['ludou_register_584226_token'] = $token;
	
	define('LCR_PLUGIN_URL', plugin_dir_url( __FILE__ ));
?>
<style type="text/css">
<!--
#user_role {
  padding: 2px;
  -moz-border-radius: 4px 4px 4px 4px;
  border-style: solid;
  border-width: 1px;
  line-height: 15px;
}

#user_role option {
	padding: 2px;
}
-->
</style>
<p>
	<label for="user_nick">昵称<br/>
		<input id="user_nick" class="input" type="text" size="25" value="<?php echo empty($_POST['user_nick']) ? '':$_POST['user_nick']; ?>" name="user_nick" />
	</label>
</p>
<p>
	<label for="user_pwd1">密码(至少6位)<br/>
		<input id="user_pwd1" class="input" type="password" size="25" value="" name="user_pass" />
	</label>
</p>
<p>
	<label for="user_pwd2">重复密码<br/>
		<input id="user_pwd2" class="input" type="password" size="25" value="" name="user_pass2" />
	</label>
</p>

<input type="hidden" name="spam_check" value="<?php echo $token; ?>" />
<?php
}

/* 处理表单提交的数据 */
function ludou_check_fields($login, $email, $errors) {
  if(empty($_POST['spam_check']) || $_POST['spam_check'] != $_SESSION['ludou_register_584226_token'])
		$errors->add('spam_detect', "<strong>错误</strong>:请勿恶意注册");
	
	if (!isset($_POST['user_nick']) || trim($_POST['user_nick']) == '')
	  $errors->add('user_nick', "<strong>错误</strong>:昵称必须填写");
	  
	if(strlen($_POST['user_pass']) < 6)
		$errors->add('password_length', "<strong>错误</strong>:密码长度至少6位");
	elseif($_POST['user_pass'] != $_POST['user_pass2'])
		$errors->add('password_error', "<strong>错误</strong>:两次输入的密码必须一致");

}

/* 保存表单提交的数据 */
function ludou_register_extra_fields($user_id, $password="", $meta=array()) {
	$userdata = array();
	$userdata['ID'] = $user_id;
	$userdata['user_pass'] = $_POST['user_pass'];
	$userdata['role'] = $_POST['user_role'];
	$userdata['nickname'] = str_replace(array('<','>','&','"','\'','#','^','*','_','+','$','?','!'), '', $_POST['user_nick']);
  
	$pattern = '/[一-龥]/u';
  if(preg_match($pattern, $_POST['user_login'])) {
    $userdata['user_nicename'] = $user_id;
  }
  
	wp_new_user_notification( $user_id, $_POST['user_pass'], 1 );
	wp_update_user($userdata);
}

function remove_default_password_nag() {
	global $user_ID;
	delete_user_setting('default_password_nag', $user_ID);
	update_user_option($user_ID, 'default_password_nag', false, true);
}

function ludou_register_change_translated_text( $translated_text, $untranslated_text, $domain ) {
  if ( $untranslated_text === 'A password will be e-mailed to you.' || $untranslated_text === 'Registration confirmation will be emailed to you.' )
    return '';
  else if ($untranslated_text === 'Registration complete. Please check your e-mail.' || $untranslated_text === 'Registration complete. Please check your email.')
    return '注册成功!';
  else
    return $translated_text;
}

add_filter('gettext', 'ludou_register_change_translated_text', 20, 3);
add_action('admin_init', 'remove_default_password_nag');
add_action('register_form','ludou_show_password_field');
add_action('register_post','ludou_check_fields',10,3);
add_action('user_register', 'ludou_register_extra_fields');

</pre>

以上代码的效果图是这样的:

图片[1]-修改露兜大神ludou-custom-register.4.0插件使之贴合网站需求-墨铺

如果觉得上面的代码刚好符合需求,可以在安装原4.0插件后对代码进行更换,更换时先禁用插件,修改好再启用,这样如果跟主题或其他插件有冲突也不会造成影响。或者直接复制代码转存为php文件,再打包成zip文件上传插件安装也是可以的。

© 版权声明
THE END
喜欢请点赞支持!
点赞10 分享
大话西游 抢沙发

蒹葭苍苍,白露为霜

    所谓伊人,在水一方