web-dev-qa-db-de.com

WP Benutzerdefiniertes Schnellbearbeitungsfeld für Listentabelle - fehlende Post-Metadaten und Spaltenänderung beim Senden

Ich habe die Klasse WP_List_Table erweitert, um eine benutzerdefinierte sortierbare Tabelle mit Beiträgen zusammen mit einem schnellen Bearbeitungsfeld mit benutzerdefinierten Meta-Feldern zu erstellen.

Die Meta-Felder werden ausgefüllt und gespeichert, aber wenn ich auf "Senden" klicke, verschwinden die Feldwerte und die Standardwerte (cb, title, tags, cats usw.), die nicht einmal in meiner Klasse enthalten sind, werden wieder in die gespeicherte Spalte eingefügt. Dies wirft die anderen Spalten auf der Seite ab. Die gespeicherten benutzerdefinierten Feldwerte werden zurückgegeben, wenn die Seite aktualisiert wird.

Es scheint, als würde beim Abschicken das $ post_object fehlen.

Ich verwende eine gehackte Funktion get_inline_data, die die Metawerte in mein Schnellbearbeitungsformular einschließt, anstatt get_inline_data in meiner Klasse aufzurufen.

Meine Speicherfunktion für die Meta-Boxen:

add_action( 'save_post', 'save_inline_edit_meta' );
function save_inline_edit_meta( $post_id  ) {
    global $pagenow;

    if ( $pagenow == 'admin.php' ) {
     if ( isset( $_POST[ 'is_quickedit' ] )  && isset( $_POST[ 'standinghead' ] ) )
        update_post_meta( $post_id, '_wnd_standing_head', $_POST[ 'standinghead' ] );

    if ( isset( $_POST[ 'is_quickedit' ] )  && isset( $_POST[ 'headline' ] ) )
        update_post_meta( $post_id, '_wnd_alt_title', $_POST[ 'headline' ] );

    if ( isset( $_POST[ 'is_quickedit' ] )  && isset( $_POST[ 'deck' ] ) )
        update_post_meta( $post_id, '_wnd_deck', $_POST[ 'deck' ] );
    }
  return $post_id;

}

Meine Javascript-Speicherfunktion:

save : function(id) {
        var params, fields, page = $('.post_status_page').val() || '';

        if ( typeof(id) == 'object' )
            id = this.getId(id);
        $('table.widefat .inline-edit-save .waiting').show();
        params = {
            action: 'inline-save',
            post_ID: id,
            post_type: 'post',
            edit_date: 'true',
            post_status: page
        };
        fields = $('#edit-'+id+' :input').serialize();
        params = fields + '&' + $.param(params);

        $.post('admin-ajax.php', params,
            function(r) {
                $('table.widefat .inline-edit-save .waiting').hide();

                if (r) {
                    if ( -1 != r.indexOf('<tr') ) {
                        $(inlineEditPost.what+id).remove();
                        $('#edit-'+id).before(r).remove();
                        $(inlineEditPost.what+id).hide().fadeIn();
                    } else {
                        r = r.replace( /<.[^<>]*?>/g, '' );
                        $('#edit-'+id+' .inline-edit-save .error').html(r).show();
                    }
                } else {
                    $('#edit-'+id+' .inline-edit-save .error').html(inlineEditL10n.error).show();
                }
            }
        , 'html');
        return false;
    },

enter image description here

6
Chris_O

Beim Hinzufügen zusätzlicher Spalten zu den Standardbeitragstypen tritt nur derselbe Fehler auf.

Die beleidigende Zeile war die $pagenow Prüfung.
Quick Edit verwendet admin-ajax.php, sodass die benutzerdefinierten Spalten nicht gerendert werden, wenn dies abgeschlossen ist.

Das geht nicht:

if( 'edit.php' == $pagenow && is_admin() )
{
    add_action( 'admin_init', array( $this, 'init_id_column' ), 999 );
    add_action( 'admin_init', array( $this, 'init_thumb_column' ), 999 );
}

Aber das macht:

if( 
    ( 'edit.php' == $pagenow && is_admin() ) 
    or
    ( 'admin-ajax.php' == $pagenow && 'inline-save' == $_POST['action'] && 'list' == $_POST['post_view'] )
)
{
    add_action( 'admin_init', array( $this, 'init_id_column' ), 999 );
    add_action( 'admin_init', array( $this, 'init_thumb_column' ), 999 );
}

Ich bin mir nicht sicher, ob es die beste Methode ist, diese Überprüfung durchzuführen ...

Verwandte Track Ticket .

5
brasofilo