2016-02-18 329 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的存儲格式是什麼,所以你必須自己來確定這個數組。

相關問題