Como posso salvar uma matriz de seleção múltipla com a API de configurações para uma página de opções de plug-in?

9

Estou pensando que isso pode ser mais um problema com o meu PHP do que com o uso da API de configurações, mas não consigo fazer com que o Wordpress salve uma matriz de dados para uma caixa de seleção múltipla.

A caixa de seleção múltipla corresponde a um meta campo personalizado e as opções de seleção são os tipos de postagem personalizados que exibirão esse meta-campo.

Aqui está o código de exibição:

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 é definido aqui como 'escolhas':

$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" )  
);

E o código de validação:

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; 

Atualmente, se eu selecionar mais de um valor no campo de seleção múltipla, o WP salvará apenas um valor (geralmente o primeiro valor alfabético). Preciso salvar mais de um valor no array.

Pensei que adicionar [] ao final de [$id] poderia ajudar, mas não.

    
por Spartacus 26.06.2013 / 21:15

1 resposta

0

Então, parece que duas coisas estão acontecendo aqui:

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

Conforme observado por @Radek, você poderia ter transformado o nome da caixa de seleção em uma matriz usando [] - por exemplo, name="my_option_name[]" - isso fará com que o arquivo $_POST['my_option_name'] seja uma matriz de opções selecionadas que você pode armazenar.

Um olhar mais atento ao seu código me deixou perplexo:

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

Você só está salvando um valor para $valid_input[$option['id']] - sua instrução switch está em um loop? Em caso afirmativo, tente alterar a última linha para isso:

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

Observe o [] antes do operador de atribuição. Quando você salva $valid_input , ele deve tratar o valor de $valid_input[$option['id']] como uma matriz.

    
por phatskat 06.07.2018 / 16:39