it-swarm.com.de

Rendern der hochgeladenen Datei in einem wp.media-Objekt

Ich habe diese Frage einige Male auf SO gestellt gesehen und sehe keine Antworten.

Ich habe ein wp.media-Objekt (Upload-Dialogfeld), in dem ich einen Upload zu einem Beitrag als Metaelement speichere. Es funktioniert einwandfrei, außer dass der ul.attachments-Frame beim Hochladen nicht aktualisiert wird (siehe Screenshot)

ul.attachments frame

Ich muss die Seite manuell aktualisieren, damit die neue Datei (pdf.pdf in meinem Screenshot-Beispiel) angezeigt wird.

Gibt es ein hochgeladenes Ereignis, in das ich die Ansicht für den Dateilistenrahmen einbinden und erneut rendern kann?

Vielen Dank.

BEARBEITEN: Ich habe den Code abstrahiert, damit ich das Problem veranschaulichen kann. N.B. Dies ist extrem schlechte Praxis, aber es war der einfachste Weg zu abstrahieren.

Schritte zum Replizieren des Problems:

  1. Fügen Sie https://Gist.github.com/matgargano/36e76cf4bb2b55e88981 zum Thema hinzu und fügen Sie es hinzu
  2. Um einen Beitrag hinzuzufügen, klicken Sie ganz unten in der Metabox auf "PDF einstellen"
  3. Ziehen Sie eine PDF-Datei und legen Sie sie ab. Beachten Sie, dass der linke Bereich nicht aktualisiert wird
  4. Aktualisieren Sie die erstellte/bearbeitete Seite des Posts und klicken Sie auf "PDF festlegen". Das Fenster wird erwartungsgemäß angezeigt (mit dem PDF auf der linken Seite). *** Das Ziel ist, dass das linke Bedienfeld in Schritt 3 aktualisiert wird
6
setterGetter

Ich nehme an, Sie haben dies bereits behoben, aber (bei einem offensichtlichen Versuch, das Kopfgeld abzutrennen und) wie in den Kommentaren erwähnt, gibt es eine einfache Lösung: Ändern Sie in Ihrer Funktion myplugin_meta_box_callback() die Zeile

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

zu

$mime_types      = 'application/pdf';

Die Option library.type für wp.media erwartet eine Zeichenfolge (die durch zusätzliche Typen durch Kommas getrennt werden kann) und kein Array.

Dies warf tatsächlich einen Fehler im media.model.Attachments auf, denn wenn Sie sich ansehen, wo er fehlgeschlagen ist, filtert der Validator type() (Zeile 997 in "media-models.js")

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

was dies nicht berücksichtigt, ist, dass ein Anhangstyp wie application/pdf in "media.php" durch wp_prepare_attachment_for_js() in Typ und Untertyp aufgeteilt wird und dies nur den Typ validiert, dh application (und auf eine ziemlich schlampige Weise auch mit keine Begrenzer).

Wie auch immer, wenn Sie den Upload-Validator von @Bainternet hinzufügen, ist dies alles umstritten - hier ist eine Variation davon:

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

(Der zusätzliche media_view_settings-Filter ändert lediglich den ausgewählten Filtertext von "Alle Medienelemente" in "Alle PDF Elemente".) Anschließend können Sie den allowed_mime_types-Parameter (auf die von @estepix neu erwähnte Weise) in Ihrem festlegen openModal() Funktion direkt nach dem Aufruf von 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;
                }

und Nicht-PDF-Dateien dürfen nicht hochgeladen werden.

5
bonger