Cómo agregar checkbox y radio button en la página de perfil

21 abr 2012, 13:24:18
Vistas: 15.3K
Votos: 3

Quiero personalizar mi página de perfil agregando nuevos campos para obtener más información del usuario como "Género" o "Idiomas que habla". Logré hacer funcionar los campos de texto, pero tengo problemas con los inputs de tipo radio y checkbox. Aquí está mi código:

function my_user_field( $user ) {
            ?>
                <h3><?php _e('Más sobre ti'); ?></h3>
                <table class="form-table">
                    <tr>
                        <th>
                            <label for="Dealing Type"><?php _e('Género'); ?>
                        </label></th>
                        <td><span class="description"><?php _e('¿Género?'); ?></span><br>
                        <label><input type="radio" name="gender" value="Male">Masculino<br /></label>
                        <label><input type="radio" name="gender" value="Female">Femenino<br /></label>

                        </td>
                    </tr>

                    <tr>
                        <th>
                            <label for="company"><?php _e('Empresa'); ?>
                        </label></th>
                        <td>
                          <span class="description"><?php _e('Ingresa el nombre de tu empresa'); ?></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('Idioma'); ?>
                        </label></th>
                        <td><input type="checkbox" name="language[]" value="English" /> Inglés<br />
                            <input type="checkbox" name="language[]" value="Mandarin" /> Mandarín<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' );

Los campos de "Género" e "Idiomas" no están pasando correctamente por el $_POST[]. Soy nuevo en programación, espero que puedan ayudarme.

0
Todas las respuestas a la pregunta 1
11

Faltan los valores "checked" para los inputs

<input type="checkbox" name="language" <?php if (get_the_author_meta( 'language', $user->ID) == 'Mandarin' ) { ?>checked="checked"<?php }?> value="Mandarin" /> Mandarin<br />

Además, el usermeta es dealing pero estás verificando $_POST['gender']

Finalmente, deberías tener un usermeta para inglés y otro para mandarín, ya que no son mutuamente excluyentes

[editar: código funcional] [editar2: múltiples idiomas]

<?php
$lingo = array('en' => 'Inglés', 'md' => '普通話', 'es' => 'Español', 'fr' => 'Francés', 'pt' => 'Portugués');

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('Más sobre ti'); ?></h3>
    <table class="form-table">
        <tr>
            <th>
                <label for="Dealing Type"><?php _e('Género'); ?>
            </label></th>
            <td><span class="description"><?php _e('¿Género?'); ?></span><br>
            <label><input type="radio" name="dealing" <?php if ($gender == 'Male' ) { ?>checked="checked"<?php }?> value="Male">Masculino<br /></label>
            <label><input type="radio" name="dealing" <?php if ($gender == 'Female' ) { ?>checked="checked"<?php }?> value="Female">Femenino<br /></label>

            </td>
        </tr>
        <tr>
            <th>
                <label for="company"><?php _e('Empresa'); ?>
            </label></th>
            <td>
              <span class="description"><?php _e('Ingresa el nombre de tu empresa'); ?></span><br>
                <input type="text" name="company" id="company" value="<?php echo $company; ?>" class="regular-text" /><br />
            </td>
        </tr>
        <tr>
            <th>
                <?php _e('Idioma'); ?>
            </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 abr 2012 14:37:22
Comentarios

Ok, gracias por tu respuesta. Puedo ver cómo funciona, pero en cuanto al tipo checkbox, ¿es posible usar un usermeta para idiomas que almacene tanto inglés como mandarín?

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

No estoy seguro, pero no creo que sea posible... De todos modos, ¿por qué querrías eso?

brasofilo brasofilo
21 abr 2012 16:10:11

Porque podría tener muchos idiomas para marcar, y por simplificar el código, sería mejor mantenerlo simple. Me pregunto si usar un array sería posible.

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

Actualicé el código para soportar cualquier número de idiomas

brasofilo brasofilo
21 abr 2012 18:59:48

¡Gracias brasofilo, eres increíble!! Pero, ¿qué hay de mostrar el elemento marcado en la página principal?

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

¡Genial, gracias! Para el frontend, adapta esta función a tus necesidades

brasofilo brasofilo
21 abr 2012 19:30:49

ok, una última cosa. ¿Cómo insertar esta tabla antes del área de contraseña? Por ahora, esta tabla solo se muestra debajo de la tabla de Contraseña, lo cual se ve bastante raro. ¿Algún hook para esto? Intenté buscarlo, pero no pude encontrar el hook apropiado.

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

no, creo que esto no es posible... la acción ocurre después de que se imprime la contraseña... tal vez manipulando el DOM con jQuery... pero eso merece otra pregunta, y SE me está advirtiendo que evite discusiones extendidas en los comentarios y si me gustaría mover automáticamente esta discusión al chat? :o)

brasofilo brasofilo
21 abr 2012 20:34:18

oh...lo siento por eso, mi reputación no es suficiente para chatear... no importa...intentaré resolverlo por mi cuenta...de todos modos...muchas gracias :)

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

¿Se supone que esto debe estar en el archivo functions.php? ¿verdadero/falso?

User User
21 may 2012 23:12:05

@Aleks: ¿Lo has intentado? No sé cuánto, pero creo que la mayor parte del código que encuentras aquí en WPSE se coloca en este archivo (a menos que hagas un plugin personalizado para manejar esto, lo cual es recomendado).

brasofilo brasofilo
22 may 2012 00:10:23
Mostrar los 6 comentarios restantes