Metabox dont la case à cocher n'est pas mise à jour

10

J'essaie de définir une meta_box avec une seule case à cocher, tout se passe bien, mais si je décocherais cette option et que je sauvegarderais le message, il sera de nouveau coché, je jette un coup d'œil mais je ne trouve pas mon erreur.

Jetez un oeil à mon code.

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

});

Merci d'avance

    
posée andresmijares25 15.11.2011 - 22:15

2 réponses

12

Voici le code que j'ai utilisé auparavant - la principale différence me semble que vous vérifiez si la méta existe plutôt que sa valeur pour déterminer si elle doit être vérifiée.

// 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"]);
}
    
réponse donnée 5t3ph 15.11.2011 - 23:28
12

Ajoutez simplement une clause else pour supprimer la méta de publication si elle n'est pas cochée et que votre code fonctionnera correctement

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');
}
    
réponse donnée Bainternet 15.11.2011 - 23:50

Lire d'autres questions sur les étiquettes