Cum să editezi un profil de utilizator în partea din față?

18 feb. 2011, 23:25:32
Vizualizări: 132K
Voturi: 91

Cum pot edita un profil de utilizator în frontend cu ajutorul unui formular?
prenume, nume, nume utilizator, adresă de email și parolă

0
Toate răspunsurile la întrebare 1
20
119

Puteți face acest lucru copiind fișierul page.php al temei dvs. într-un fișier nou numit, de exemplu, user-profile.php și adăugând la începutul acestuia următorul cod:

<?php
/**
 * Template Name: Profil Utilizator
 *
 * Permite utilizatorilor să își actualizeze profilurile din Frontend.
 *
 */

/* Obține informațiile utilizatorului. */
global $current_user, $wp_roles;
//get_currentuserinfo(); //învechit din versiunea 3.1

/* Încarcă fișierul de înregistrare. */
//require_once( ABSPATH . WPINC . '/registration.php' ); //învechit din versiunea 3.1
$error = array();    
/* Dacă profilul a fost salvat, actualizează profilul. */
if ( 'POST' == $_SERVER['REQUEST_METHOD'] && !empty( $_POST['action'] ) && $_POST['action'] == 'update-user' ) {

    /* Actualizează parola utilizatorului. */
    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[] = __('Parolele introduse nu se potrivesc. Parola dumneavoastră nu a fost actualizată.', 'profile');
    }

    /* Actualizează informațiile utilizatorului. */
    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[] = __('Adresa de email introdusă nu este validă. Vă rugăm să încercați din nou.', 'profile');
        elseif(email_exists(esc_attr( $_POST['email'] )) != $current_user->ID )
            $error[] = __('Această adresă de email este deja utilizată de alt utilizator. Încercați alta.', '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'] ) );

    /* Redirecționează astfel încât pagina să afișeze informațiile actualizate.*/
  /*Nu sunt autorul acestui cod - Nu știu de ce, dar a funcționat pentru mine după modificarea liniei de mai jos la if ( count($error) == 0 ){ */
    if ( count($error) == 0 ) {
        //acțiune pentru plugin-uri și salvarea câmpurilor suplimentare
        do_action('edit_user_profile_update', $current_user->ID);
        wp_redirect( get_permalink() );
        exit;
    }
}
?>

apoi înlocuiți bucla acelei pagini cu următoarea:

<?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('Trebuie să fiți autentificat pentru a vă edita profilul.', '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('Prenume', '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('Nume', '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('Website', '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('Parolă *', 'profile'); ?> </label>
                        <input class="text-input" name="pass1" type="password" id="pass1" />
                    </p><!-- .form-password -->
                    <p class="form-password">
                        <label for="pass2"><?php _e('Repetă Parola *', 'profile'); ?></label>
                        <input class="text-input" name="pass2" type="password" id="pass2" />
                    </p><!-- .form-password -->
                    <p class="form-textarea">
                        <label for="description"><?php _e('Informații Biografice', 'profile') ?></label>
                        <textarea name="description" id="description" rows="3" cols="50"><?php the_author_meta( 'description', $current_user->ID ); ?></textarea>
                    </p><!-- .form-textarea -->
                    
                    <?php 
                        //acțiune pentru plugin-uri și câmpuri suplimentare
                        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('Actualizează', '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('Ne pare rău, nicio pagină nu corespunde criteriilor dumneavoastră.', 'profile'); ?>
    </p><!-- .no-data -->
<?php endif; ?>

și tot ce vă rămâne de făcut este să creați o pagină nouă și să selectați "profil utilizator" ca șablon de pagină.

dacă toate acestea sunt prea mult, puteți folosi unele plugin-uri care fac munca grea pentru dumneavoastră, cum ar fi:

19 feb. 2011 03:06:30
Comentarii

Răspunsul tău a funcționat excelent pentru mine! Aș putea folosi o metodă similară pentru a edita un articol existent? Vezi întrebarea mea aici: http://wordpress.stackexchange.com/questions/9912/front-end-post-editing-using-a-form

Carson Carson
21 feb. 2011 05:39:24

funcționează această metodă și cu câmpuri personalizate în formularul de înregistrare?

User User
18 mar. 2011 11:01:00

Mulțumesc pentru asta, funcționează perfect. Cum aș putea adăuga un mesaj care apare după ce profilul a fost actualizat cu succes? În acest moment nu se întâmplă nimic.

Andrew Andrew
28 sept. 2011 06:27:38

De fapt, cred că am reușit să o fac să funcționeze, este acceptabil? Am modificat codul tău astfel:

if ( !$error ) { wp_redirect( get_permalink() .'?updated=true' ); exit; }

și apoi am adăugat <?php if ( $_GET['updated'] == 'true' ) : ?> <p>Profilul tău a fost actualizat</p> <?php endif; ?>

Andrew Andrew
28 sept. 2011 06:42:42

Mulțumesc pentru asta, totuși, email-ul nu se actualizează și nici website-ul. Celelalte câmpuri se actualizează, însă. Poți să te gândești la un motiv pentru care ar fi așa? Mulțumesc.

Claire Claire
19 sept. 2012 16:00:23

@Nicola, am avut aceeași problemă. Este pentru că email-ul și URL-ul website-ului nu sunt user meta; sunt stocate în tabelul wp_users (față de tabelul wp_usermeta). Pentru a actualiza email-ul și URL-ul, trebuie să folosești wp_update_user(), în loc de update_usermeta().

Ryan Ryan
2 nov. 2012 19:44:49

Se pare că acest lucru nu verifică adresele de email duplicate, ceea ce poate cauza probleme, cum este cazul meu unde permit utilizatorilor să se autentifice prin email.

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

Este un exemplu pe care îl poți edita și adăuga propriile verificări

Bainternet Bainternet
23 dec. 2012 02:02:32

@BandonRandon Am actualizat codul cu o simplă validare de email, verificare pentru duplicate și am adăugat câțiva action hooks pe care WordPress îi folosește pentru a permite integrarea plugin-urilor. mulțumesc

Bainternet Bainternet
23 dec. 2012 10:07:09

Super, deja am început să modific asta și funcționează destul de bine. Doar ca să menționez ceea ce au observat și alții, email folosește wp_update_user nu update_usermeta, dar asta e o remediere ușoară

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

Te rog să citești asta @Bainternet. Nu am fost surprins când am ajuns la final și am văzut avatarul tău

raam86 raam86
30 ian. 2014 13:01:12

@raam86 - Nu am fost surprins să te văd în rețeaua SO.

Bainternet Bainternet
30 ian. 2014 17:04:11

Eroare: registration.php este depreciat începând cu versiunea 3.1 fără nicio alternativă disponibilă. Acest fișier nu mai trebuie inclus.

Towfiq Towfiq
9 feb. 2014 11:45:54

Este în regulă dacă nu există wp_verify_nonce()?

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

nu este recomandat, ar trebui să validezi întotdeauna cererea cu cât mai multe metode posibile, iar aceasta este doar una dintre ele.

Bainternet Bainternet
5 mai 2014 17:44:58

@Bainternet mulțumesc pentru fragmentul de cod frumos. Am editat câteva corecții și am comentat câteva linii învechite.

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

Folosim versiunea PRO a ProfilePress (https://profilepress.net) pentru editarea profilului pe front-end și nu am putea fi mai mulțumiți de ea.

W3Guy W3Guy
27 dec. 2016 18:30:31

acest $referer rămâne singuratic în cod. Cred că de aceea nu sunt redirecționat după actualizare.

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

Am folosit acest cod pentru ca utilizatorii mei invitați să își schimbe doar numele afișat, am reușit să preiau câmpurile necesare, dar nu am reușit să salvez. Atașat este fișierul PHP pe pastebin: https://pastebin.com/4sXXu8MU

theKing theKing
25 sept. 2020 14:45:17

Cod frumos, mulțumesc! A trebuit doar să schimb condițiile if ( !empty( $_POST[... cu if ( isset( $_POST[... astfel încât utilizatorul să poată actualiza informațiile sale cu valoare goală. De exemplu, să șteargă descrierea sa.

gael gael
7 oct. 2021 13:31:16
Arată celelalte 15 comentarii