web-dev-qa-db-fra.com

Rendu du fichier téléchargé dans un objet wp.media

J'ai vu cette question posée à quelques reprises sur SO et je ne vois aucune réponse.

J'ai un objet wp.media (boîte de dialogue de téléchargement), que j'utilise pour stocker un téléchargement dans une publication en tant que méta-élément. Cela fonctionne bien, sauf que le cadre ul.attachments ne rafraîchit pas lors du téléchargement, voir la capture d'écran.

ul.attachments frame

Je dois actualiser manuellement la page pour obtenir le nouveau fichier (pdf.pdf dans mon exemple de capture d'écran) à afficher.

Existe-t-il un événement téléchargé auquel je peux me connecter et rendre à nouveau la vue pour le cadre de la liste de fichiers?

Merci.

EDIT: J'ai extrait le code afin de pouvoir démontrer le problème. N.B. cela utilise des pratiques extrêmement mauvaises, mais c’était le moyen le plus simple d’abstraire.

Étapes à suivre pour reproduire le problème:

  1. Drop https://Gist.github.com/matgargano/36e76cf4bb2b55e88981 dans le thème et l'inclure
  2. Pour ajouter un post, cliquez sur "set pdf" dans la metabox tout en bas
  3. Glissez et déposez un PDF, notez que le panneau de gauche ne s'actualise pas
  4. Actualisez la page de publication/modification créée et cliquez sur "Définir pdf" pour voir le panneau apparaître comme prévu (avec le PDF répertorié à gauche). *** L'objectif consiste à actualiser le panneau de gauche à l'étape 3.
6
setterGetter

Je suppose que vous avez déjà résolu ce problème, mais (dans une tentative flagrante de dépenser de l'argent et) comme mentionné dans les commentaires, il y a une solution simple, dans votre fonction myplugin_meta_box_callback(), changez la ligne

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

à

$mime_types      = 'application/pdf';

L'option library.type de wp.media attend une chaîne (qui peut être séparée par des virgules avec des types supplémentaires) et non un tableau.

Cela a en fait provoqué un bogue dans le media.model.Attachments parce que si vous regardez où il échouait, le filtre validateur type() (ligne 997 dans "media-models.js")

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

alors ce que cela ne prend pas en compte, c’est qu’un type de pièce jointe comme application/pdf est divisé en type et en sous-type par wp_prepare_attachment_for_js() dans "media.php", ce qui ne fait que valider le type, c’est-à-dire application (et valider de manière plutôt bâclée avec pas de délimiteurs).

Quoi qu'il en soit, tout ce qui est théorique si vous ajoutez le validateur de téléchargement donné par @Bainternet - en voici une variante:

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

(Le filtre supplémentaire media_view_settings modifie simplement le texte du filtre de sélection de "Tous les éléments multimédias" à "Tous PDF éléments".) Vous pouvez ensuite définir le paramètre allowed_mime_types (de la nouvelle manière indiquée par @estepix) dans votre openModal() fonction directement après avoir appelé 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;
                }

et les fichiers non PDF ne seront pas autorisés à être téléchargés.

5
bonger