web-dev-qa-db-fra.com

Comment enregistrer plusieurs options à partir d'un menu déroulant dans le profil de l'utilisateur

J'utilise ce code pour créer la liste déroulante puis enregistrer les valeurs choisies dans la liste déroulante:

<?php
// Display Fields 
add_action( 'show_user_profile', 'add_multiple_choice_dropdown ' );
add_action( 'edit_user_profile', 'add_multiple_choice_dropdown ' );

function add_multiple_choice_dropdown ( $user ) {
?>

<h3>Extra profile information</h3>

<table class="form-table"> 
<tr>
    <th><label for="multi_dropdown">The dropdown with multiple choices</label></th>
    <td>
        <?php 
        //get dropdown saved value
        $selected = esc_attr(get_user_meta( $user->ID, 'multi_dropdown', true )); 
        ?>
    <select name="multi_dropdown" id="multi_dropdown" multiple>
            <option value="first_choice" <?php echo ($selected == "first_choice")?  'selected="selected"' : '' ?>>First Choice</option>
            <option value="second_choice" <?php echo ($selected == "second_choice")?  'selected="selected"' : '' ?>>Second Choice</option>
            <option value="third_choice" <?php echo ($selected == "third_choice")?  'selected="selected"' : '' ?>>Third Choice</option>
    </select>
    <p class="description">Choose from the options above.</p>
    </td>
</tr>
</table>

<?php
}

// Save fields
add_action( 'personal_options_update', 'save_multiple_choices' );
add_action( 'edit_user_profile_update', 'save_multiple_choices' );

function save_multiple_choices( $user_id )
{
if ( isset( $_POST['multi_dropdown'] ) ) {
update_user_meta( $user_id, 'multi_dropdown', $_POST['multi_dropdown'] );
}
?>

Mais bien sûr, cela ne sauvegarde qu'une valeur, car je suppose que je dois sauvegarder les valeurs sélectionnées du menu déroulant dans un tableau. Mais je ne sais pas comment faire ça.

Quelqu'un peut-il s'il vous plaît partager la connaissance?

1
Ami

Vous aurez besoin d’une balise select d’ouverture indiquant à PHP qu’il s’agit d’un tableau. Quelque chose comme ce qui suit devrait vous mettre sur la bonne voie ...

<?php
// Display Fields 
add_action( 'show_user_profile', 'add_multiple_choice_dropdown ' );
add_action( 'edit_user_profile', 'add_multiple_choice_dropdown ' );

function add_multiple_choice_dropdown ( $user ) {
    $current_selections = get_user_meta( $user->ID, 'multi_dropdown', true );
?>

<h3>Extra profile information</h3>

<table class="form-table"> 
<tr>
<th><label for="multi_dropdown" multiple="multiple">The dropdown with multiple choices</label></th>
<td>
<select name="multi_dropdown[]">
        <option value="first_choice" <?php echo ( !empty( $current_selections ) && in_array( 'first_choice', $current_selections ) ? ' selected="selected"' : '' ) ?>>First Choice</option>
        <option value="second_choice" <?php echo ( !empty( $current_selections ) && in_array( 'second_choice', $current_selections ) ? ' selected="selected"' : '' ) ?>>Second Choice</option>
        <option value="third_choice" <?php echo ( !empty( $current_selections ) && in_array( 'second_choice', $current_selections ) ? ' selected="selected"' : '' ) ?>>Third Choice</option>
</select>
<p class="description">Choose from the options above.</p>
</td>
</tr>
</table>

<?php
}

// Save fields
add_action( 'personal_options_update', 'save_multiple_choices' );
add_action( 'edit_user_profile_update', 'save_multiple_choices' );

function save_multiple_choices( $user_id )    {
    if ( isset( $_POST['multi_dropdown'] ) ) {
        update_user_meta( $user_id, 'multi_dropdown', $_POST['multi_dropdown'] );
    }
}
?>
1
Mike

Code modifié à partir de la réponse ci-dessus afin qu'il affiche correctement les sélections multiples effectuées lors de l'affichage du profil des utilisateurs, ainsi que l'ajout de l'attribut "multiple" à la sélection elle-même.

<?php
// Display Fields 
add_action( 'show_user_profile', 'add_multiple_choice_dropdown ' );
add_action( 'edit_user_profile', 'add_multiple_choice_dropdown ' );

$current_selections = get_user_meta( $user->ID, 'multi_dropdown', true );
?>

<h3>Extra profile information</h3>

<table class="form-table"> 
<tr>
    <th><label for="multi_dropdown">The dropdown with multiple choices</label></th>
    <td>
        <select name="multi_dropdown[]" multiple>
            <option value="first_choice" <?php echo ( !empty( $current_selections ) && in_array( 'first_choice', $current_selections ) ? ' selected="selected"' : '' ) ?>>First Choice</option>
            <option value="second_choice" <?php echo ( !empty( $current_selections ) && in_array( 'second_choice', $current_selections ) ? ' selected="selected"' : '' ) ?>>Second Choice</option>
            <option value="third_choice" <?php echo ( !empty( $current_selections ) && in_array( 'second_choice', $current_selections ) ? ' selected="selected"' : '' ) ?>>Third Choice</option>
        </select>
        <p class="description">Choose from the options above.</p>
    </td>
</tr>
</table>

<?php
}

// Save fields
add_action( 'personal_options_update', 'save_multiple_choices' );
add_action( 'edit_user_profile_update', 'save_multiple_choices' );

function save_multiple_choices( $user_id )    {
    if ( isset( $_POST['multi_dropdown'] ) ) {
        update_user_meta( $user_id, 'multi_dropdown', $_POST['multi_dropdown'] );
    }
}
?>
0
contempoinc