Come modificare un profilo utente nel front-end?
Puoi farlo copiando il tuo file page.php del tema in un nuovo file chiamato ad esempio user-profile.php e aggiungendo all'inizio questo codice:
<?php
/**
* Template Name: Profilo Utente
*
* Permette agli utenti di aggiornare i propri profili dal Frontend.
*
*/
/* Ottieni informazioni utente. */
global $current_user, $wp_roles;
//get_currentuserinfo(); //deprecato dalla 3.1
/* Carica il file di registrazione. */
//require_once( ABSPATH . WPINC . '/registration.php' ); //deprecato dalla 3.1
$error = array();
/* Se il profilo è stato salvato, aggiornalo. */
if ( 'POST' == $_SERVER['REQUEST_METHOD'] && !empty( $_POST['action'] ) && $_POST['action'] == 'update-user' ) {
/* Aggiorna la password utente. */
if ( !empty($_POST['pass1'] ) && !empty( $_POST['pass2'] ) {
if ( $_POST['pass1'] == $_POST['pass2'] )
wp_update_user( array( 'ID' => $current_user->ID, 'user_pass' => esc_attr( $_POST['pass1'] ) ) );
else
$error[] = __('Le password inserite non corrispondono. La password non è stata aggiornata.', 'profile');
}
/* Aggiorna le informazioni utente. */
if ( !empty( $_POST['url'] ) )
wp_update_user( array( 'ID' => $current_user->ID, 'user_url' => esc_url( $_POST['url'] ) ) );
if ( !empty( $_POST['email'] ) ){
if (!is_email(esc_attr( $_POST['email'] )))
$error[] = __('L\'email inserita non è valida. Per favore riprova.', 'profile');
elseif(email_exists(esc_attr( $_POST['email'] )) != $current_user->ID )
$error[] = __('Questa email è già utilizzata da un altro utente. Prova con un\'altra.', 'profile');
else{
wp_update_user( array ('ID' => $current_user->ID, 'user_email' => esc_attr( $_POST['email'] )));
}
}
if ( !empty( $_POST['first-name'] ) )
update_user_meta( $current_user->ID, 'first_name', esc_attr( $_POST['first-name'] ) );
if ( !empty( $_POST['last-name'] ) )
update_user_meta($current_user->ID, 'last_name', esc_attr( $_POST['last-name'] ) );
if ( !empty( $_POST['description'] ) )
update_user_meta( $current_user->ID, 'description', esc_attr( $_POST['description'] ) );
/* Reindirizza per mostrare le informazioni aggiornate.*/
/*Non sono l'autore di questo codice - Non so perché ma ha funzionato per me dopo aver cambiato la riga sottostante in if ( count($error) == 0 ){ */
if ( count($error) == 0 ) {
//action hook per plugin e salvataggio campi extra
do_action('edit_user_profile_update', $current_user->ID);
wp_redirect( get_permalink() );
exit;
}
}
?>
poi sostituisci il loop della pagina con questo:
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<div id="post-<?php the_ID(); ?>">
<div class="entry-content entry">
<?php the_content(); ?>
<?php if ( !is_user_logged_in() ) : ?>
<p class="warning">
<?php _e('Devi essere loggato per modificare il tuo profilo.', 'profile'); ?>
</p><!-- .warning -->
<?php else : ?>
<?php if ( count($error) > 0 ) echo '<p class="error">' . implode("<br />", $error) . '</p>'; ?>
<form method="post" id="adduser" action="<?php the_permalink(); ?>">
<p class="form-username">
<label for="first-name"><?php _e('Nome', 'profile'); ?></label>
<input class="text-input" name="first-name" type="text" id="first-name" value="<?php the_author_meta( 'first_name', $current_user->ID ); ?>" />
</p><!-- .form-username -->
<p class="form-username">
<label for="last-name"><?php _e('Cognome', 'profile'); ?></label>
<input class="text-input" name="last-name" type="text" id="last-name" value="<?php the_author_meta( 'last_name', $current_user->ID ); ?>" />
</p><!-- .form-username -->
<p class="form-email">
<label for="email"><?php _e('E-mail *', 'profile'); ?></label>
<input class="text-input" name="email" type="text" id="email" value="<?php the_author_meta( 'user_email', $current_user->ID ); ?>" />
</p><!-- .form-email -->
<p class="form-url">
<label for="url"><?php _e('Sito Web', 'profile'); ?></label>
<input class="text-input" name="url" type="text" id="url" value="<?php the_author_meta( 'user_url', $current_user->ID ); ?>" />
</p><!-- .form-url -->
<p class="form-password">
<label for="pass1"><?php _e('Password *', 'profile'); ?> </label>
<input class="text-input" name="pass1" type="password" id="pass1" />
</p><!-- .form-password -->
<p class="form-password">
<label for="pass2"><?php _e('Ripeti Password *', 'profile'); ?></label>
<input class="text-input" name="pass2" type="password" id="pass2" />
</p><!-- .form-password -->
<p class="form-textarea">
<label for="description"><?php _e('Informazioni Biografiche', 'profile') ?></label>
<textarea name="description" id="description" rows="3" cols="50"><?php the_author_meta( 'description', $current_user->ID ); ?></textarea>
</p><!-- .form-textarea -->
<?php
//action hook per plugin e campi extra
do_action('edit_user_profile',$current_user);
?>
<p class="form-submit">
<?php //echo $referer; ?>
<input name="updateuser" type="submit" id="updateuser" class="submit button" value="<?php _e('Aggiorna', 'profile'); ?>" />
<?php wp_nonce_field( 'update-user' ) ?>
<input name="action" type="hidden" id="action" value="update-user" />
</p><!-- .form-submit -->
</form><!-- #adduser -->
<?php endif; ?>
</div><!-- .entry-content -->
</div><!-- .hentry .post -->
<?php endwhile; ?>
<?php else: ?>
<p class="no-data">
<?php _e('Spiacenti, nessuna pagina corrisponde ai tuoi criteri.', 'profile'); ?>
</p><!-- .no-data -->
<?php endif; ?>
e tutto ciò che ti resta da fare è creare una nuova pagina e selezionare "Profilo Utente" come template della pagina.
se tutto questo è troppo complicato puoi usare alcuni plugin che fanno il lavoro pesante per te come:

La tua risposta ha funzionato perfettamente per me! Potrei usare un metodo simile per modificare un post esistente? Vedi la mia domanda qui: http://wordpress.stackexchange.com/questions/9912/front-end-post-editing-using-a-form

questo metodo funziona anche con i campi personalizzati nel form di registrazione?

Grazie per questo, funziona alla grande. Come potrei aggiungere un messaggio che appaia dopo che il profilo è stato aggiornato con successo? Al momento non fa nulla.

In realtà, penso di averlo fatto funzionare, è accettabile? Ho modificato il tuo codice in:
if ( !$error ) {
wp_redirect( get_permalink() .'?updated=true' );
exit;
}
e poi ho aggiunto <?php if ( $_GET['updated'] == 'true' ) : ?> <p>Il tuo profilo è stato aggiornato</p> <?php endif; ?>

Grazie per questo, tuttavia l'email non si aggiorna e nemmeno il sito web. Gli altri campi invece si aggiornano. Riesci a pensare a un motivo per cui potrebbe accadere? Grazie.

@Nicola, avevo lo stesso problema. È perché l'email e l'URL del sito web non sono metadati utente; sono memorizzati nella tabella wp_users
(rispetto alla tabella wp_usermeta
). Per aggiornare email e URL, devi usare wp_update_user()
, invece di update_usermeta()
.

Sembra che questo non controlli gli indirizzi email duplicati, il che può causare problemi come nel mio caso in cui consento agli utenti di accedere tramite email.

@BandonRandon Ho aggiornato il codice con una semplice validazione dell'email, un controllo di duplicazione e ho aggiunto alcuni action hook che WordPress utilizza per consentire l'integrazione dei plugin. grazie

Fantastico, ho già iniziato a modificare questo e funziona piuttosto bene. Solo per far notare ciò che altri hanno osservato, l'email utilizza wp_update_user
non update_usermeta
ma è una correzione semplice

Per favore leggi questo @Bainternet. Non sono rimasto sorpreso quando sono arrivato alla fine e ho visto il tuo avatar

Errore: registration.php è deprecato dalla versione 3.1 senza alternative disponibili. Questo file non ha più bisogno di essere incluso.

non è raccomandato, dovresti sempre validare la richiesta con più metodi possibili, e questo è solo uno di essi.

@Bainternet grazie per il bel pezzo di codice. Ho modificato alcune correzioni e commentato alcune righe deprecate.

Utilizziamo la versione PRO di ProfilePress (https://profilepress.net) per la modifica del profilo front-end e non potremmo essere più soddisfatti.

questo $referer è per sempre solo nel codice. Immagino sia per questo che non vengo reindirizzato dopo l'aggiornamento.

Ho utilizzato questo codice per permettere ai miei utenti guest di modificare solo il loro Nome Visualizzato, sono riuscito a recuperare i campi richiesti, ma non riesco a salvare. Allego il file PHP su pastebin: https://pastebin.com/4sXXu8MU
