Metabox mit Kontrollkästchen wird nicht aktualisiert

10

Ich versuche, eine meta_box mit einem einzigen Kontrollkästchen zu setzen. Alles funktioniert einwandfrei. Wenn ich sie jedoch deaktiviere und den Beitrag speichere, wird sie erneut als aktiviert markiert. Ich habe einen Blick darauf geworfen, kann aber meinen Fehler nicht finden.

Schauen Sie sich meinen Code an.

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

});

Danke im Voraus

andresmijares
quelle

Antworten:

14

Hier ist der Code, den ich zuvor verwendet habe. Der Hauptunterschied besteht für mich darin, dass Sie prüfen, ob das Meta vorhanden ist, und nicht, welchen Wert es hat, um festzustellen, ob es überprüft werden soll.

// 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
quelle
Verwenden Sie die add_meta_boxesAktion zum Hinzufügen von Metaboxen (speziell dafür), wie im Beispiel auf der add_metaboxCodex-Seite beschrieben. Sie profitieren auch davon, dass der Beitragstyp und das Beitragsobjekt an den Rückruf übergeben werden.
t31os
13

Fügen Sie einfach eine else-Klausel hinzu, um das Post-Meta zu löschen, wenn es nicht aktiviert ist, und Ihr Code funktioniert einwandfrei. Ändern Sie also Folgendes:

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

zu

if ( isset($_POST['front_event']) ) {
    update_post_meta($post->ID, 'front_event', $_POST['front_event']);
}else{
    delete_post_meta($post->ID, 'front_event');
}
Bainternet
quelle
2
Wenn das Kontrollkästchen deaktiviert ist, befindet es sich nicht im Array $ _POST, sondern wird nur gesendet, wenn es aktiviert ist. Daher funktioniert die else-Anweisung.
Tom J Nowell