Basically, you can’t show the button and update the meta at the same moment. This has to be done in two separate requests as follows:
- Show the button whereever you want. It needs to be a form that submits to the same page (or an ajax call to another URL, but let’s keep it simple for now).
- Read the value posted from the form.
Here is a simple implementation to make this work, but it can be way improved.
function wpses_385303_change_validate() {
if (is_user_logged_in()) {
$user_id = get_current_user_id();
//If the form was posted (ie. the button was clicked) in a previous request
if (isset($_POST['validate_user'])) {
if ($_POST['validate_user'] == $user_id) {//A little bit of security
if (update_user_meta( $user_id, 'User_meta_change', 'validated' )) {
return "<div class="user_updated">Updated!</div>";
} else {
return "<div class="user_updated error">Not Updated!</div>";
}
}
}
//Show the form
return "<form method='post'>
<input type="hidden" name="validate_user" value="$user_id" />
<input type="submit" value="Validate" />
</form>";
}
}
add_shortcode('change_validate','wpses_385303_change_validate');