Myślę, że może to być bardziej problem z moim PHP, niż z użyciem interfejsu API ustawień, ale wydaje mi się, że Wordpress nie zapisuje tablicy danych dla pola wielokrotnego wyboru.
Pole wielokrotnego wyboru odpowiada niestandardowemu polu meta, a opcje wyboru to niestandardowe typy postów, które wyświetlą to pole meta.
Oto kod wyświetlacza:
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
definiuje się tutaj jako „wybory”:
$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" )
);
I kod weryfikacyjny:
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;
Obecnie, jeśli wybiorę więcej niż jedną wartość z pola wielokrotnego wyboru, WP zapisze tylko jedną wartość (zazwyczaj pierwszą wartość alfabetyczną). Potrzebuję go, aby zapisać więcej niż jedną wartość w tablicy.
Myślałem, że dodanie []
końca [$id]
może pomóc, ale nie.
php
plugin-development
settings-api
Spartakus
źródło
źródło
$id
? A dlaczego używaszprint_r
w kontekście przypisania?$id
jest taki sam, jak"id" => BUDDHA_SHORTNAME . "_meta_email"
zdefiniowano w innej funkcji. I tak naprawdę nie wiem, dlaczego to zrobiłemprint_r
, czy to nie ma sensu, prawda?[]
na końcuname
atrybutu pomógł mi. Sprawdź dokładnie atrybut name. Czy sprawdzasz db mySQL, jakie ustawienia są przechowywane?esc_html()
iesc_html__()
w kodzie wyświetlacza. Ten pierwszy przyjmuje tylko jeden argument; ten drugi akceptuje drugi argument, domenę tekstową.Odpowiedzi:
Wygląda na to, że dzieją się tutaj dwie rzeczy:
Jak zauważył @Radek, nazwa pola wyboru mogła zostać zmieniona na tablicę przy użyciu
[]
- np.name="my_option_name[]"
- spowoduje to, że pole$_POST['my_option_name']
będzie tablicą wybranych opcji, które można następnie zapisać.Bliższe spojrzenie na twój kod mnie zaskoczyło:
Zapisujesz tylko jedną wartość
$valid_input[$option['id']]
- czy twojeswitch
zdanie jest w pętli? Jeśli tak, spróbuj zmienić ostatni wiersz na ten:Uwaga
[]
przed operatorem przypisania. Kiedy zapisujesz$valid_input
, powinna traktować wartość$valid_input[$option['id']]
jako tablicę.źródło