Come aggiungere checkbox e radio button nella pagina del profilo
Vorrei personalizzare la mia pagina profilo aggiungendo nuovi campi per ottenere più informazioni dagli utenti come "Genere" o "Lingue parlate". Sono riuscito a far funzionare i campi di testo, ma ho problemi con i campi di tipo radio e checkbox. Ecco il mio codice:
function my_user_field( $user ) {
?>
<h3><?php _e('Altro su di te'); ?></h3>
<table class="form-table">
<tr>
<th>
<label for="Dealing Type"><?php _e('Genere'); ?>
</label></th>
<td><span class="description"><?php _e('Qual è il tuo genere?'); ?></span><br>
<label><input type="radio" name="gender" value="Maschio">Maschio<br /></label>
<label><input type="radio" name="gender" value="Femmina">Femmina<br /></label>
</td>
</tr>
<tr>
<th>
<label for="company"><?php _e('Azienda'); ?>
</label></th>
<td>
<span class="description"><?php _e('Inserisci il nome della tua azienda'); ?></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('Lingue'); ?>
</label></th>
<td><input type="checkbox" name="languages[]" value="Inglese" /> Inglese<br />
<input type="checkbox" name="languages[]" value="Mandarino" /> Mandarino<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, 'languages', $_POST['languages'] );
}
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' );
I valori per "Genere" e "Lingue" non vengono passati tramite $_POST[]. Sono nuovo nella programmazione, spero possiate aiutarmi.

Manca il valore "checked" per gli input
<input type="checkbox" name="language" <?php if (get_the_author_meta( 'language', $user->ID) == 'Mandarin' ) { ?>checked="checked"<?php }?> value="Mandarin" /> Mandarin<br />
Inoltre, l'usermeta è dealing ma stai controllando $_POST['gender']
Infine, dovresti avere un usermeta per l'Inglese e un altro per il Mandarin, poiché non si escludono a vicenda
[modifica: codice funzionante] [modifica2: lingue multiple]
<?php
$lingo = array('en' => 'Inglese', 'md' => 'Mandarin', 'es' => 'Spagnolo', 'fr' => 'Francese', 'pt' => 'Portoghese');
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('Altro su di te'); ?></h3>
<table class="form-table">
<tr>
<th>
<label for="Dealing Type"><?php _e('Genere'); ?>
</label></th>
<td><span class="description"><?php _e('Genere?'); ?></span><br>
<label><input type="radio" name="dealing" <?php if ($gender == 'Male' ) { ?>checked="checked"<?php }?> value="Male">Maschio<br /></label>
<label><input type="radio" name="dealing" <?php if ($gender == 'Female' ) { ?>checked="checked"<?php }?> value="Female">Femmina<br /></label>
</td>
</tr>
<tr>
<th>
<label for="company"><?php _e('Azienda'); ?>
</label></th>
<td>
<span class="description"><?php _e('Inserisci il nome della tua azienda'); ?></span><br>
<input type="text" name="company" id="company" value="<?php echo $company; ?>" class="regular-text" /><br />
</td>
</tr>
<tr>
<th>
<?php _e('Lingua'); ?>
</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, grazie per la tua risposta. Posso vedere come funziona, però per quanto riguarda il tipo checkbox, è possibile usare un unico usermeta per le lingue per memorizzare sia l'inglese che il mandarino?

Perché potrei avere molte lingue da selezionare, per semplificare, sarebbe meglio mantenere il codice semplice. Mi chiedevo se usare un array sarebbe possibile?

Grazie brasofilo, sei fantastico!! Ma come possiamo mostrare l'elemento selezionato nella pagina frontend?

Ottimo, grazie! Per il frontend, adatta questa funzione alle tue esigenze

ok, un'ultima cosa. Come posso inserire questa tabella prima dell'area della password? Al momento questa tabella viene visualizzata solo sotto la tabella Password, il che è piuttosto strano da vedere. C'è qualche hook per farlo? Ho provato a cercarlo, ma non sono riuscito a trovare l'hook appropriato.

no, penso non sia possibile... l'azione avviene dopo che la password è stata stampata... forse manipolando il DOM con jQuery... ma questo merita un'altra domanda, e SE mi avverte di evitare discussioni estese nei commenti e se volessi spostare automaticamente questa discussione in chat? :o)

oh...scusa per questo, la mia reputazione non è sufficiente per chattare... non importa...proverò a risolverlo da solo...comunque...grazie mille :)

@Aleks: Hai provato? Non so quanto, ma penso che la maggior parte del codice che trovi qui su WPSE venga inserito in questo file (a meno che non crei un plugin personalizzato per gestirlo, cosa che è consigliata).
