web-dev-qa-db-fra.com

Plusieurs options ne restent pas sélectionnées après la sauvegarde

Problèmes:

La sauvegarde fonctionne, mais ne stocke qu'une des options de la base de données après la sauvegarde.

Les options qui ne sont pas sélectionnées après la sauvegarde.

Les champs sélectionnés:

<select id="exclude_page_from_cookies" name="exclude_page_from_cookies[]" multiple="multiple">
        <?php

        $pages = get_pages();
        foreach ( $pages as $page ) {
            $title = get_the_title($page);
            $id    = $page->id;
            ?>

            <option id="<?php echo $id; ?>" value="<?php echo $title ?>" <?php selected( $title ); ?> >
                <?php echo $title;?>
            </option>
        <?php
        }
        ?>
    </select>

La fonction de sauvegarde:

if ( isset( $_POST['exclude_page_from_cookies'] ) ) {
    foreach( $_POST['exclude_page_from_cookies'] as $exclude_page ) {
         echo $exclude_page;
         update_option( 'exclude_page_from_cookies', $exclude_page ) ;
    }
}

Je comprends que j’ai déjà posté ceci dans un échange de pile régulier, mais comme c’est un WP _ je pensais le déplacer ici :)

1
Dsmart

Tout d’abord, vous devez enregistrer la valeur sous forme de tableau car vous souhaitez que plusieurs éléments soient sélectionnés. La fonction update_option sérérisera un tableau pour vous, vous n'aurez donc qu'à lui donner un tableau d'éléments. Dans votre code, vous enregistrez tous les éléments, car vous utilisez la même clé exclude_page_from_cookies et non un tableau. Vous devez également marquer l’élément sélectionné comme étant sélectionné pour pouvoir enregistrer davantage d’éléments. La fonction selected a besoin de selected et current pour correspondre et faire écho à la balise sélectionnée. Vous enregistrez la valeur en tant que titre, mais je vous recommande de l'enregistrer en tant qu'ID de la page, car si vous avez l'ID, vous pouvez facilement obtenir le titre à l'aide de la fonction get_the_title(). J'ai donc mis à jour votre fonction de sauvegarde pour accepter les tableaux:

$exclude_pages = $_POST['exclude_page_from_cookies'];

if( isset( $exclude_pages ) ) 
{
   update_option( 'exclude_page_from_cookies', $exclude_pages );
}
else
{
   delete_option( 'exclude_page_from_cookies' );
}

Et votre balise de boîte sélectionnée:

<select id="exclude_page_from_cookies" name="exclude_page_from_cookies[]" multiple="multiple">
       <?php
          $pages = get_pages();
          $exclude = get_option('exclude_page_from_cookies');

          foreach ( $pages as $page ) 
          {
          ?>
             <option value="<?php echo $page->ID; ?>" <?php echo ( in_array( $page->ID, $exclude ) ? 'selected' : '' ); ?> >
                <?php echo $page->post_title; ?>
             </option>
          <?php
          }
       ?>
    </select>
1