2016-02-18 132 views
1

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

enter image description here

商的选择框采用选择的选择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

UPDATE:(值 “AD” 是我的选择之一)

$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" }

无论有多少个选项被选中,它只返回一个国家代码。

UPDATE:

这是最后的工作...

<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

正如你已经写

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

好吧,$ val没有返回所需的输出。在原文中查看我的更新。 – j8d

+1

请检查更新后的答案 –

+0

天才!有效!现在,让选项保持选择... – j8d

1

假设$locations是选择国家代码的数组,

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

等等每隔选项。我不太清楚WordPress的存储格式是什么,所以你必须自己来确定这个数组。

相关问题