Cum să adaugi checkbox și radio button în pagina de profil WordPress
Am dorit să personalizez pagina de profil prin adăugarea de câmpuri noi pentru a obține mai multe informații de la utilizator, cum ar fi "Gen" sau "Limbi vorbite". Am reușit să fac să funcționeze câmpurile de tip text, dar am probleme cu câmpurile de tip radio și checkbox. Iată codul meu:
function my_user_field( $user ) {
?>
<h3><?php _e('Mai multe despre tine'); ?></h3>
<table class="form-table">
<tr>
<th>
<label for="Dealing Type"><?php _e('Gen'); ?>
</label></th>
<td><span class="description"><?php _e('Genul?'); ?></span><br>
<label><input type="radio" name="gender" value="Male">Bărbat<br /></label>
<label><input type="radio" name="gender" value="Female">Femeie<br /></label>
</td>
</tr>
<tr>
<th>
<label for="company"><?php _e('Companie'); ?>
</label></th>
<td>
<span class="description"><?php _e('Introdu numele companiei'); ?></span><br>
<input type="text" name="company" id="company" value="<?php echo esc_attr( get_the_author_meta( 'company', $user->ID ) ); ?>" class="regular-text" /><br />
</td>
</tr>
<tr>
<th>
<label for="language"><?php _e('Limbi'); ?>
</label></th>
<td><input type="checkbox" name="language[]" value="Engleza" /> Engleză<br />
<input type="checkbox" name="language[]" value="Mandarina" /> Mandarină<br />
</td>
</tr>
</table>
<?php }
function my_save_custom_user_profile_fields( $user_id ) {
if ( !current_user_can( 'edit_user', $user_id ) )
return FALSE;
update_usermeta( $user_id, 'gender', $_POST['gender'] );
update_usermeta( $user_id, 'company', $_POST['company'] );
update_usermeta( $user_id, 'language', $_POST['language'] );
}
add_action( 'show_user_profile', 'my_user_field' );
add_action( 'edit_user_profile', 'my_user_field' );
add_action( 'personal_options_update', 'my_save_custom_user_profile_fields' );
add_action( 'edit_user_profile_update', 'my_save_custom_user_profile_fields' );
Câmpurile "Gen" și "Limbi" nu sunt transmise prin $_POST[]. Sunt începător în programare, sper că mă puteți ajuta.

Îți lipsește valoarea "checked" pentru input-uri
<input type="checkbox" name="language" <?php if (get_the_author_meta( 'language', $user->ID) == 'Mandarin' ) { ?>checked="checked"<?php }?> value="Mandarin" /> Mandarin<br />
De asemenea, metadatele utilizatorului sunt dealing dar tu verifici $_POST['gender']
În final, ar trebui să ai o metadată pentru Engleză și alta pentru Mandarină, deoarece acestea nu se exclud reciproc
[edit: cod funcțional] [edit2: multiple limbi]
<?php
$lingo = array('en' => 'Engleză', 'md' => 'Mandarină', 'es' => 'Spaniolă', 'fr' => 'Franceză', 'pt' => 'Portugheză');
function my_user_field( $user ) {
$gender = get_the_author_meta( 'dealing', $user->ID);
$company = esc_attr( get_the_author_meta( 'company', $user->ID ) );
?>
<h3><?php _e('Mai multe despre tine'); ?></h3>
<table class="form-table">
<tr>
<th>
<label for="Dealing Type"><?php _e('Gen'); ?>
</label></th>
<td><span class="description"><?php _e('Gen?'); ?></span><br>
<label><input type="radio" name="dealing" <?php if ($gender == 'Male' ) { ?>checked="checked"<?php }?> value="Male">Masculin<br /></label>
<label><input type="radio" name="dealing" <?php if ($gender == 'Female' ) { ?>checked="checked"<?php }?> value="Female">Feminin<br /></label>
</td>
</tr>
<tr>
<th>
<label for="company"><?php _e('Companie'); ?>
</label></th>
<td>
<span class="description"><?php _e('Introdu numele companiei tale'); ?></span><br>
<input type="text" name="company" id="company" value="<?php echo $company; ?>" class="regular-text" /><br />
</td>
</tr>
<tr>
<th>
<?php _e('Limba'); ?>
</th>
<td><?php
global $lingo;
foreach($lingo as $key => $value) {
$code = 'language_'.$key;
$lang = get_the_author_meta( $code, $user->ID);
?>
<label><input type="checkbox" name="<?php echo $code; ?>" <?php if ($lang == 'yes' ) { ?>checked="checked"<?php }?> value="yes" /> <?php echo $value; ?></label><br />
<?php }
?>
</td>
</tr>
</table>
<?php
}
function my_save_custom_user_profile_fields( $user_id ) {
if ( !current_user_can( 'edit_user', $user_id ) )
return FALSE;
update_usermeta( $user_id, 'dealing', $_POST['dealing'] );
update_usermeta( $user_id, 'company', $_POST['company'] );
global $lingo;
foreach($lingo as $key => $value) {
$code = "language_".$key;
update_usermeta( $user_id, $code, $_POST[$code] );
}
}
add_action( 'show_user_profile', 'my_user_field' );
add_action( 'edit_user_profile', 'my_user_field' );
add_action( 'personal_options_update', 'my_save_custom_user_profile_fields' );
add_action( 'edit_user_profile_update', 'my_save_custom_user_profile_fields' );

Ok, mulțumesc pentru răspuns. Înțeleg cum funcționează, însă în ceea ce privește tipul checkbox, este posibil să folosești un singur usermeta pentru limbi pentru a stoca atât engleza cât și mandarina?

Pentru că aș putea avea multe limbi de bifat, din motive de simplificare, ar fi mai bine să fie simplu în cod. Mă întrebam dacă folosirea unui array ar fi posibilă?

Mulțumesc brasofilo, ești genial!! Dar cum putem afișa elementele bifate pe pagina principală?

Super, mulțumesc! Pentru partea de frontend, adaptează această funcție după nevoile tale

ok, încă un lucru. Cum pot insera acest tabel înaintea zonei de parolă? Momentan, acest tabel este afișat doar sub tabelul Parolă, ceea ce arată destul de ciudat. Există vreun hook pentru asta? Am încercat să caut, dar nu am găsit hook-ul potrivit.

nu, cred că nu este posibil... acțiunea are loc după ce parola este afișată... poate cu jQuery manipulând DOM-ul... dar asta merită o altă întrebare, iar SE mă avertizează să evit discuțiile prelungite în comentarii și dacă aș vrea să mut automat această discuție în chat? :o)

oh... îmi pare rău pentru asta, reputația mea nu este suficientă pentru chat... nu contează... voi încerca să rezolv singur... oricum... mulțumesc mult :)

@Aleks : Ai încercat? Nu știu exact cât de mult, dar cred că majoritatea codului pe care îl găsești aici pe WPSE este introdus în acest fișier (decât dacă creezi un plugin personalizat pentru a gestiona acest lucru, ceea ce este recomandat).
