web-dev-qa-db-ja.com

WP リストテーブルのカスタムクイック編集ボックス - 投稿時にメタデータがなくなり、送信時に列が変更される

私はクラスWP_List_Tableを拡張して、カスタムメタボックスを含むクイックエディットボックスとともにカスタムソート可能な投稿テーブルを作成しました。

メタボックスが生成されて保存されますが、送信をクリックするとフィールド値が消え、クラスに含まれていないデフォルト(cb、title、tags、catなど)が保存された列に追加されます。これにより、ページ上の他の列が切り捨てられます。ページが更新されると、保存されたカスタムフィールド値が返されます。

送信時に$ post_objectが欠落しているような縫い目です。

私は自分のクラスでget_inline_dataを呼び出すのではなく、私のクイック編集フォームにmeta_valuesを含むハックされたget_inline_data関数を使っています。

メタボックスのための私の保存機能:

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;

}

私のJavascript保存機能:

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

デフォルトの投稿タイプに列を追加するときにも同じエラーが発生します。

問題のある行は$pagenowチェックでした。
クイック編集はadmin-ajax.phpを使用するので、完了時にカスタム列はレンダリングされません。

これはうまくいきません。

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

しかし、これはしません:

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

それがこのチェックを実行するための最良の方法であるかどうかはわかりませんが、...

関連する トラックチケット

5
brasofilo