Come modificare un profilo utente nel front-end?

18 feb 2011, 23:25:32
Visualizzazioni: 132K
Voti: 91

Come posso modificare un profilo utente nel front-end utilizzando un form?
nome, cognome, nome utente, indirizzo email e password

0
Tutte le risposte alla domanda 1
20
119

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:

19 feb 2011 03:06:30
Commenti

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

Carson Carson
21 feb 2011 05:39:24

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

User User
18 mar 2011 11:01:00

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.

Andrew Andrew
28 set 2011 06:27:38

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; ?>

Andrew Andrew
28 set 2011 06:42:42

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.

Claire Claire
19 set 2012 16:00:23

@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().

Ryan Ryan
2 nov 2012 19:44:49

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.

Brooke. Brooke.
23 dic 2012 00:03:48

È un esempio che puoi modificare e aggiungere i tuoi controlli

Bainternet Bainternet
23 dic 2012 02:02:32

@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

Bainternet Bainternet
23 dic 2012 10:07:09

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

Brooke. Brooke.
23 dic 2012 13:16:45

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

raam86 raam86
30 gen 2014 13:01:12

@raam86 - Non mi ha sorpreso vederti sulla rete SO.

Bainternet Bainternet
30 gen 2014 17:04:11

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

Towfiq Towfiq
9 feb 2014 11:45:54

Va bene se non c'è wp_verify_nonce()?

Nabil Kadimi Nabil Kadimi
5 mag 2014 15:48:44

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

Bainternet Bainternet
5 mag 2014 17:44:58

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

Mayeenul Islam Mayeenul Islam
27 apr 2015 08:50:34

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

W3Guy W3Guy
27 dic 2016 18:30:31

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

Rangel R. Morais Rangel R. Morais
12 apr 2018 05:31:02

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

theKing theKing
25 set 2020 14:45:17

Ottimo codice, grazie! Ho solo dovuto modificare le condizioni if ( !empty( $_POST[... con if ( isset( $_POST[... in modo che l'utente possa aggiornare le sue informazioni anche con valori vuoti. Ad esempio per cancellare la sua descrizione.

gael gael
7 ott 2021 13:31:16
Mostra i restanti 15 commenti