Как сохранить массив множественного выбора с помощью API настроек для страницы параметров плагина?

10

Я думаю, что это может быть больше проблемой с моим PHP, чем с использованием API настроек, но я не могу заставить 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 сохранит только одно значение (обычно первое алфавитное значение). Мне нужно, чтобы сохранить более одного значения в массиве.

Я думал, что добавление []в конец [$id]может помочь, но нет.

Спартак
источник
Что $id? И почему используете print_rв назначенном контексте?
TheDeadMedic
$idтак же, как "id" => BUDDHA_SHORTNAME . "_meta_email"это определено в другой функции. И я действительно не знаю, почему я сделал print_rэто, не имеет особого смысла, не так ли?
Спартак
Ты заставил это работать? Аддин []в конце nameатрибута помог мне. Дважды проверьте имя атрибута. Вы проверяете базу данных MySQL, какие настройки хранятся?
Радек
Не имеет отношения к вашему вопросу: я думаю, что вы запутались esc_html()и esc_html__()в вашем коде дисплея. Первый принимает только один аргумент; последний принимает второй аргумент, текстовый домен.
Пэт Дж

Ответы:

1

Итак, похоже, что здесь происходит две вещи:

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']]- находится ли ваше switchутверждение в самом цикле? Если это так, попробуйте изменить последнюю строку на это:

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

Обратите внимание []на оператор перед присвоением. Когда вы сохраняете $valid_input, он должен рассматривать значение $valid_input[$option['id']]как массив.

phatskat
источник