2011-09-23 67 views
10

我試圖在WordPress的自定義元框中添加一個複選框,並且遇到了保存問題 - 每當我選中複選框並更新帖子/頁面時,它都會再次取消選中。如何在WordPress中保存複選框元框?

下面是我使用的代碼:

add_meta_box(
    'sl-meta-box-sidebar',  // id 
    'Sidebar On/Off',   // title 
    'sl_meta_box_sidebar',  // callback function 
    'page',      // type of write screen 
    'side',      // context 
    'low'      // priority 
); 

function sl_meta_box_sidebar() { 
    global $meta; sl_post_meta($post->ID); ?> 
    <input type="checkbox" name="sl_meta[sidebar]" value="<?php echo htmlspecialchars ($meta['sidebar']); ?>" />Check to turn the sidebar <strong>off</strong> on this page. 
} 

這會在「編輯頁面」屏幕的側邊欄的複選框,因爲它應該,也沒有問題。我不確定我應該在複選框的值中輸入什麼內容,顯示的文本字段顯然會返回保存爲元信息的內容......我嘗試使用「checked」代替,因爲這將是我的第一個猜測(然後簡單地檢查爲使用此元數據時的值),但它也沒有保存複選框。

這裏有保存所有的元數據,其功能我認爲導致此問題:

function sl_save_meta_box($post_id, $post) { 
    global $post, $type; 

    $post = get_post($post_id); 

    if(!isset($_POST[ "sl_meta" ])) 
     return; 

    if($post->post_type == 'revision') 
     return; 

    if(!current_user_can('edit_post', $post_id)) 
     return; 

    $meta = apply_filters('sl_post_meta', $_POST[ "sl_meta" ]); 

    foreach($meta as $key => $meta_box) { 
     $key = 'meta_' . $key; 
     $curdata = $meta_box; 
     $olddata = get_post_meta($post_id, $key, true); 

     if($olddata == "" && $curdata != "") 
      add_post_meta($post_id, $key, $curdata); 
     elseif($curdata != $olddata) 
      update_post_meta($post_id, $key, $curdata, $olddata); 
     elseif($curdata == "") 
      delete_post_meta($post_id, $key); 
    } 

    do_action('sl_saved_meta', $post); 
} 

add_action('save_post', 'sl_save_meta_box', 1, 2); 

它完全適用於文本字段,但是複選框是不會保存。我不確定保存功能是否錯誤,或者我是否錯過了複選框的值。

任何幫助表示讚賞!

回答

14

我以前遇到過這個問題,這裏是我解決它的方法。

首先,創建複選框。

<?php 
function sl_meta_box_sidebar(){ 
    global $post; 
    $custom = get_post_custom($post->ID); 
    $sl_meta_box_sidebar = $custom["sl-meta-box-sidebar"][0]; 
?> 

<input type="checkbox" name="sl-meta-box-sidebar" <?php if($sl_meta_box_sidebar == true) { ?>checked="checked"<?php } ?> /> Check the Box. 
<?php } ?> 

接下來,保存。

<?php 
add_action('save_post', 'save_details'); 

function save_details($post_ID = 0) { 
    $post_ID = (int) $post_ID; 
    $post_type = get_post_type($post_ID); 
    $post_status = get_post_status($post_ID); 

    if ($post_type) { 
    update_post_meta($post_ID, "sl-meta-box-sidebar", $_POST["sl-meta-box-sidebar"]); 
    } 
    return $post_ID; 
} ?>