La metabox avec case à cocher ne se met pas à jour

10

J'essaie de définir une meta_box avec une seule case à cocher, tout va bien, mais si je la décoche et enregistre le message, il marque à nouveau comme vérifié, j'ai jeté 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

andresmijares
la source

Réponses:

14

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"]);
}
5t3ph
la source
Utilisez l' add_meta_boxesaction pour ajouter des métaboxes (c'est là spécifiquement pour cela), comme dans l'exemple de la add_metaboxpage codex. Vous bénéficierez également de la transmission du type et de l'objet de publication au rappel.
t31os
13

ajoutez simplement une clause else pour supprimer la méta post si elle n'est pas cochée et votre code fera très bien l'affaire, alors changez:

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');
}
Bainternet
la source
2
si la case n'est pas cochée, elle ne sera pas dans le tableau $ _POST, elle n'est envoyée que lorsqu'elle est cochée, d'où la raison pour laquelle l'instruction else fonctionne.
Tom J Nowell