web-dev-qa-db-ja.com

保存後に複数のオプションが選択されたまでにならない

問題点:

保存は機能しますが、保存後にデータベースに保存されるオプションは1つだけです。

保存後にオプションが選択どおりに表示されない。

選択フィールド:

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

保存機能:

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 ) ;
    }
}

私はすでにこれを通常のスタック交換で投稿していることを理解していますが、これはWPなので、ここに移動します:)

1
Dsmart

複数のアイテムを選択したいので、まず最初に値を配列として保存する必要があります。 update_option関数はあなたに代わって配列を使用禁止にするので、あなたはそれにアイテムの配列を与えるだけでよいです。あなたのコードでは、配列としてではなく同じキーexclude_page_from_cookiesを使用しているので、あなたはすべての項目を保存します。さらにアイテムを保存できるようにするには、選択したアイテムを選択済みとしてマークする必要があります。関数selectedは、選択されたタグに一致してエコーするためにselectedcurrentが必要です。値をタイトルとして保存しますが、ページのIDとして保存することをお勧めします。IDがある場合は、関数get_the_title()を使用して簡単にタイトルを取得できるためです。だから私は配列を受け入れるようにあなたの保存機能を更新しました:

$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' );
}

そして選択したボックスのマークアップ:

<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