Как добавить чекбоксы и радио-кнопки на страницу профиля

21 апр. 2012 г., 13:24:18
Просмотры: 15.3K
Голосов: 3

Мне хотелось кастомизировать страницу профиля, добавив новые поля для получения дополнительной информации о пользователе, такие как "Пол" или "Языки общения". У меня получилось заставить работать текстовые поля ввода, но возникла проблема с радио-кнопками и чекбоксами. Вот мой код:

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[]. Я новичок в программировании, надеюсь на вашу помощь.

0
Все ответы на вопрос 1
11

Вы пропустили значение "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' );
21 апр. 2012 г. 14:37:22
Комментарии

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

dev-jim dev-jim
21 апр. 2012 г. 15:23:58

Не уверен, но думаю, что нет... В любом случае, зачем вам это?

brasofilo brasofilo
21 апр. 2012 г. 16:10:11

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

dev-jim dev-jim
21 апр. 2012 г. 18:15:57

Обновил код для поддержки любого количества языков

brasofilo brasofilo
21 апр. 2012 г. 18:59:48

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

dev-jim dev-jim
21 апр. 2012 г. 19:14:16

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

brasofilo brasofilo
21 апр. 2012 г. 19:30:49

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

dev-jim dev-jim
21 апр. 2012 г. 20:27:11

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

brasofilo brasofilo
21 апр. 2012 г. 20:34:18

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

dev-jim dev-jim
21 апр. 2012 г. 20:36:36

Это должно быть в файле functions.php? да/нет?

User User
21 мая 2012 г. 23:12:05

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

brasofilo brasofilo
22 мая 2012 г. 00:10:23
Показать остальные 6 комментариев