2011-09-23 13 views
10

Próbuję dodać pole wyboru do mojego niestandardowego pola meta w WordPress i natknąłem się na problem z jego zapisaniem - za każdym razem, gdy zaznaczam pole wyboru i aktualizuję wpis/stronę, to ponownie się odznacza.Jak zapisać pole wyboru meta box w WordPress?

Oto kod używam:

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. 
} 

Stwarza to pole na bocznym pasku ekranu „Edytuj stronę”, tak jak powinien, nie ma problemu. Nie jestem pewien, co powinienem wpisać w wartość pola wyboru, z polami tekstowymi oczywiście zwraca to, co zostało zapisane jako meta informacje ... Próbowałem po prostu używając "sprawdzone", bo to byłby mój pierwszy domysł (potem po prostu sprawdź dla wartości podczas korzystania z tych metadanych), ale nie zapisał również pola wyboru.

Oto funkcja, która zapisuje wszystkie meta dane, które zakładam, że przyczyny tego problemu:

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

To działa doskonale dla pól tekstowych, ale pole wyboru po prostu nie uratuje. Nie jestem pewien, czy funkcja zapisu jest nieprawidłowa, czy też brakuje mi czegoś o wartości pola wyboru.

Każda pomoc doceniona!

Odpowiedz

14

Miałem z tym problemy wcześniej i oto jak to rozwiązałem.

Najpierw, tworząc pole wyboru.

<?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 } ?> 

Dalej, zapisywanie.

<?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; 
} ?> 
Powiązane problemy