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

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

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.