Metabox dengan kotak centang tidak diperbarui

10

Saya mencoba untuk mengatur meta_box dengan satu kotak centang, semuanya berjalan dengan baik, namun jika saya hapus centang dan menyimpan posting, itu menandai lagi sebagai dicentang, saya telah melihat tetapi saya tidak dapat menemukan kesalahan saya.

Lihatlah kode saya.

function am_checkbox_option() {
    global $post;
    $custom = get_post_custom($post->ID);
    $front_event = $custom["front_event"][0];
    wp_nonce_field(__FILE__, 'am_front_event');
    if ( $front_event ) {
        $checked = "checked=\"checked\"";
    } else {
        $checked = "";
    }
?>
    <label>Display Content? (type yes):</label>
    <input type="checkbox" name="front_event" value="true" <?php echo $checked; ?> />
<?php
        }
}

add_action('save_post', function() {
    if ( defined( 'DOING_AUTOSAVE') && DOING_AUTOSAVE ) return;

    global $post;

    if ( $_POST && !wp_verify_nonce($_POST['am_front_event'], __FILE__) ) {
        return;
    }

    if ( isset($_POST['front_event']) ) {
        update_post_meta($post->ID, 'front_event', $_POST['front_event']);
    }

});

Terima kasih sebelumnya

andresmijares
sumber

Jawaban:

14

Berikut ini adalah kode yang telah saya gunakan sebelumnya - perbedaan utama terlihat pada saya bahwa Anda memeriksa apakah ada meta daripada nilainya untuk menentukan apakah harus diperiksa.

// Checkbox Meta
add_action("admin_init", "checkbox_init");

function checkbox_init(){
  add_meta_box("checkbox", "Checkbox", "checkbox", "post", "normal", "high");
}

function checkbox(){
  global $post;
  $custom = get_post_custom($post->ID);
  $field_id = $custom["field_id"][0];
 ?>

  <label>Check for yes</label>
  <?php $field_id_value = get_post_meta($post->ID, 'field_id', true);
  if($field_id_value == "yes") $field_id_checked = 'checked="checked"'; ?>
    <input type="checkbox" name="field_id" value="yes" <?php echo $field_id_checked; ?> />
  <?php

}

// Save Meta Details
add_action('save_post', 'save_details');

function save_details(){
  global $post;

if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
    return $post->ID;
}

  update_post_meta($post->ID, "field_id", $_POST["field_id"]);
}
5t3ph
sumber
Gunakan add_meta_boxestindakan untuk menambahkan metabox (ada khusus untuk itu), seperti contoh di add_metaboxhalaman codex. Anda juga akan mendapat manfaat untuk mendapatkan jenis posting dan objek posting diteruskan ke panggilan balik.
t31os
13

sederhana tambahkan klausa lain untuk menghapus meta posting jika tidak dicentang dan kode Anda akan baik-baik saja, jadi ubah:

if ( isset($_POST['front_event']) ) {
    update_post_meta($post->ID, 'front_event', $_POST['front_event']);
}

untuk

if ( isset($_POST['front_event']) ) {
    update_post_meta($post->ID, 'front_event', $_POST['front_event']);
}else{
    delete_post_meta($post->ID, 'front_event');
}
Bainternet
sumber
2
jika kotak centang tidak dicentang, itu tidak akan berada dalam array $ _POST, itu hanya dikirim ketika dicentang, maka mengapa pernyataan lain bekerja.
Tom J Nowell