Cómo agregar checkbox y radio button en la página de perfil
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.

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' );

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?

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

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.

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

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

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.

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)

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 :)

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

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