プラグインオプションページの設定APIで複数選択配列を保存するにはどうすればよいですか?


10

これは、設定APIの使用ではなく、私のPHPの問題のほうが多いと思いますが、Wordpressで複数選択ボックスのデータの配列を保存することができません。

複数選択ボックスはカスタムメタフィールドに対応し、選択オプションはそのメタフィールドを表示するカスタム投稿タイプです。

表示コードは次のとおりです。

case 'select2':  
        echo "<select id='$id' style='width:15em;height:10em;' class='select$field_class' name='" . $buddha_option_name . "[$id]' multiple>";  
        foreach($choices as $item) {  

            $item = explode("|",$item);  
            $item[0] = esc_html($item[0], 'buddha_textdomain');  

            $selected = ($options[$id]==$item[1]) ? 'selected="selected"' : '';  
            echo "<option value='$item[1]' $selected>$item[0]</option>";  
        } 
        echo "</select>";  
        echo ($desc != '') ? "<br /><span class='description'>$desc</span>" : ""; 
    break;  

$choices ここでは「選択肢」として定義されています。

$options[] = array(  
    "section" => "custom_meta",  
    "id"      => BUDDHA_SHORTNAME . "_meta_email",  
    "title"   => __( 'Email Meta Box', 'buddha_textdomain' ),  
    "desc"    => __( 'Select post types to have custom email meta box.', 'buddha_textdomain' ),  
    "type"    => "select2",  
    "std"    => print_r($buddha_option_name[$id]),  
    "choices" => array( __('Posts','buddha_textdomain') . "|post", __('Pages','buddha_textdomain') . "|page", __('Faculty/Staff','buddha_textdomain') . "|staff", __('FAQ','buddha_textdomain') . "|faq", __('Documents','buddha_textdomain') . "|docs", __('Courses','buddha_textdomain') . "|courses" )  
);

そして検証コード:

case 'select2': 
                // process $select_values 
                    $select_values = array(); 
                    foreach ($option['choices'] as $k => $v) { 
                        // explode the connective 
                        $pieces = explode("|", $v); 

                        $select_values[] = $pieces[1]; 
                    } 
                // check to see if selected value is in our approved array of values! 
                $valid_input[$option['id']] = (in_array( $input[$option['id']], $select_values) ? $input[$option['id']] : '' ); 
            break; 

現在、複数選択フィールドから複数の値を選択すると、WPは1つの値(通常は最初のアルファベット順の値)のみを保存します。配列に複数の値を保存する必要があります。

[]末尾に追加すると[$id]役立つかもしれないと思いましたが、違います。


なに$id?そして、なぜprint_r割り当てコンテキストで使用していますか?
TheDeadMedic 2013年

$idと同じですが、"id" => BUDDHA_SHORTNAME . "_meta_email"別の関数で定義されています。そしてprint_r、なぜ私がそこにいたのか本当にわかりません、あまり意味がありませんか?
Spartacus

機能させましたか?属性[]の最後にあるアドインが役に立ちnameました。名前属性を再確認してください。保存されている設定をmySQL dbで確認しますか?
Radek

あなたの質問とは関係ありません:あなたは混乱esc_html()esc_html__()ていて、表示コードが間違っていると思います。前者は引数を1つだけ受け入れます。後者は2番目の引数、テキストドメインを受け入れます。
Pat J

回答:


1

したがって、ここでは2つのことが起こっているようです。

echo "<select id='$id' style='width:15em;height:10em;' class='select$field_class' name='" . $buddha_option_name . "[$id]' multiple>";  

@Radekで述べたように、あなたは可能性が使用して選択ボックスの名前の配列をした[]など- name="my_option_name[]"-これは提出になります$_POST['my_option_name']あなたが保存できることを選択したオプションの配列であること。

あなたのコードを詳しく見ると、私は困惑しています:

$select_values = array(); 
foreach ($option['choices'] as $k => $v) { 
    // explode the connective 
    $pieces = explode("|", $v); 

    $select_values[] = $pieces[1]; 
} 
// check to see if selected value is in our approved array of values! 
$valid_input[$option['id']] = (in_array( $input[$option['id']], $select_values) ? $input[$option['id']] : '' ); 

保存する値$valid_input[$option['id']]は1つだけです- switchステートメントはループ自体にありますか?もしそうなら、最後の行をこれに変更してみてください:

$valid_input[$option['id']][] = (in_array( $input[$option['id']], $select_values) ? $input[$option['id']] : '' );

[]代入演算子の前に注意してください。を保存$valid_inputすると、の値が$valid_input[$option['id']]配列として扱われます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.