web-dev-qa-db-fra.com

Comment gérer plusieurs options de sélection à l'aide des options de thème register_setting ()

J'utilise Exemples d'options de thème de Ian Stewart pour un panneau d'options de thème léger.

ÉCHEC DE L'INSERTION

J'ai besoin d'insérer plusieurs catégories dans la base de données, où j'ai utilisé le code suivant:

<select multiple="multiple" name="site_options[categorychoice]">
   <?php
   $args = array(
        'orderby' => 'name',
        'parent' => 0,
        'exclude' => 1
     );
   $categories = get_categories( $args );
   foreach ($categories as $category) { ?>
        <option value="<?php echo $category->term_id; ?>" style="padding-right: 10px;" <?php selected( $site_options['categorychoice'], $category->term_id ); ?> ><?php echo $category->cat_name . ' (' . $category->category_count .')'; ?></option>
   <?php }  ?>
</select>

Sur la partie validation du code:

function theme_options_validate( $input ) {
   $got_categories = array( $input['categorychoice'] );
}

Il insère des données dans la table Options, mais pas plusieurs, il n’insère que la dernière sélection. Donc, ce que j'ai obtenu est: 'categorychoice' => string '5' (length=1) - une seule valeur parmi tous, et c'est le dernier cat_id parmi les sélectionnés.

SELECTED = ÉCHEC SÉLECTIONNÉ

Je ne parviens pas non plus à définir la valeur sélectionnée lorsque cela correspond aux données de la base de données. J'ai essayé mon code avec Cette solution WPSE , mais a échoué:

foreach ($categories as $category) { ?>
     <?php $selected = in_array( $category->cat_ID, $selected ) ? ' selected="selected" ' : '' ?>
     <option value="<?php echo $category->term_id; ?>" style="padding-right: 10px;" <?php echo $selected; ?> ><?php echo $category->cat_name . ' (' . $category->category_count .')'; ?></option>
<?php } ?>
3
Mayeenul Islam

Le problème ici est que vous ne permettez pas à PHP de lire plus d’une valeur, car toutes les valeurs utilisent le même nom site_options[categorychoice], elles se écrasent donc et la dernière gagne.

Vous avez besoin de plus de supports. Définissez l'attribut name de votre élément select sur site_options[categorychoice][] et toutes les valeurs seront lues par PHP.

6
fuxia

D'accord. Voici le bon morceau de code, j'ai eu la solution avec:

<select multiple="multiple" name="site_options[categorychoice][]">
   <?php $option = get_option('site_options'); ?>
   <?php
   $args = array(
     'orderby' => 'name',
     'parent' => 0,
     'exclude' => 1
   );
   $categories = get_categories( $args );
   foreach ($categories as $category) { ?>
   <?php $selected = in_array( $category->cat_ID, $option['categorychoice'] ) ? ' selected="selected" ' : ''; ?>
       <option value="<?php echo $category->term_id; ?>" <?php echo $selected; ?> >
          <?php echo $category->cat_name . ' (' . $category->category_count .')'; ?>
       </option>
   <?php } //endforeach ?>
</select>

Tout d’abord: Obtenir des connaissances de @toscho, j’ai modifié le <select name=""> pour permettre à une valeur de tableau de stocker un tableau à deux dimensions:

<select multiple="multiple" name="site_options[categorychoice][]">

cela a résolu le problème d'insertion de données.

Deuxièmement: J'ai utilisé la partie frontale pour récupérer ce que je stockais dans la base de données avec:

<?php $option = get_option('site_options'); ?>

Et ensuite vérifié mes valeurs avec in_array() as suggéré par chrisguitarguy pour sélectionner les valeurs déjà insérées:

<?php $selected = in_array( $category->cat_ID, $option['categorychoice'] ) ? ' selected="selected" ' : ''; ?>

et fait écho à la valeur de $selected dans <option>s:

<option <?php echo $selected; ?> >

Il a tout résolu, et je peux insérer plusieurs choix de catégories dans la base de données et en déduire aussi. :)

Merci à @toscho et à @chrisguitarguy. :)

4
Mayeenul Islam