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

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

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.

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

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.

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

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.

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

@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

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ă

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

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

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

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

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.

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

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
