2017-12-28 14 views
0

Ich habe eine benutzerdefinierte Metabox, die ich erstellt und auf meiner Website für eine Weile verwendet habe, aber es gibt ein bisschen ein Problem mit, wie es speichert. Es neigt dazu, ziemlich volatil zu sein, was bedeutet, dass beim Backup mit XML oder Bulk-Editing immer die Daten verloren gehen. Wordpress Custom Metabox Checkbox Speichern Problem

Im Folgenden ist der Code, den ich für das Kontrollkästchen verwenden und sie speichern

function member_page_featured_meta() { 
     add_meta_box('member_page_meta', __('Page Template (if default, select none)', 'member_page_textdomain'), 'member_page_meta_callback', 'page', 'side', 'low'); 
    } 
add_action('add_meta_boxes', 'member_page_featured_meta'); 

/** 
* Outputs the content of the meta box 
*/ 

function member_page_meta_callback($post) { 
    $values = get_post_meta($post->ID); 
    $check = isset($values['member_box_check']) ? esc_attr($values['member_box_check'][0]) : ''; 
    wp_nonce_field(basename(__FILE__), 'member_page_nonce'); 
    $member_page_stored_meta = get_post_meta($post->ID); 
    ?> 

<p> 
    <div class="member_page-row-content"> 
     <label for="featured-checkbox"> 
      <input type="checkbox" name="featured-checkbox" id="featured-checkbox" value="yes" <?php if (isset ($member_page_stored_meta['featured-checkbox'])) checked($member_page_stored_meta['featured-checkbox'][0], 'yes'); ?> /> 
      <?php _e('Member Page', 'member_page_textdomain')?> 
     </label><br /> 
     <label for="list-checkbox"> 
      <input type="checkbox" name="list-checkbox" id="list-checkbox" value="yes" <?php if (isset ($member_page_stored_meta['list-checkbox'])) checked($member_page_stored_meta['list-checkbox'][0], 'yes'); ?> /> 
      <?php _e('Home List', 'member_page_textdomain')?> 
     </label><br /> 

    </div> 
</p> 

    <?php 
} 

/** 
* Saves the custom meta input 
*/ 
function member_page_meta_save($post_id) { 

    // Checks save status - overcome autosave, etc. 
    $is_autosave = wp_is_post_autosave($post_id); 
    $is_revision = wp_is_post_revision($post_id); 
    $is_valid_nonce = (isset($_POST[ 'member_page_nonce' ]) && wp_verify_nonce($_POST[ 'member_page_nonce' ], basename(__FILE__))) ? 'true' : 'false'; 

    // Exits script depending on save status 
    if ($is_autosave || $is_revision || !$is_valid_nonce) { 
     return; 
    } 

    // Checks for input and saves - save checked as yes and unchecked at no 
    //This line of code is my hack (just keeps the boxes from saving pretty much) 
    //if (!empty($_POST['featured-checkbox']) && !empty($_POST['list-checkbox'])) { 
      if(isset($_POST[ 'featured-checkbox' ])) { 
       update_post_meta($post_id, 'featured-checkbox', 'yes'); 
      } else { 
       update_post_meta($post_id, 'featured-checkbox', 'no'); 
      }; 
      if(isset($_POST[ 'list-checkbox' ])) { 
       update_post_meta($post_id, 'list-checkbox', 'yes'); 
      } else { 
       update_post_meta($post_id, 'list-checkbox', 'no'); 
      }; 
     // (bracket ending the first if statement) } 
    } 
    add_action('save_post', 'member_page_meta_save'); 

Gibt es eine Möglichkeit, dieses Problem zu verhindern, oder ist es nur etwas, das mit werden muss behandelt, wenn Check Speichern -Boxen?

Ich habe ein bisschen von einem Hack aussortiert, der für jetzt funktioniert, aber wann immer ich Änderungen an den Check-Boxen vornehmen muss (was ziemlich oft von der Art ist, wie sie benutzt werden), habe ich ein paar Codezeilen auskommentieren, die Änderung vornehmen und dann die Zeilen des Codes unkommentieren, und es ist ein bisschen unkonventionell.

Meistens muss ich es beim Backup und Wiederherstellen (auf meiner Backup/Produktions-Website) arbeiten lassen.

Antwort

0

Die Aktion save_post wird ausgelöst, wenn ein Post erstellt oder aktualisiert wird, also schnelle Änderungen und regelmäßige Bearbeitungen und der Import von Posts wird ebenfalls ausgelöst.

Es ist tatsächlich Ihr Skript, das das Post-Meta löscht, wenn Sie eine schnelle Bearbeitung oder einen Import durchführen, da das POST-Array die zuvor gespeicherten Werte der Kontrollkästchen nicht enthält.

Um dies zu lösen, möchten Sie vielleicht den aktuellen "Speichertyp" kennen und nur das Post-Meta aktualisieren, wenn Sie sich im Admin-Bereich auf dem Post-Edit-Bildschirm befinden. Ein Weg, dies zu tun, ist es, den Aktionsparameter des POST-Array wie die folgenden zu überprüfen, da die action Parameter nur den Wert editpost hat, wenn sie von einem Postbearbeitungsbildschirm zu speichern:

if (filter_input(INPUT_POST, 'action') != 'editpost') { 
    return; 
} 

diesen Code Einlochen am Anfang Die Funktion, die an die save_post Aktion (member_page_meta_save in Ihrem Fall) angeschlossen ist, lässt den Rest der Funktion nur laufen, wenn Sie vom Nachbearbeitungsbildschirm speichern.

+0

Das scheint gut zu funktionieren, um die schnelle Bearbeitung zu verhindern, aber ich habe noch mit Sicherungen zu testen, aber ich werde hier kommentieren, wenn ich weitere Fragen habe. Danke für die Hilfe :) –

Verwandte Themen