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?

10

Eu 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 na matriz.

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

Spartacus
fonte
O que é $id? E por que está usando print_rem um contexto de atribuição?
TheDeadMedic
$idé o mesmo que "id" => BUDDHA_SHORTNAME . "_meta_email", é definido em outra função. E eu realmente não sei por que fiz print_rlá, não faz muito sentido, não é?
Spartacus
Você fez isso funcionar? Addin []no final do nameatributo me ajudou. Verifique novamente o atributo name. Você verifica no banco de dados do mySQL quais configurações estão armazenadas?
Radek
Não relacionado à sua pergunta: acho que você ficou confuso esc_html()e esc_html__()no código de exibição. O primeiro aceita apenas um argumento; o último aceita um segundo argumento, o domínio do texto.
Pat J

Respostas:

1

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

Como observado pelo @Radek, você pode ter transformado o nome da caixa de seleção em uma matriz usando []- por exemplo name="my_option_name[]"- isso resultará no $_POST['my_option_name']arquivo sendo uma matriz de opções selecionadas que você poderá armazenar.

Um olhar mais atento ao seu código me surpreendeu:

$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ê está sempre salvando apenas um valor $valid_input[$option['id']]- sua switchdeclaração está em um loop? Nesse caso, 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.

phatskat
fonte