Wie kann ich mit der Einstellungs-API ein Mehrfachauswahl-Array für eine Plug-In-Optionsseite speichern?

10

Ich denke, dass dies eher ein Problem mit meinem PHP als mit der Verwendung der Einstellungs-API ist, aber ich kann Wordpress anscheinend nicht dazu bringen, ein Array von Daten für eine Mehrfachauswahlbox zu speichern.

Das Mehrfachauswahlfeld entspricht einem benutzerdefinierten Metafeld, und die Auswahloptionen sind die benutzerdefinierten Beitragstypen, die dieses Metafeld anzeigen.

Hier ist der Anzeigecode:

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 wird hier als "Auswahl" definiert:

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

Und der Validierungscode:

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; 

Wenn ich derzeit mehr als einen Wert aus dem Mehrfachauswahlfeld auswähle, speichert WP derzeit nur einen Wert (normalerweise den ersten alphabetischen Wert). Ich brauche es, um mehr als einen Wert im Array zu speichern.

Ich dachte, das Hinzufügen []zum Ende [$id]könnte helfen, aber nein.

Spartacus
quelle
Was ist $id? Und warum print_rin einem Zuweisungskontext verwenden?
TheDeadMedic
$idist das gleiche wie "id" => BUDDHA_SHORTNAME . "_meta_email", es ist in einer anderen Funktion definiert. Und ich weiß nicht wirklich, warum ich print_rdort war, macht nicht viel Sinn, oder?
Spartacus
Hast du es geschafft? Das Addin []am Ende des nameAttributs hat mir geholfen. Überprüfen Sie das Namensattribut. Überprüfen Sie die mySQL-Datenbank, welche Einstellungen gespeichert sind?
Radek
Unabhängig von Ihrer Frage: Ich denke, Sie sind verwirrt esc_html()und esc_html__()in Ihrem Anzeigecode. Ersteres akzeptiert nur ein Argument; Letzterer akzeptiert ein zweites Argument, die Textdomäne.
Pat J

Antworten:

1

Es sieht also so aus, als ob hier zwei Dinge vor sich gehen:

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

Wie durch @Radek erwähnt, Sie könnten haben den Namen der Auswahlbox ein Array unter Verwendung gemacht []- zum Beispiel name="my_option_name[]"- das in den eingereichten führen $_POST['my_option_name']ist eine Reihe von ausgewählten Optionen , die Sie dann speichern können.

Ein genauerer Blick auf Ihren Code hat mich verblüfft:

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

Sie speichern immer nur einen Wert für $valid_input[$option['id']]- befindet sich Ihre switchAnweisung selbst in einer Schleife? Wenn ja, versuchen Sie, die letzte Zeile in folgende zu ändern:

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

Beachten Sie den []vor dem Zuweisungsoperator. Beim Speichern $valid_inputsollte der Wert von $valid_input[$option['id']]als Array behandelt werden.

Phatskat
quelle