Как добавить чекбоксы и радио-кнопки на страницу профиля
Мне хотелось кастомизировать страницу профиля, добавив новые поля для получения дополнительной информации о пользователе, такие как "Пол" или "Языки общения". У меня получилось заставить работать текстовые поля ввода, но возникла проблема с радио-кнопками и чекбоксами. Вот мой код:
function my_user_field( $user ) {
?>
<h3><?php _e('Больше о вас'); ?></h3>
<table class="form-table">
<tr>
<th>
<label for="Dealing Type"><?php _e('Пол'); ?>
</label></th>
<td><span class="description"><?php _e('Ваш пол?'); ?></span><br>
<label><input type="radio" name="gender" value="Male">Мужской<br /></label>
<label><input type="radio" name="gender" value="Female">Женский<br /></label>
</td>
</tr>
<tr>
<th>
<label for="company"><?php _e('Компания'); ?>
</label></th>
<td>
<span class="description"><?php _e('Введите название вашей компании'); ?></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('Языки'); ?>
</label></th>
<td><input type="checkbox" name="language[]" value="English" /> Английский<br />
<input type="checkbox" name="language[]" value="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' );
Значения "Пол" и "Языки" не передаются через $_POST[]. Я новичок в программировании, надеюсь на вашу помощь.

Вы пропустили значение "checked" для input элементов
<input type="checkbox" name="language" <?php if (get_the_author_meta( 'language', $user->ID) == 'Mandarin' ) { ?>checked="checked"<?php }?> value="Mandarin" /> Mandarin<br />
Также, usermeta имеет ключ dealing, но вы проверяете $_POST['gender']
Наконец, у вас должна быть отдельная usermeta для английского и для китайского, так как они не являются взаимоисключающими
[исправлено: рабочий код] [исправлено2: несколько языков]
<?php
$lingo = array('en' => 'Английский', 'md' => '普通話', 'es' => 'Испанский', 'fr' => 'Французский', 'pt' => 'Португальский');
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('Дополнительная информация о вас'); ?></h3>
<table class="form-table">
<tr>
<th>
<label for="Dealing Type"><?php _e('Пол'); ?>
</label></th>
<td><span class="description"><?php _e('Ваш пол?'); ?></span><br>
<label><input type="radio" name="dealing" <?php if ($gender == 'Male' ) { ?>checked="checked"<?php }?> value="Male">Мужской<br /></label>
<label><input type="radio" name="dealing" <?php if ($gender == 'Female' ) { ?>checked="checked"<?php }?> value="Female">Женский<br /></label>
</td>
</tr>
<tr>
<th>
<label for="company"><?php _e('Компания'); ?>
</label></th>
<td>
<span class="description"><?php _e('Введите название вашей компании'); ?></span><br>
<input type="text" name="company" id="company" value="<?php echo $company; ?>" class="regular-text" /><br />
</td>
</tr>
<tr>
<th>
<?php _e('Языки'); ?>
</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' );

Хорошо, спасибо за ответ. Я понимаю, как это работает, но что касается типа чекбокса, возможно ли использовать одно usermeta для языков, чтобы хранить и английский, и китайский?

Потому что у меня может быть много языков для выбора, и для упрощения кода лучше сделать его проще. Интересно, возможно ли использовать массив?

Спасибо, brasofilo, ты просто супер!! Но как насчет отображения выбранного элемента на главной странице?

Отлично, спасибо! Для фронтенда адаптируйте эту функцию под свои нужды

ок, последний вопрос. Как вставить эту таблицу перед полем пароля? Сейчас эта таблица отображается только под таблицей Пароля, что выглядит довольно странно. Есть ли хук для этого? Я пытался найти, но не смог подобрать подходящий хук.

нет, думаю это невозможно... действие происходит после вывода пароля... может jQuery манипулировать DOM... но это заслуживает отдельного вопроса, а SE предупреждает меня избегать длинных обсуждений в комментариях и предлагает автоматически перенести это обсуждение в чат? :o)

оу... извините за это, у меня недостаточно репутации для чата... неважно... я попробую разобраться сам... в любом случае... спасибо большое :)

@Aleks : Ты пробовал? Я не знаю точно сколько, но думаю, что большая часть кода, который ты находишь здесь в WPSE, добавляется в этот файл (если ты не создашь кастомный плагин для этого, что рекомендуется).
