"Quick Edit"> Update löscht meine benutzerdefinierten Metawerte

7

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 Posts 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 beheben?

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);
    }
}
Scott B.
quelle
@Scott: Wenn Sie die Schnellbearbeitung verwenden, gehe ich davon aus, dass Ihre Metafelder nicht angezeigt werden? In diesem Fall $_POST['scottb_customHeader']ist immer leer und Sie löschen sie versehentlich. Sie custom_add_savesollten wahrscheinlich nicht feuern, wenn Sie eine schnelle Bearbeitung durchführen?
Jan Fabry
3
Überprüfen Sie, ob DOING_AJAXdefiniert und wahr ist. Wenn dies der Fall ist, geben Sie die Post-ID wie DOING_AUTOSAVEderzeit zurück.
TheDeadMedic
@TheDeadMedic: Ich vermute, dass der Ansatz mit dem ajaxifizierten Administrator von WP 3.1 unterbrochen wird. :-D
Denis de Bernardy
@ Jan - in jeder Hinsicht korrekt :)
Scott B
@Denis - sag was? Haben sie jetzt auch den Hauptbildschirm für die Bearbeitung von Posts verbessert?
TheDeadMedic

Antworten:

4

Fügen Sie dem Post-Edit-Formular zusammen mit Ihren benutzerdefinierten Feldern eine versteckte Flagge hinzu. Etwas wie

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

Wickeln Sie dann alle Ihre benutzerdefinierten save_post-Inhalte in eine Prüfung für dieses Flag ein. Dann müssen Sie auch nicht mehr nach der Konstante für die automatische Speicherung 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');
        }

    }

}
MathSmath
quelle
Ich komme gerade auf diesen zurück. Funktioniert hervorragend. Danke MathSmath!
Scott B
11

Ich hatte das gleiche Problem. Fügen Sie einfach den folgenden Code am Anfang der save_postRückruffunktion für Aktions-Hooks hinzu (die Funktion zum Speichern der benutzerdefinierten Daten).

// 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 das schnelle Speichern wp_nonce_fieldvorhanden ist und returnob dies der Fall ist. Es ist nicht erforderlich, ein zusätzliches ausgeblendetes Feld im Formular zu erstellen.

Nicolas Guillaume
quelle
Wow, ich kann nicht glauben, dass die Antwort von 2013 immer noch funktionieren würde.
dipak_pusti
Dies wurde für mich behoben
Nuno Sarmento
1

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

Um ehrlich zu sein, gibt es hier keine gute Antwort, weil es nichts mit Sicherheit zu tun hat. 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 Utils dafür

Fügen Sie Ihrem Formular hinzu:

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.

Patryk Godowski
quelle
0

Was passiert ist: Die neue Aktion für 'save_post'ist nicht dafür ausgestattet, die neuen Daten zu verarbeiten, die Sie in Ihren benutzerdefinierten Feldern haben. Wenn der Sicherungsbeitrag ausgeführt wird, fehlen alle benutzerdefinierten $ _POST-Felddaten, und die Feldwerte werden gelöscht, sodass Sie nichts mehr haben.

FIX:

Wo immer dies der add_action('save_post','your_new_action');Fall ist, können Sie dafür sorgen, dass es frühzeitig zurückkehrt, wenn Sie sich auf dem Bildschirm "Bearbeiten" befinden (wo die schnellen Änderungen erfolgen):

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

Oder Sie können überprüfen, ob die Aktion $ _POST ein Inline-Save ist (der Aktionsname der Schnellbearbeitung), und danach nichts mehr ausführen, um Ihre benutzerdefinierten Feldwerte beizubehalten:

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

Ich muss vielleicht noch mehr ausarbeiten, wenn Sie nicht sicher sind, wo Sie diese Schnipsel ablegen sollen. Aber ich hoffe, es hilft jemandem mit ähnlichen Problemen.

Foxinni
quelle
0

Das Problem hierbei ist, dass WP sieht, dass Ihre Felder nicht festgelegt sind, und Sie WP anweisen, sie zu löschen. Löschen Sie es nicht, wenn das Feld nicht vorhanden ist. Löschen Sie es, wenn das Feld vorhanden, 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);
        }
    }
Tim Bunch
quelle
1
Bitte verwenden Sie keine nicht bereinigten und nicht validierten und nicht entkoppelten Werte, wenn Sie etwas in der Datenbank speichern. Das ist sehr gefährlich.
Kaiser
@kaiser Laut WP: $meta_value (mixed) (required) The new value of the custom field. A passed array will be serialized into a string.(this should be raw as opposed to sanitized for database queries) codex.wordpress.org/Function_Reference/update_post_meta
Tim Bunch
Abgesehen davon, dass es sich bei Ihrer Referenz um Post-Meta handelt, während Ihre Antwort Term-Meta behandelt, ist dies Unsinn. Bereinigen Sie immer die Datenbankeingaben, egal was passiert. Während beide Verwendung update_metadata()unter der Haube, die Funktion , dass Sorgen über Hygienisierung ist sanitize_meta(). Es ist ein Filter und könnte abgemeldet werden. Entweder versuchen Sie sicherzustellen, dass Sie Ihren eigenen Rückruf anhängen, oder Sie vertrauen ihm einfach nicht.
Kaiser
In diesem Fall möchten Sie möglicherweise nur var_dump( $GLOBALS['wp_filter']['sanitize_meta'] );an der entsprechenden Stelle im Code nachsehen, was angehängt ist und was was tut.
Kaiser
1
Ganz recht. Der richtige Link für den Begriff Meta lautet codex.wordpress.org/Function_Reference/update_term_meta - gleicher Prozess.
Tim Bunch