Metabox với hộp kiểm không cập nhật


10

Tôi đang cố gắng đặt meta_box với một hộp kiểm duy nhất, mọi thứ đều ổn, tuy nhiên nếu tôi bỏ chọn nó và lưu bài đăng, nó sẽ đánh dấu lại là đã chọn, tôi đã xem nhưng tôi không thể tìm thấy lỗi của mình.

Hãy xem một mã của tôi.

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

});

Cảm ơn trước

Câu trả lời:


14

Đây là mã tôi đã sử dụng trước đây - sự khác biệt chính đối với tôi là bạn đang kiểm tra xem meta có tồn tại chứ không phải giá trị của nó là để xác định xem có nên kiểm tra xem nó không.

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

Sử dụng add_meta_boxeshành động để thêm metaboxes (cụ thể là có), theo ví dụ trên add_metaboxtrang codex. Bạn cũng sẽ có lợi trong việc đưa loại bài đăng và đối tượng bài đăng được chuyển đến cuộc gọi lại.
t31os

13

đơn giản thêm một mệnh đề khác để xóa meta bài đăng nếu không được kiểm tra và mã của bạn sẽ hoạt động tốt, vì vậy hãy thay đổi:

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

đến

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

2
nếu hộp kiểm được bỏ chọn, nó sẽ không nằm trong mảng $ _POST, nó chỉ được gửi khi được chọn, do đó tại sao câu lệnh khác hoạt động.
Tom J Nowell
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.