在wp_INSERT_USER()之后执行多个操作

时间:2021-05-10 作者:user2115227

我的主页上有一个自定义注册表,它可以正确运行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\' );
这两个选项都不起作用。

1 个回复
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()), 请勿向浏览器输出任何内容!

相关推荐

How to secure my php forms

请告诉我如何使用php创建和显示表单的安全建议,我想从安全角度了解我的以下代码是否不受交叉脚本攻击或sql注入或任何形式的攻击或黑客攻击。$form = \'<div class=demessage>\' . esc_html__($message, \"gold\") . \'</div>\' ; $form .= \'<form action=\"\" method=\"post\" name=\"base\">\'; $form .= e