web-dev-qa-db-ja.com

アップロードされたファイルをwp.mediaオブジェクトにレンダリングする

この質問がSOで数回質問されたのを見たことがありますが、返答がありません。

私はメタ要素として投稿へのアップロードを保存するために使用しているwp.mediaオブジェクト(アップロードダイアログ)を持っています。アップロード時にul.attachmentsフレームが更新されないことを除けば、うまく機能します。スクリーンショットを参照してください。

ul.attachments frame

新しいファイル(スクリーンショットの例ではpdf.pdf)を表示するには、ページを手動で更新する必要があります。

ファイルリストフレームのビューをフックして再レンダリングできるアップロード済みのイベントはありますか?

ありがとう。

編集:問題を説明できるように、コードを抽象化しました。 N.B.これは非常に悪い習慣を使っていますが、抽象化する最も簡単な方法でした。

問題を再現する手順

  1. テーマに https://Gist.github.com/matgargano/36e76cf4bb2b55e88981 をドロップして含めます
  2. 投稿を追加するには、一番下のメタボックスで[set pdf]をクリックします
  3. PDFをドラッグアンドドロップします。左側のパネルは更新されません。
  4. 投稿の作成/編集ページを更新して[Set pdf]をクリックすると、パネルが予想どおりに表示されることを確認します(左側に[PDF]が表示されます)。 ***目標は、手順3で左側のパネルを更新することです。
6
setterGetter

私はあなたがすでにこれを修正したと思いますが、(賞金を削減するための露骨な試みで)コメントで述べたように、あなたのmyplugin_meta_box_callback()関数で行を変更する簡単な修正があります

$mime_types      = array( 'application/pdf' );

$mime_types      = 'application/pdf';

library.typewp.mediaオプションは、配列ではなく文字列(追加の型でカンマで区切ることができます)を想定しています。

これは実際にはmedia.model.Attachmentsのバグを投げ出しました。失敗した場所を見るとバリデーターのtype()フィルター( "media-models.js"の997行目)です。

        type: function( attachment ) {
            var type = this.props.get('type');
            return ! type || -1 !== type.indexOf( attachment.get('type') );
        },

これを考慮していないのは、application/pdfのような添付ファイルタイプは "media.php"のwp_prepare_attachment_for_js()によってタイプとサブタイプに分割されていることで、これは検証タイプ、つまりapplicationだけです。区切り文字なし).

とにかく、 アップロードバリデータ @Bainternetで与えられた/を追加すれば、それは大したことではありません。

add_action( 'admin_init', function () {
    add_filter( 'wp_handle_upload_prefilter', function ( $file ) {
        if ( empty( $_POST['allowed_mime_types'] ) || empty( $file['type'] ) ) {
            return $file;
        }
        $allowed_mime_types = explode( ',', $_POST['allowed_mime_types'] );
        if ( in_array( $file['type'], $allowed_mime_types ) ) {
            return $file;
        }
        // Cater for "group" allowed mime types eg "image", "audio" etc. to match
        // files of type "image/png", "audio/mp3" etc.
        if ( ( $slash_pos = strpos( $file['type'], '/' ) ) > 0 ) {
            if ( in_array( substr( $file['type'], 0, $slash_pos ), $allowed_mime_types ) ) {
                return $file;
            }
        }
        $file['error'] = __( 'Sorry, you cannot upload this file type for this field.' );
        return $file;
    } );

    add_filter( 'media_view_settings', function ( $settings, $post ) {
        $settings['mimeTypes']['application/pdf'] = __( 'All PDF items' );
        return $settings;
    }, 10, 2 );
} );

(追加のmedia_view_settingsフィルタは、選択フィルタのテキストを "All media items"から "All PDF items"に変更するだけです。その後、(@ estepixで新しい方法で)allowed_mime_typesパラメータを設定できます。 openModal()を呼び出した直後のwp.media()関数

                this.modal = wp.media.frames.file_frame = wp.media(options);
                if (options.library && options.library.type && this.modal.uploader) {
                    this.modal.uploader.options.uploader.params.allowed_mime_types = options.library.type;
                }

pDF以外のファイルはアップロードできません。

5
bonger