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.
php
plugin-development
settings-api
Spartacus
fonte
fonte
$id
? E por que está usandoprint_r
em um contexto de atribuição?$id
é o mesmo que"id" => BUDDHA_SHORTNAME . "_meta_email"
, é definido em outra função. E eu realmente não sei por que fizprint_r
lá, não faz muito sentido, não é?[]
no final doname
atributo me ajudou. Verifique novamente o atributo name. Você verifica no banco de dados do mySQL quais configurações estão armazenadas?esc_html()
eesc_html__()
no código de exibição. O primeiro aceita apenas um argumento; o último aceita um segundo argumento, o domínio do texto.Respostas:
Então, parece que duas coisas estão acontecendo aqui:
Como observado pelo @Radek, você pode ter transformado o nome da caixa de seleção em uma matriz usando
[]
- por exemploname="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:
Você está sempre salvando apenas um valor
$valid_input[$option['id']]
- suaswitch
declaração está em um loop? Nesse caso, tente alterar a última linha para isso: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.fonte