Метабокс с чекбоксом не обновляется
Я пытаюсь создать метабокс с одним чекбоксом. Вроде все работает, но если я снимаю галочку и сохраняю запись, она снова становится отмеченной. Я просмотрел код, но не могу найти ошибку.
Вот мой код:
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');
}
});
Теперь при снятии галочки метаполе будет удаляться, а не сохранять предыдущее значение.
Спасибо заранее.

Вот код, который я использовал ранее - основное отличие, на мой взгляд, в том, что вы проверяете существование мета-поля, а не его значение для определения отметки.
// Мета-поле типа чекбокс
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"]);
}

просто добавьте условие 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');
}
