使用选择选项获取多个选择框选项以保持选定状态

时间:2016-02-18 02:46:19

标签: php jquery wordpress wordpress-plugin html-select

我正在尝试让选定的选项在以下选择框中保持选中状态。 (选择框位于WordPress管理员的菜单页面中)。我已经验证了数据是否已保存到数据库中,但是我很难确定从数据库中获取数据以标记在保存页面后为给定选择框选择的选项。页面上有多个选择框。

enter image description here

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

<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 );
    }
}

以下是我的非工作尝试。如果我理解正确,可以使用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 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>

2 个答案:

答案 0 :(得分:2)

正如你所写的那样

<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()的逻辑

  

备选方案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>
  

备选方案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>
  

备选方案3

按照Alternative 2使用代码并将脚本放在<select>下面 那就是:

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

一件重要的事情

首先尝试打印类似

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

因此,您将确保没有得到空白输出。

  

更新

正如您在更新中所述,无论您选择了多少个国家/地区,它都只保存一个国家/地区。

这可能是因为选择框的名称不是用于保存多个位置值的数组

替换此

<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>';

答案 1 :(得分:1)

假设$locations是所选国家/地区代码的数组,

<option value="DZ"<?php echo (in_array('DZ', $locations)) ? ' selected' : '' ?>>Algeria</option>
每个其他选项

等等。我不太确定WordPress以哪种格式存储你的$locations数组,所以你必须自己解决这个问题。