J'essaie de créer un formulaire qui permettra aux utilisateurs de mettre à jour leurs informations dès le départ. Je commence tout juste à apprendre PHP (je connais très bien le langage C #). Si j'utilise ce code pour créer un formulaire sur une page WordPress, comment puis-je obtenir les informations de l'utilisateur lorsqu'il appuie sur le bouton "Mettre à jour", puis met à jour la base de données?
function Insert_AccountTable_1()
{
$current_user = wp_get_current_user();
if ($current_user->ID != 0)
{
return <<<HTML
<form class="AlumniForm" method="post">
<h3>Name</h3>
<br>
<table>
<tbody>
<tr>
<th><label for="Username">Username</label></th>
<td><span>$current_user->user_login</span></td>
<td><span class="description">Usernames cannot be changed.</span></td>
</tr>
<tr>
<th><label for="current_user_firstname">First Name</label></th>
<td><input id="current_user_firstname" type="text" name="current_user_firstname" value="$current_user->user_firstname"/></td>
</tr>
<tr>
<th><label for="current_user_lastname">Last Name</label></th>
<td><input id="current_user_lastname" name="current_user_lastname" type="text" value="$current_user->user_lastname"/></td>
</tr>
<tr>
<th><label for="current_user_displayname">Display Name<span class="description">(required)</span></label></th>
<td><input id="current_user_displayname" type="text" value="$current_user->display_name"/></td>
</tr>
</tbody>
</table>
<h3>Contact Info</h3>
<br>
<table>
<tbody>
<tr>
<th><label for="current_user_email">E-mail<span class="description">(Required)</span></label></th>
<td><input id="current_user_email" type="text" value="$current_user->user_email"/></td>
</tr>
<tr>
<th><label for="current_user_url">Website</label></th>
<td><input id="current_user_email" type="text" value="$current_user->user_url"/></td>
</tr>
</tbody>
</table>
<input type="submit" name="current_user_submitupdates">Update</input>
</form>
HTML;
}
else
{
return <<<HTML
<h3>Error - User not logged in</h3>
HTML;
}
}
add_shortcode('InsertAccountTableI', 'Insert_AccountTable_1');
Utilisez wp-admin/admin-post.php
en tant que gestionnaire d’action de formulaire et liez votre fonction personnalisée en tant que rappel à celui-ci.
Un exemple simple pour les mises à jour par courrier électronique. Nous allons utiliser un shortcode nommé [userform]
ici, mais vous pouvez aussi utiliser un modèle.
add_shortcode( 'userform', 'wpse_75723_userform' );
add_action( 'admin_post_update_user_email', 'wpse_75723_update' );
/**
* Create the form.
*/
function wpse_75723_userform()
{
$here = esc_url( home_url( $_SERVER['REQUEST_URI'] ) );
if ( ! is_user_logged_in() )
return 'You have to <a href="' . wp_login_url( $here ) . '">log in</a> to use this page.';
$action = admin_url( 'admin-post.php');
$user_id = get_current_user_id();
return "<form method='post' action='$action'>
<input type='hidden' name='action' value='update_user_email'>
<input type='hidden' name='redirect' value='$here'>
<input type='hidden' name='user_id' value='$user_id'>
<input type='email' name='email' size='15'>
<input type='submit'>
</form>";
}
/**
* Update user email
*/
function wpse_75723_update()
{
if ( ! isset ( $_POST['user_id'] ) )
die( 'no id' );
$user_id = absint( $_POST['user_id'] );
if ( ! current_user_can( 'edit_user', $user_id ) )
die( 'not allowed' );
if ( ! isset ( $_POST['email'] ) )
die( 'no email' );
if ( ! is_email( $_POST['email'] ) )
die( 'invalid email' );
$user = get_userdata( $user_id );
if ( empty ( $user->user_login ) )
die( 'user denied' );
global $wpdb;
$wpdb->query(
$wpdb->prepare(
"UPDATE {$wpdb->users} SET user_email = %s WHERE user_login = %s",
$_POST['email'],
$user->user_login
)
);
$location = isset ( $_POST['redirect'] )
? urldecode( $_POST['redirect'] )
: home_url( '/' );
wp_redirect( $location, 303 );
exit;
}
Insertion…
[userform]
… Dans une page produira une forme de base:
L'utilisateur peut changer son adresse e-mail ici.
Pour comprendre quelles variables sont disponibles et où elles sont stockées, examinez ces fichiers:
wp-admin/user-edit.php
wp-admin/includes/user.php
etwp-includes/user.php
Les tables users
et user_meta
valent également le coup si vous souhaitez envoyer des requêtes SQL en clair.