使用 Chosen Select 保留多个 Select 框选项 Selected

Getting Multiple Select Box Options to Stay Selected Using Chosen Select

我正在尝试让 selected 选项在下面的 select 框中保留 selected。 (select 框位于 WordPress 管理员的菜单页面中)。我已经验证了数据正在保存到数据库中,但是我很难弄清楚从数据库中取回数据以标记选项 selected for a given select box after页面已保存。页面上有多个 select 框。

select 框使用了 Chosen Select jQuery 插件。这是一个问答,提供了一些关于用 JS 标记选项 selected 的指导:Chosen select an option by default with jQuery。我无法让它在页面上有多个 select 框。

<script type="text/javascript">
    jQuery(document).ready(function($){ 
        $(".chzn-select").chosen();
    });
</script>

<select name="locations[<?php echo $item_id; ?>]" id="edit-menu-item-visibility-<?php echo $item_id; ?>" class="chzn-select" multiple="true">
    <option value="DZ">Algeria</option>
    <option value="AS">American Samoa</option>
    <option value="AD">Andorra</option>
    ...

这是数据进入数据库的方式:

function update_option_text( $menu_id, $menu_item_db_id, $args ) {
    $meta_value = get_post_meta( $menu_item_db_id, 'locations', true );
    $new_meta_value = stripcslashes( $_POST['locations'][$menu_item_db_id] );
    if( '' == $new_meta_value ) {
        delete_post_meta( $menu_item_db_id, 'locations', $meta_value );
    }
    elseif( $meta_value !== $new_meta_value ) {
        update_post_meta( $menu_item_db_id, 'locations', $new_meta_value );
    }
}

以下是我的无效尝试。如果我理解正确的话,这些值可以设置为 selected with JS。但我也无法让它发挥作用。非常感谢任何帮助。

<option value="AF" <?php $val = implode(",",get_post_meta( $menu_item_db_id, 'locations', true )); if(in_array("AF", $val)){echo "selected='selected'";}else{echo "";} ?> >Afghanistan</option>

原文输入是这样的:

<input
    type="text" 
    class="widefat code" 
    id="edit-menu-item-visibility-<?php echo $item_id; ?>" 
    name="locations[<?php echo $item_id; ?>]" 
    value="<?php echo esc_html( get_post_meta( $item_id, 'locations', true ) ); ?>" />
    <?php echo 'Enter 2-digit country codes separated by commas, e.g. US,CA,SG' ?></br>

可以找到整个文件here

更新:

$val = get_post_meta( $item_id, 'locations', true );
$val2 = array_filter(array_map('trim', explode(',', strtoupper(get_post_meta( $item_id, 'locations', true )))));
var_dump($val);
echo "</br>";   
var_dump($val2);

给出 string(2) "AD"array(1) { [0]=> string(2) "AD" }(值 "AD" 是我的 select 离子之一。)

无论select有多少选项,都只有returns一个国家代码。

更新:

这就是最终起作用的...

<select name="menu-item-visibility[<?php echo $item_id; ?>][]" id="edit-menu-item-visibility-<?php echo $item_id; ?>" class="chzn-select" multiple="true">
    <option value="TH" <?php 
                        $val = get_post_meta( $item_id, 'locations', true );
                        if(is_array($val)) {
                            if(in_array("TH", $val)) {
                                echo "selected='selected'";
                            } else {
                                echo "";
                            }
                        } 
                        ?> >Thailand</option>

假设$locations是一组选定的国家代码,

<option value="DZ"<?php echo (in_array('DZ', $locations)) ? ' selected' : '' ?>>Algeria</option>

其他选项依此类推。不过,我不太确定 WordPress 以哪种格式存储您的 $locations 数组,因此您必须自己弄清楚。

如你所写

<option value="AF" <?php $val = implode(",",get_post_meta( $menu_item_db_id, 'locations', true )); if(in_array("AF", $val)){echo "selected='selected'";}else{echo "";} ?> >Afghanistan</option>

implode() 函数会将数组转换为字符串,因此没有使用 in_array()

的逻辑

Alternative 1

如果 get_post_meta( $menu_item_db_id, 'locations', true ) 提供数组,则使用以下代码:

<option value="AF" <?php $val = get_post_meta( $menu_item_db_id, 'locations', true ); if(in_array("AF", $val)){echo "selected='selected'";}else{echo "";} ?> >Afghanistan</option>

Alternative 2

如果该值保存为 serialized 字符串,则需要先 unserialize 输出然后通过 in_array()

检查它

所以使用 maybe_unserialize() :只有序列化后才反序列化值。

所以代码变成:

<option value="AF" <?php $val = maybe_unserialize(get_post_meta( $menu_item_db_id, 'locations', true )); if(in_array("AF", $val)){echo "selected='selected'";}else{echo "";} ?> >Afghanistan</option>

Alternative 3

按照 Alternative 2 使用代码并将脚本放在 <select> 下方 即:

<select></select>
<script type="text/javascript">
    jQuery(document).ready(function($){ 
        $(".chzn-select").chosen();
    });
</script>

One important thing

首先尝试打印 like

的输出
$val = get_post_meta( $menu_item_db_id, 'locations', true );
echo '<pre>';
print_r($val);
echo '</pre>';

因此您可以确定不会得到空白输出。

Update

正如你在更新中所说,无论你select多少个国家,它只能拯救一个国家。

这可能是因为 select box 的名称不是保存多个位置值的数组

替换此

<select name="locations[<?php echo $item_id; ?>]" id="edit-menu-item-visibility-<?php echo $item_id; ?>" class="chzn-select" multiple="true">
    <option value="DZ">Algeria</option>
    <option value="AS">American Samoa</option>
    <option value="AD">Andorra</option>
    ...

<select name="locations[<?php echo $item_id; ?>][]" id="edit-menu-item-visibility-<?php echo $item_id; ?>" class="chzn-select" multiple="true">
        <option value="DZ">Algeria</option>
        <option value="AS">American Samoa</option>
        <option value="AD">Andorra</option>
        ...

然后你的代码 $meta_value = get_post_meta( $menu_item_db_id, 'locations', true ); 应该得到一组国家值

其余所有上面的代码可能会工作..在更新中更改代码后尝试再次打印 $val 输出..下面的代码现在可能会在数组中获得多个值

$val = get_post_meta( $menu_item_db_id, 'locations', true );
    echo '<pre>';
    print_r($val);
    echo '</pre>';