Cum să editezi un profil de utilizator în partea din față?
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:
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
funcționează această metodă și cu câmpuri personalizate în formularul de înregistrare?
User
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
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
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
@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
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.
Este un exemplu pe care îl poți edita și adăuga propriile verificări
Bainternet
@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
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.
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
Eroare: registration.php este depreciat începând cu versiunea 3.1 fără nicio alternativă disponibilă. Acest fișier nu mai trebuie inclus.
Towfiq
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 mulțumesc pentru fragmentul de cod frumos. Am editat câteva corecții și am comentat câteva linii învechite.
Mayeenul Islam
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
acest $referer rămâne singuratic în cod. Cred că de aceea nu sunt redirecționat după actualizare.
Rangel R. Morais
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