web-dev-qa-db-ja.com

Register_setting()テーマオプションを使用して複数の選択オプションを処理する方法

軽量のテーマオプションパネルには、Ian Stewartの サンプルテーマオプション を使用しています。

挿入が失敗しました

次のコードを使用して、dbに複数のカテゴリを挿入する必要があります。

<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>

コードの検証部分について

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

Optionsテーブルにデータを挿入していますが、複数ではありません。最後の選択項目のみを挿入しています。 'categorychoice' => string '5' (length=1) - すべての中で唯一の値であり、それが選択された中の最後のcat_idです。

SELECTED = SELECTED FAILED

私はまたそれがdbのデータと一致するとき、選択された値を作ることに失敗しています。私は自分のコードを このWPSEソリューションで試した が失敗した。

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

ここでの問題は、PHPに複数の値の読み取りを許可しないことです。すべての値が同じ名前site_options[categorychoice]を使用するため、それらが互いに上書きされ、最後の値が優先されます。

括弧がもっと必要です。 name要素のselect属性をsite_options[categorychoice][]に設定すると、すべての値がPHPによって読み込まれます。

6
fuxia

OK。これが正しいコードです、私は解決策を得ました:

<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>

まず第一に: 知識を得ること @toschoから、配列値が二次元配列を格納できるように<select name="">を変更しました:

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

それはデータ挿入問題を解決しました。

2番目に: dbに格納したものを取得するためにフロントエンド部分をバックエンドにしました。

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

そして、 in_array() as chrisguitarguyによって提案された で自分の値をチェックして、既に挿入されているものを選択します。

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

そして$selectedの値を<option>sにエコーします。

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

それはすべてを解決しました、そして私はdbに複数のカテゴリー選択を挿入することができ、それらからも差し引くことができます。 :)

@toschoと@chrisguitarguyに感謝します。 :)

4
Mayeenul Islam