it-swarm.com.de

"Quick Edit"> Update löscht meine verfügbaren Meta-Werte

Ich habe zwei benutzerdefinierte Metafelder, die ich für jeden Beitrag aktiviert habe, scottb_customHeader und scottb_customTitle

Diese funktionieren einwandfrei, solange ich die vollständige Bearbeitungsfunktion zum Bearbeiten von Beiträgen verwende. Wenn ich jedoch auf "Schnellbearbeitung" und dann auf "Aktualisieren" klicke, werden meine benutzerdefinierten Metawerte für den Beitrag gelöscht. Was muss ich tun, um das Problem zu lösen?

Code ist unten ...

add_action('save_post', 'custom_add_save');


function custom_add_save($postID){
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return $postID;
    }
    else
    {
        // called after a post or page is saved
        if($parent_id = wp_is_post_revision($postID))
        {
        $postID = $parent_id;
        }

        if ($_POST['scottb_customHeader']) 
        {
            update_custom_meta($postID, $_POST['scottb_customHeader'], '_scottb_customHeader');
        }
        else
        {
            update_custom_meta($postID, '', '_scottb_customHeader');
        }
        if ($_POST['scottb_customTitle']) 
        {
            update_custom_meta($postID, $_POST['scottb_customTitle'], '_scottb_customTitle');
        }
        else
        {
            update_custom_meta($postID, '', '_scottb_customTitle');
        }
    }
}

function update_custom_meta($postID, $newvalue, $field_name) {
    // To create new meta
    if(!get_post_meta($postID, $field_name)){
    add_post_meta($postID, $field_name, $newvalue);
    }else{
    // or to update existing meta
    update_post_meta($postID, $field_name, $newvalue);
    }
}
7
Scott B

Fügen Sie dem Post-Bearbeitungsformular zusammen mit Ihren benutzerdefinierten Feldern eine ausgeblendete Flagge hinzu. So etwas wie

<input type="hidden" name="my_hidden_flag" value="true" />

Wickeln Sie dann alle Ihre benutzerdefinierten save_post-Elemente in einen Check für dieses Flag ein. Dann müssen Sie auch nicht mehr nach der Autosave-Konstante suchen. Wenn das Flag nicht vorhanden ist, handelt es sich entweder um eine schnelle Bearbeitung oder um eine automatische Speicherung.

function custom_add_save($postID){

    // Only do this if our custom flag is present
    if (isset($_POST['my_hidden_flag'])) {

        // called after a post or page is saved
        if($parent_id = wp_is_post_revision($postID)) {
            $postID = $parent_id;
        }

        if ($_POST['scottb_customHeader']) {
            update_custom_meta($postID, $_POST['scottb_customHeader'], '_scottb_customHeader');
        } else {
            update_custom_meta($postID, '', '_scottb_customHeader');
        }

        if ($_POST['scottb_customTitle']) {
            update_custom_meta($postID, $_POST['scottb_customTitle'], '_scottb_customTitle');
        } else {
            update_custom_meta($postID, '', '_scottb_customTitle');
        }

    }

}
4
MathSmath

Ich hatte das gleiche Problem. Fügen Sie einfach den folgenden Code am Anfang der Hook-Rückruffunktion save_post hinzu (die Funktion, mit der die benutzerdefinierten Daten gespeichert werden).

// handle the case when the custom post is quick edited
// otherwise all custom meta fields are cleared out
if (wp_verify_nonce($_POST['_inline_edit'], 'inlineeditnonce'))
      return;

Was es tatsächlich tut: Es prüft, ob der schnell speicherbare wp_nonce_field existiert und returns, wenn dies der Fall ist. Es muss kein zusätzliches ausgeblendetes Feld im Formular erstellt werden.

9

Die Frage ist ziemlich alt, aber ich denke, dass das Problem noch besteht.

Um ehrlich zu sein, gibt es hier keine gute Antwort, weil es nichts über Sicherheit gibt. Sie speichern Daten in der Datenbank, ohne deren Quelle zu überprüfen ...

Sie sollten nonce verwenden, um die Datenquelle zu überprüfen - dank dieser Funktion werden sie von QuickEdit nicht überschrieben (oder gelöscht). WordPress gibt Ihnen dafür Utensilien

Zum Formular hinzufügen:

wp_nonce_field('my_custom_page', '_my_custom_page');

Und dann zu Beginn Ihrer Speicherfunktion:

if (!wp_verify_nonce( $_POST['_my_custom_page'], 'my_custom_page' )) { return $post_id; }

Sie sollten dies für jeden benutzerdefinierten Beitrag tun.

1
Patryk Godowski

Folgendes passiert: Die neue Aktion für 'save_post' ist nicht für die Verarbeitung der neuen Daten in Ihren benutzerdefinierten Feldern geeignet. Wenn der Sicherungsbeitrag ausgeführt wird, fehlen alle benutzerdefinierten $ _POST-Felddaten und somit die Feldwerte, sodass Sie nichts mehr haben.

FIX:

Wo immer sich die add_action('save_post','your_new_action'); befindet, können Sie sie vorzeitig zurücksetzen, wenn Sie sich auf dem Bildschirm "Bearbeiten" befinden (wo die Schnellbearbeitungen stattfinden):

 global $current_screen;    
 if($current_screen->base == 'edit') return $post_id;

Oder Sie können überprüfen, ob die Aktion $ _POST eine Inline-Speicherung ist (der Aktionsname der Schnellbearbeitung) und danach nichts mehr ausführen, wodurch Ihre benutzerdefinierten Feldwerte erhalten bleiben:

 if( $_POST['action'] != 'inline-save' ) { echo 'Do this then..'; }

Möglicherweise muss ich noch mehr ausarbeiten, wenn Sie nicht sicher sind, wo diese Schnipsel abgelegt werden sollen. Aber ich hoffe es hilft jemandem bei ähnlichen Problemen.

0
Foxinni

Das Problem hierbei ist, dass WP feststellt, dass Ihre Felder nicht gesetzt sind, und Sie WP auffordern, sie zu löschen. Räumen Sie es nicht aus, wenn das Feld nicht existiert. Löschen Sie, ob das Feld existiert, aber leer ist.

    if ( isset( $_POST[$meta_key] ) ){
        $meta_value = $_POST[$meta_key];
        if ($meta_value) {
            update_term_meta($term_id, $meta_key, $meta_value);
        } else {
            delete_term_meta($term_id, $meta_key);
        }
    }
0
Tim Bunch