Comment puis-je enregistrer un tableau de sélection multiple avec l'API des paramètres pour une page d'options de plug-in?


10

Je pense que cela peut être plus un problème avec mon PHP que mon utilisation de l'API des paramètres, mais je n'arrive pas à obtenir que Wordpress enregistre un tableau de données pour une boîte à sélection multiple.

La zone de sélection multiple correspond à un méta-champ personnalisé et les options de sélection sont les types de publication personnalisés qui afficheront ce méta-champ.

Voici le code d'affichage:

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 est défini ici comme des «choix»:

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

Et le code de validation:

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; 

Actuellement, si je sélectionne plusieurs valeurs dans le champ de sélection multiple, WP n'enregistrera qu'une seule valeur (généralement la première valeur alphabétique). J'en ai besoin pour enregistrer plus d'une valeur dans le tableau.

Je pensais que l'ajout []à la fin [$id]pourrait aider, mais non.


Quoi $id? Et pourquoi utiliser print_rdans un contexte d'attribution?
TheDeadMedic

$idest le même que "id" => BUDDHA_SHORTNAME . "_meta_email", il est défini dans une autre fonction. Et je ne sais pas vraiment pourquoi j'y suis allé print_r, ça n'a pas beaucoup de sens, n'est-ce pas?
Spartacus

L'avez-vous fait fonctionner? Le complément []à la fin de l' nameattribut m'a aidé. Vérifiez à nouveau l'attribut de nom. Vérifiez-vous la base de données mySQL quels paramètres sont stockés?
Radek

Sans rapport avec votre question: je pense que vous avez confondu esc_html()et esc_html__()dans votre code d'affichage. Le premier n'accepte qu'un seul argument; ce dernier accepte un deuxième argument, le domaine du texte.
Pat J

Réponses:


1

Donc, il semble que deux choses se passent ici:

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

Comme indiqué par @Radek, vous auriez pu faire du nom de la boîte de sélection un tableau en utilisant []- par exemple name="my_option_name[]"- cela se traduira par le fichier $_POST['my_option_name']étant un tableau d'options sélectionnées que vous pouvez ensuite stocker.

Un examen plus approfondi de votre code m'a laissé perplexe:

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

Vous n'enregistrez qu'une seule valeur dans $valid_input[$option['id']]- votre switchdéclaration est-elle dans une boucle elle-même? Si oui, essayez de changer la dernière ligne en ceci:

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

Notez l' []opérateur avant l'affectation. Lorsque vous enregistrez $valid_input, il doit traiter la valeur de $valid_input[$option['id']]comme un tableau.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.