Come posso salvare un array a selezione multipla con l'API delle impostazioni per una pagina delle opzioni del plug-in?


10

Sto pensando che questo potrebbe essere più un problema con il mio PHP piuttosto che il mio uso dell'API delle impostazioni, ma non riesco a convincere Wordpress a salvare un array di dati per una casella a selezione multipla.

La casella di selezione multipla corrisponde a un meta campo personalizzato e le opzioni di selezione sono i tipi di post personalizzati che visualizzeranno quel campo meta.

Ecco il codice visualizzato:

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 è definito qui come "scelte":

$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 il codice di convalida:

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; 

Attualmente, se seleziono più di un valore dal campo di selezione multipla, WP salverà solo un valore (di solito il primo valore alfabetico). Ne ho bisogno per salvare più di un valore nell'array.

Ho pensato che aggiungere []alla fine di [$id]potesse essere d'aiuto, ma no.


Cosa $id? E perché lo stai usando print_rin un contesto assegnato?
TheDeadMedic il

$idè uguale a "id" => BUDDHA_SHORTNAME . "_meta_email", è definito in un'altra funzione. E non so davvero perché l'ho fatto print_rlì, non ha molto senso vero?
Spartacus,

L'hai fatto funzionare? L'aggiunta []alla fine namedell'attributo mi ha aiutato. Controlla nuovamente l'attributo name. Controlli il db mySQL quali impostazioni sono memorizzate?
Radek,

Non correlato alla tua domanda: penso che tu sia confuso esc_html()e esc_html__()nel tuo codice di visualizzazione. Il primo accetta solo un argomento; quest'ultimo accetta un secondo argomento, il dominio di testo.
Pat J

Risposte:


1

Quindi, sembra che qui stiano succedendo due cose:

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

Come notato da @Radek, avresti potuto rendere il nome della casella di selezione un array usando []- ad esempio name="my_option_name[]"- questo comporterà che il file archiviato $_POST['my_option_name']è un array di opzioni selezionate che puoi quindi memorizzare.

Uno sguardo più attento al tuo codice mi ha lasciato perplesso:

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

Stai solo salvando un solo valore in $valid_input[$option['id']]- la tua switchaffermazione è in un ciclo stesso? In tal caso, prova a modificare l'ultima riga in questo:

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

Nota []prima dell'operatore di assegnazione. Quando si salva $valid_input, dovrebbe trattare il valore di $valid_input[$option['id']]come un array.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.