Метабокс с чекбоксом не обновляется

15 нояб. 2011 г., 23:15:14
Просмотры: 18.8K
Голосов: 11

Я пытаюсь создать метабокс с одним чекбоксом. Вроде все работает, но если я снимаю галочку и сохраняю запись, она снова становится отмеченной. Я просмотрел код, но не могу найти ошибку.

Вот мой код:

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>Показывать контент? (введите 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']);
    }

});

Проблема в том, что ваш код не обрабатывает случай, когда чекбокс не отмечен. Нужно добавить else условие для удаления метаполя, когда чекбокс не отмечен:

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']);
    } else {
        delete_post_meta($post->ID, 'front_event');
    }
});

Теперь при снятии галочки метаполе будет удаляться, а не сохранять предыдущее значение.

Спасибо заранее.

0
Все ответы на вопрос 2
1
15

Вот код, который я использовал ранее - основное отличие, на мой взгляд, в том, что вы проверяете существование мета-поля, а не его значение для определения отметки.

// Мета-поле типа чекбокс
add_action("admin_init", "checkbox_init");

function checkbox_init(){
  add_meta_box("checkbox", "Чекбокс", "checkbox", "post", "normal", "high");
}

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

  <label>Отметьте для "Да"</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

}

// Сохранение мета-данных
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"]);
}
16 нояб. 2011 г. 00:28:35
Комментарии

Используйте действие add_meta_boxes для добавления метабоксов (оно специально для этого предназначено), как показано в примере на странице кодекса для add_metabox. Это также даст вам преимущество в виде передачи типа записи и объекта записи в callback-функцию.

t31os t31os
16 нояб. 2011 г. 14:37:23
1
15

просто добавьте условие else для удаления метаданных поста, если флажок не отмечен, и ваш код будет работать правильно. Итак, измените:

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

на

if ( isset($_POST['front_event']) ) {
    update_post_meta($post->ID, 'front_event', $_POST['front_event']);
}else{
    delete_post_meta($post->ID, 'front_event');
}
16 нояб. 2011 г. 00:50:16
Комментарии

если флажок не отмечен, он не будет в массиве $_POST, он отправляется только когда отмечен, поэтому else срабатывает.

Tom J Nowell Tom J Nowell
16 нояб. 2011 г. 01:21:23