Jak zapisać tablicę wielokrotnego wyboru z interfejsem API ustawień dla strony opcji wtyczki?

10

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.

Spartakus
źródło
Co jest $id? A dlaczego używasz print_rw kontekście przypisania?
TheDeadMedic
$idjest taki sam, jak "id" => BUDDHA_SHORTNAME . "_meta_email"zdefiniowano w innej funkcji. I tak naprawdę nie wiem, dlaczego to zrobiłem print_r, czy to nie ma sensu, prawda?
Spartacus
Sprawiłeś, że to działało? Dodatek []na końcu nameatrybutu pomógł mi. Sprawdź dokładnie atrybut name. Czy sprawdzasz db mySQL, jakie ustawienia są przechowywane?
Radek,
Niezwiązane z pytaniem: Myślę, że mylić esc_html()i esc_html__()w kodzie wyświetlacza. Ten pierwszy przyjmuje tylko jeden argument; ten drugi akceptuje drugi argument, domenę tekstową.
Pat J

Odpowiedzi:

1

Wygląda na to, że dzieją się tutaj dwie rzeczy:

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

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:

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

Zapisujesz tylko jedną wartość $valid_input[$option['id']]- czy twoje switchzdanie jest w pętli? Jeśli tak, spróbuj zmienić ostatni wiersz na ten:

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

Uwaga []przed operatorem przypisania. Kiedy zapisujesz $valid_input, powinna traktować wartość $valid_input[$option['id']]jako tablicę.

phatskat
źródło