Я думаю, что это может быть больше проблемой с моим 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]
может помочь, но нет.
php
plugin-development
settings-api
Спартак
источник
источник
$id
? И почему используетеprint_r
в назначенном контексте?$id
так же, как"id" => BUDDHA_SHORTNAME . "_meta_email"
это определено в другой функции. И я действительно не знаю, почему я сделалprint_r
это, не имеет особого смысла, не так ли?[]
в концеname
атрибута помог мне. Дважды проверьте имя атрибута. Вы проверяете базу данных MySQL, какие настройки хранятся?esc_html()
иesc_html__()
в вашем коде дисплея. Первый принимает только один аргумент; последний принимает второй аргумент, текстовый домен.Ответы:
Итак, похоже, что здесь происходит две вещи:
Как отметил @Radek, вы могли бы сделать имя поля выбора массивом, используя
[]
- например,name="my_option_name[]"
- это приведет к тому,$_POST['my_option_name']
что поле будет массивом выбранных опций, которые вы затем сможете сохранить.Более пристальный взгляд на ваш код меня озадачил:
Вы когда-либо сохраняете только одно значение
$valid_input[$option['id']]
- находится ли вашеswitch
утверждение в самом цикле? Если это так, попробуйте изменить последнюю строку на это:Обратите внимание
[]
на оператор перед присвоением. Когда вы сохраняете$valid_input
, он должен рассматривать значение$valid_input[$option['id']]
как массив.источник