Come aggiungere checkbox e radio button nella pagina del profilo

21 apr 2012, 13:24:18
Visualizzazioni: 15.3K
Voti: 3

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.

0
Tutte le risposte alla domanda 1
11

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' );
21 apr 2012 14:37:22
Commenti

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?

dev-jim dev-jim
21 apr 2012 15:23:58

Non sono sicuro, ma non credo... Comunque, perché vorresti farlo?

brasofilo brasofilo
21 apr 2012 16:10:11

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

dev-jim dev-jim
21 apr 2012 18:15:57

Aggiornato il codice per supportare qualsiasi numero di lingue

brasofilo brasofilo
21 apr 2012 18:59:48

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

dev-jim dev-jim
21 apr 2012 19:14:16

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

brasofilo brasofilo
21 apr 2012 19:30:49

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.

dev-jim dev-jim
21 apr 2012 20:27:11

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)

brasofilo brasofilo
21 apr 2012 20:34:18

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

dev-jim dev-jim
21 apr 2012 20:36:36

Questo dovrebbe essere nel file functions.php? vero/falso?

User User
21 mag 2012 23:12:05

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

brasofilo brasofilo
22 mag 2012 00:10:23
Mostra i restanti 6 commenti