如何使用插件选项页面的设置API保存多选数组?


10

我想这可能是我的PHP而不是设置API的问题,但我似乎无法让Wordpress为多选框保存数据数组。

多选框对应于自定义元字段,而选择选项是将显示该元字段的自定义帖子类型。

这是显示代码:

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 在这里定义为“选择”:

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

和验证代码:

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; 

当前,如果我从多选字段中选择了多个值,WP将仅保存一个值(通常是第一个字母值)。我需要它在数组中保存多个值。

我以为增加[]结尾[$id]可能会有所帮助,但没有。


什么$id啊 为什么要print_r在分配上下文中使用?
TheDeadMedic

$id与相同"id" => BUDDHA_SHORTNAME . "_meta_email",它是在另一个函数中定义的。而且我真的不知道为什么要去print_r那儿,这样做不是很有意义吗?
斯巴达克斯(Spartacus)2013年

你成功了吗?属性[]末尾的Addin name帮助了我。仔细检查name属性。您是否检查mySQL数据库存储的设置?
Radek

与您的问题无关:我认为您感到困惑esc_html()esc_html__()在显示代码中。前者只接受一个论点。后者接受第二个参数,即文本域。
Pat J

Answers:


1

因此,似乎发生了两件事:

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

如@Radek所述,您可以使用[]-例如,将选择框的名称设置为数组,例如name="my_option_name[]"-这将导致该$_POST['my_option_name']字段是可以存储的所选选项的数组。

仔细查看您的代码让我感到困惑:

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

您只将一个值保存到$valid_input[$option['id']]- switch语句本身是否在循环中?如果是这样,请尝试将最后一行更改为此:

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

注意[]赋值运算符之前的。保存时$valid_input,应将的值$valid_input[$option['id']]视为数组。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.