我的主页上有一个自定义注册表,它可以正确运行wp\\u insert\\u user。但是,在创建用户后,我需要执行以下操作:
立即登录用户,将物品添加到购物车,重定向到结帐,我想我知道如何进行第二项和第三项,但我似乎无法将自动登录作为第一步。
表单代码:
<form action="" method="post" name="user_registeration">
<label for="fname">First name:<span class="error">*</span></label><br>
<input type="text" id="fname" name="fname">
<label for="lname">Last name:<span class="error">*</span></label><br>
<input type="text" id="lname" name="lname">
<label for="phonenum">Phone Number:<span class="error">*</span></label><br>
<input type="text" id="phone_num" name="phonenum">
<label>Email address <span class="error">*</span></label>
<input type="text" name="user_email" class="text" placeholder="Enter Your Email" required />
<label>Password <span class="error">*</span></label>
<input type="password" name="password" class="text" placeholder="Enter Your password" required />
<input type="submit" name="user_registeration" value="NEXT">
验证+插入用户:
<?php if(isset($signUpError)){echo \'<div>\'.$signUpError.\'</div>\';}?>
<?php
if (isset($_POST[\'user_registeration\'])) {
global $reg_errors;
$reg_errors = new WP_Error;
$firstname=$_POST[\'fname\'];
$middlename=$_POST[\'mname\'];
$lastname=$_POST[\'lname\'];
$phonenum=$_POST[\'phone_num\'];
$useremail=$_POST[\'user_email\'];
$password=$_POST[\'password\'];
if( empty( $useremail ) || empty($password)) {
$reg_errors->add(\'field\', \'Required form field is missing\');
}
if ( !is_email( $useremail ) ) {
$reg_errors->add( \'email_invalid\', \'Email id is not valid!\' );
}
if ( email_exists( $useremail ) ) {
$reg_errors->add( \'email\', \'Email Already exist!\' );
}
if ( 5 > strlen( $password ) ) {
$reg_errors->add( \'password\', \'Password length must be greater than 5!\' );
}
if (is_wp_error( $reg_errors )) {
foreach ( $reg_errors->get_error_messages() as $error )
{
$signUpError=\'<p style="color:#FF0000; text-aling:left;"><strong>ERROR</strong>: \'.$error . \'<br /></p>\';
}
}
if ( 1 > count( $reg_errors->get_error_messages() ) ) {
global $username, $useremail;
$firstname = esc_attr( $_POST[\'fname\'] );
$middlename = esc_attr( $_POST[\'mname\'] );
$lastname = esc_attr( $_POST[\'lname\'] );
$useremail = sanitize_email( $_POST[\'user_email\'] );
$password = esc_attr( $_POST[\'password\'] );
$userdata = array(
\'user_login\' => $useremail,
\'user_email\' => $useremail,
\'user_pass\' => $password,
\'first_name\' => $firstname,
\'last_name\' => $lastname,
);
$user = wp_insert_user( $userdata );
}
} ?>
我试着在
$user = wp_insert_user( $userdata );
生产线:
if(!is_wp_error($user)){
wp_set_current_user($user); // set the current wp user
wp_set_auth_cookie($user); // start the cookie for the current registered user
//Add to cart and redirect - I HAVE TRIED REMOVING THIS, STILL DOESN\'T LOGIN
global $woocommerce;
WC()->cart->empty_cart();
$product_id = 1086;
$qty = 1;
$woocommerce->cart->add_to_cart($product_id,$qty);
return wc_get_checkout_url();
}
我也试着去
user_register
行动:
function auto_login_new_user( $user_id ) {
wp_set_current_user( $userid );
wp_set_auth_cookie( $user_id, false, is_ssl() );
//Add to cart and redirect - I HAVE TRIED REMOVING THIS, STILL DOESN\'T LOGIN
global $woocommerce;
WC()->cart->empty_cart();
$product_id = 1086;
$qty = 1;
$woocommerce->cart->add_to_cart($product_id,$qty);
return wc_get_checkout_url();
}
add_action( \'user_register\', \'auto_login_new_user\' );
这两个选项都不起作用。
SO网友:Sally CJ
注意wp_set_auth_cookie()
将设置Cookie(使用setcookie()
) 这意味着必须没有输出(HTML、空格、空行等)发送到浏览器,否则将不会设置或更新cookie。
我这么说是因为当你打电话的时候wp_insert_user()
, 实际上已经有一个输出发送到浏览器,输出是?>
(PHP结束标记)在代码中。例如,此部分:
<?php if(isset($signUpError)){echo \'<div>\'.$signUpError.\'</div>\';}?>
<?php
所以
?>
实际发送到浏览器,因此
setcookie()
失败。此外,你还有
echo
这表明您没有使用正确的钩子自动登录(并重定向)创建的用户。
因此,您应该使用早期挂钩,如template_redirect
创建用户,然后登录用户,最后执行重定向。下面是一个示例,这只是一个基本示例,希望能帮助您编写自己的代码或使现有代码正常工作:
add_action( \'template_redirect\', \'wpse_387961\' );
function wpse_387961() {
// check if the form is submitted,
// clean and validate user input,
// define variables, etc etc.
// ... your code.
// create the user:
$user = wp_insert_user( $userdata );
if ( ! $user || is_wp_error( $user ) ) {
echo \'try again later..\';
exit;
}
// auto-login the user:
wp_set_current_user( $user );
wp_set_auth_cookie( $user );
// then ensure the user is successfully logged-in
if ( (int) $user === get_current_user_id() ) {
// add item to the cart
// ... your code.
// then do the redirect:
wp_redirect( wc_get_checkout_url() );
exit;
} else { // this \'else\' part is just for testing
echo \'auto-login failed?\';
exit;
}
}
事实上
auto_login_new_user()
功能
$userid
是未定义的(我想是拼写错误吧?)。。但无论如何,您不需要使用
user_register
钩只要确保并记住,当通过PHP设置Cookie并执行重定向(使用PHP的本机
header()
使用的函数
wp_redirect()
), 请勿向浏览器输出任何内容!