[ update1 ]我正在使用ClassiCraft主题,我不知道在哪里自定义登录和注册表单
[ update2 ]我知道注册过程没有通过wp_authenticate,因为我在我的插件中重新定义了它
我在Wordpress世界中相当新鲜(实际上昨天我第一次得到了它)并且我在完成我正在进行的一个小项目时遇到了一些困难。
该项目相当简单(或者我认为),包括在注册时收到的电子邮件确认链接,以验证提供的电子邮件地址,以防止使用注册商甚至不拥有的虚假电子邮件。
我已经完成了所有工作,只要我点击注册按钮就会导致登录新创建的用户。
我搜索了“wp在注册时禁用自动登录”等内容,但我找不到任何有用的东西。我甚至测试了一些应该完全按照我需要做的插件,但没有一个能够工作。
此外,我没有使用任何插件进行注册/登录表单,看来wp-login.php文件中的代码实际上甚至没有使用...
有人有想法吗?感谢
答案 0 :(得分:0)
好的,所以如果没有主题,我就无法真正回答你。
但我可以告诉你我会尝试什么。
<强> 1。在user_register
挂钩上添加操作,添加一个帖子元,用于检查用户是否确认了他的电子邮件。
add_action( 'user_register', 'add_has_confirm_email_user_meta');
function add_has_confirm_email_user_meta( $user_id ) {
update_user_meta( $user_id, 'has_confirm_email', 0 );
}
<强> 2。注册后,防止用户自动登录。
在这里,我无法告诉你适用于你的钩子。例如,wordpress注册的钩子是user_register
,但如果你有woocommerce,我将使用的钩子是woocommerce_registration_redirect
。因此,请在注册主题后尝试查找可用的挂钩。
在所有情况下,函数中的代码都是:
function custom_registration_redirect() {
// Log out the user
wp_logout();
// The login url could be an other, with woocommerce for example it is : get_permalink(get_option('woocommerce_myaccount_page_id')
$login_url = wp_login_url();
// Redirect on it
wp_redirect( $login_url);
exit;
}
还需要在此页面上添加消息以提醒用户,他将收到一封确认其帐户的电子邮件。
第3。在用户提交登录表单时阻止用户登录
在wp_login hook上添加操作以实现此目的。
add_action('wp_login', 'prevent_user_from_login', 10, 2);
function prevent_user_from_login($user_login, $user = null ) {
if ( !$user ) {
$user = get_user_by('login', $user_login);
}
if ( !$user ) {
// not logged in
return;
}
// Get user meta
$has_confirm_email = get_user_meta( $user->ID, 'has_confirm_email', true );
if ( $has_confirm_email == '0' ) {
// Clear cookies, a.k.a log user out
wp_clear_auth_cookie();
$login_url = wp_login_url();
$login_url = add_query_arg( 'has_confirm_email', '0', $login_url);
wp_redirect( $login_url );
exit;
}
}
<强> 4。如果我们将has_confirm_email
设为0
add_filter('login_message', 'has_not_confirm_email_login_message');
function has_not_confirm_email_login_message($message) {
if ( isset( $_GET['has_confirm_email'] ) && $_GET['has_confirm_email'] == 0 ) {
$message = '<div id="login_error">You have not confirmed your email.</div>';
}
return $message;
}
<强> 5。发送电子邮件并附上确认其电子邮件的链接。
您需要生成一个令牌才能添加到网址中。
对于更改Wordpress发送的默认电子邮件的挂钩,您可以使用自Wordpress 4.9以来可用的wp_new_user_notification_email
。
在函数本身中,您可以执行以下操作:
function wp_new_user_notification_email( $wp_new_user_notification_email, $user, $blogname) {
// Generate the token (there is other function available with php 7, but this one works great)
$token = bin2hex(openssl_random_pseudo_bytes(16));
// Add the token to the user
update_user_meta( $user->id, 'confirm_email_token', $token );
// Get your login url
$log_in_url = wp_login_url();
// Add user id and token to the url
$url = add_query_arg(
array(
'token' => $token,
'user_id' => $user->id
),
$log_in_url
);
//
$wp_new_user_notification_email['subject'] = 'Welcome on our website, please confirm your email';
$wp_new_user_notification_email['message'] = 'Blablabla... the url to confirm is: '. $url;
return $wp_new_user_notification_email;
}
<强> 6。在登录页面上挂钩以检查$ _GET,查找user_id和令牌。
这里我们检查令牌和用户。如果一切正常,请将用户元has_confirm_email
更新为1,以便用户可以连接并添加消息:“您的电子邮件已经确认,您现在可以登录”
add_action( 'login_init', 'custom_login_init');
function custom_login_init(){
if(!empty($_GET['token']) && !empty($_GET['user_id'])) {
if(get_the_author_meta( 'confirm_email_token', $_GET['user_id']) === $_GET['token']) {
// Set the has_confirm_email to 1 so the user can now log in
update_user_meta( $user_id, 'has_confirm_email', 1);
update_user_meta( $user_id, 'confirm_email_token', '');
echo 'Your email has been confirmed, you can now log in';
}
}
}
<强> 7。思考时间
好吧,毕竟他,我会想一点,看看我告诉你的,检查是否没有错误^^。 如果您需要更多解释,请与我联系。
我认为这对你来说是一个好的开始,如果你找到右钩子,你将很快实现这一目标。
小心在我使用过的某些挂钩上,因为您的主题可能使用了自定义注册等。
答案 1 :(得分:0)
这是我做的:
终于抓住了一小段代码,负责在主题文件夹本身内的页面user_auth.php中注册后自动登录(该文件还包含登录和注册表单的布局)
wp_set_auth_cookie( $user_id, true, $secure_cookie );
确保在注册后显示一条消息,通知用户检查其电子邮件中的确认电子邮件