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.
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:
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.