¿Cómo puedo guardar una matriz de selección múltiple con la API de configuración para una página de opciones de complementos?

10

Estoy pensando que esto puede ser más un problema con mi PHP en lugar de mi uso de la API de configuración, pero parece que no puedo hacer que Wordpress guarde una matriz de datos para un cuadro de selección múltiple.

El cuadro de selección múltiple corresponde a un metacampo personalizado, y las opciones de selección son los tipos de publicación personalizados que mostrarán ese metacampo.

Aquí está el código de visualización:

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 se define aquí como 'opciones':

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

Y el código de validación:

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; 

Actualmente, si selecciono más de un valor del campo de selección múltiple, WP solo guardará un valor (generalmente el primer valor alfabético). Lo necesito para guardar más de un valor en la matriz.

Pensé que agregar []al final de [$id]podría ayudar, pero no.

Espartaco
fuente
¿Qué es $id? ¿Y por qué se usa print_ren un contexto de asignación?
TheDeadMedic
$ides lo mismo que "id" => BUDDHA_SHORTNAME . "_meta_email"se define en otra función. Y realmente no sé por qué lo hice print_rallí, ¿no tiene mucho sentido?
Spartacus
¿Lo hiciste funcionar? Addin []al final del nameatributo me ayudó. Verifique dos veces el atributo de nombre. ¿Comprueba la base de datos mySQL qué configuraciones están almacenadas?
Radek
Sin relación con su pregunta: creo que ha confundido esc_html()y esc_html__()en su código de visualización. El primero acepta solo un argumento; este último acepta un segundo argumento, el dominio de texto.
Pat J

Respuestas:

1

Entonces, parece que dos cosas están sucediendo aquí:

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

Como señaló @Radek, podría haber convertido el nombre del cuadro de selección en una matriz utilizando [], por ejemplo name="my_option_name[]", esto dará como resultado que el archivo $_POST['my_option_name']sea ​​una matriz de opciones seleccionadas que luego puede almacenar.

Una mirada más cercana a su código me ha dejado perplejo:

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

Solo está guardando un valor $valid_input[$option['id']]: ¿su switchdeclaración está en un bucle? Si es así, intente cambiar la última línea a esta:

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

Tenga en cuenta el []operador antes de la asignación. Cuando guarde $valid_input, debe tratar el valor de $valid_input[$option['id']]como una matriz.

Phatskat
fuente