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

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"]);
}

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.