0

I got the undefined variable : user_id when i use get_user_meta

$phone = get_user_meta( $user_id, 'phone_no', true );
$icno = get_user_meta( $user_id, 'ic_no', true );

when i try put the above code below this line

$user_id = wp_insert_user( $user_data );

no error occur but my value $phone and $icno become empty

This is my full code

<?php
/*
Template Name: Register
*/
get_header(); 
// Exit if accessed directly
if ( !defined('ABSPATH')) exit;
?>
<html>
    

<body id="login-page" <?php body_class(); ?>>
<div class="container">
<div class="row register-page-container p-3 p-lg-5 mt-5 d-flex justify-content-center w-75 mx-auto">
<?php
global $wpdb, $user_ID;
    
//Check whether the user is already logged in 
if (!$user_ID) {
// Default page shows register form. 
// To show Login form set query variable action=login
$action = (isset($_GET['action']) ) ? $_GET['action'] : 0;
// Login Page
if ($action === "login") { ?>
<?php 
$login = (isset($_GET['login']) ) ? $_GET['login'] : 0;
if ( $login === "failed" ) {
echo '<div class="col-12 register-error"><strong>ERROR:</strong> Invalid username and/or password.</div>';
} elseif ( $login === "empty" ) {
echo '<div class="col-12 register-error"><strong>ERROR:</strong> Username and/or Password is empty.</div>';
} elseif ( $login === "false" ) {
echo '<div class="col-12 register-error"><strong>ERROR:</strong> You are logged out.</div>';
}
?>
<div class="col-md-5">
<?php 
$args = array(
'redirect' => home_url().'/login/', 
);
wp_login_form($args); ?>
<p class="text-center"><a class="mr-2" href="<?php echo wp_registration_url(); ?>">Register Now</a>
<span clas="mx-2">·</span><a class="ml-2" href="<?php echo wp_lostpassword_url( ); ?>" title="Lost Password">Lost Password?</a></p>
</div>
<?php
} else { // Register Page ?>

<?php if(get_option('users_can_register')) { ?>
<div class="col-md-5 manual-register-form">
<form action="" method="post"> 
<p> 
<label for="user_login">Username</label>
<input type="text" name="username" placeholder="Type your Username Here" class="register-input mb-4" value="<?php if( ! empty($username) ) echo $username; ?>" /><br />
</p>
<p> 
<label for="user_password">Password</label>
<input type="password" name="password" placeholder="Type your Password Here" class="register-input mb-4" value="<?php if( ! empty($password) ) echo $password; ?>" /><br />
</p>
<p> 
<label for="user_email">Email</label>
<input type="text" name="email" placeholder="Type your Email Here" class="register-input mb-4" value="<?php if( ! empty($email) ) echo $email; ?>" /> <br /> 
</p>
<p> 
<label for="phone_no">Phone</label>
<input type="text" name="phone_no" placeholder="Type your Phone Here" class="register-input mb-4" value="<?php if( ! empty($phone) ) echo $phone; ?>" /> <br /> 
</p>
<p> 
<label for="ic_no">IC No</label>
<input type="text" name="ic_no" placeholder="Type your IC No Here" class="register-input mb-4" value="<?php if( ! empty($icno) ) echo $icno; ?>" /> <br /> 
</p>
<input type="submit" id="register-submit-btn" class="mb-4" name="submit" value="SignUp" /> 
</form>
<p>Already have an account? <a href="/login">Login Here</a></p>
</div>
<?php } else {
echo "Registration is currently disabled. Please try again later."; 
    
}
} ?>
<?php
if ( $_POST ) {
$error = 0;
    
$username = esc_sql($_REQUEST['username']); 
if ( empty($username) ) {
echo '<div class="col-12 register-error">User name should not be empty.</div>'; 
$error = 1;
}

$email = esc_sql($_REQUEST['email']);
if ( !preg_match("/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$/", $email) ) { 
echo '<div class="col-12 register-error">Please enter a valid email.</div>';
$error = 1;
}
    
$phone = esc_sql($_REQUEST['phone_no']);
if ( empty($phone) ) { 
echo '<div class="col-12 register-error">Please enter a valid phone.</div>';
$error = 1;
}
    
$error = 0; 
$icno = esc_sql($_REQUEST['ic_no']);
if ( empty($icno) ) { 
echo '<div class="col-12 register-error">Please enter a valid IC No.</div>';
$error = 1;
}   
    
if ( $error == 0 ) {
$password = esc_sql($_REQUEST['password']); 
if ( empty($password) ) {
echo '<div class="col-12 register-error">Password should not be empty.</div>'; 
$error = 1;
}
$phone = get_user_meta( $user_id, 'phone_no', true );
$icno = get_user_meta( $user_id, 'ic_no', true );

$username  = $_POST['username'];
$password  = $_POST['password'];
$email   = $_POST['email'];
$icno   = $_POST['ic_no'];
$phone   = $_POST['phone_no'];

    $user_data = [
    'user_login' => $username,
    'user_pass'  => $password,
    'user_email'   => $email,

];
 
$user_id = wp_insert_user( $user_data );

update_user_meta( $user_id, 'phone_no', $phone );
update_user_meta( $user_id, 'ic_no', $icno ); 

// // success
if ( ! is_wp_error( $user_id ) ) {
    echo 'User created: '. $user_id;
}   
 
 else {
 echo 'Registration error';
}
}
}
if ( $error != 2 ) { ?> 
<?php  }
} else { ?>
<p>You are logged in. Click <a href="<?php bloginfo('wpurl'); ?>">here to go home</a></p>
<?php } ?>
</div>
</div>
<?php get_footer(); 
?>
</body>
</html>
3
  • It is really, really no good idea to insert unfiltered or unsanitized values. You should validate the $_POST data before writing them to database.
    – moped
    Commented Feb 23, 2021 at 7:23
  • From what I could see, $user_id is indeed not defined before those get_user_meta() calls. Only $user_ID that got defined earlier in your code.
    – Sally CJ
    Commented Feb 23, 2021 at 9:42
  • 1
    ya $user_id and $user_ID is the problem. Thanks for the help
    – Rusydi
    Commented Feb 25, 2021 at 11:10

1 Answer 1

1

I got the undefined variable : user_id when i use get_user_meta

This is because $user_id is empty and undefined, you need to give it a value, and that value needs to be the ID of a user.

when i try put the above code below this line

no error occur but my value $phone and $icno become empty

Yes, you gave $user_id a value so it worked. The reason phone and icno are empty is because there is no user meta for phone and icno. The order you do things in matters. Code is executed from the top of the file to the bottom.

You can't retrieve values before they are added, and you can't use variables before they are set.

2 final notes:

  • indenting your code is important, especially if you share it with other people, and it eliminates an entire class of bugs
  • global $wpdb, $user_ID; should be removed. The code never uses $wpdb and there is no $user_ID global variable unless setup_userdata is called.
0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.