Je crée un plugin personnalisé et les utilisateurs doivent pouvoir télécharger plusieurs images. Je veux qu’ils puissent le faire via la page multimédia intégrée, mais à travers un modal/pop-up à partir de la page de configuration des plugins.
Quelque chose de similaire se produit lorsque vous utilisez Thrive Architect
et que vous sélectionnez l'onglet Image
, un modal apparaît et il ressemble exactement à la médiathèque de l'écran d'administration. Comment puis-je y arriver?
J'ai fait une recherche sur wordpress media modal
et elle retourne Référence de Javascript/wp.media mais je ne suis pas tout à fait sûr que ce soit ce que je cherche.
Est-ce une fonctionnalité intégrée à WordPress ou devrai-je trouver ma propre façon de le créer?
Enfin, toutes les suggestions que d'autres ont pu trouver sont également les bienvenues! Toujours sympa de savoir quelles solutions les autres ont trouvées.
Ah!
Le problème classique auquel toute personne soucieuse de l'expérience de ses utilisateurs est confrontée est confronté.
D'après mon expérience, wp.media
est la voie à suivre.
Ceci est pas mon code, mais il fait le travail. Je l'ai utilisé beaucoup.
Je vais expliquer ce que ça fait, pièce par pièce:
// Source: https://vedmant.com/using-wordpress-media-library-in-widgets-options/
jQuery(document).ready(function ($) {
$(document).on("click", ".upload_image_button", function (e) {
e.preventDefault();
var $button = $(this);
// Create the media frame.
var file_frame = wp.media.frames.file_frame = wp.media({
title: 'Select or upload image',
library: { // remove these to show all
type: 'image' // specific mime
},
button: {
text: 'Select'
},
multiple: false // Set to true to allow multiple files to be selected
});
// When an image is selected, run a callback.
file_frame.on('select', function () {
// We set multiple to false so only get one image from the uploader
var attachment = file_frame.state().get('selection').first().toJSON();
$button.siblings('input').val(attachment.url).change();
});
// Finally, open the modal
file_frame.open();
});
});
La première chose est la première. Nous avons besoin d'un bouton, lié à une entrée , pour en savoir plus à ce sujet plus tard. Cela peut être dans le personnaliseur, ou n'importe où vous en avez besoin:
<button class="upload_image_button">Upload Image</button>
Ensuite, nous avons besoin d'un ingesteur de données lié à ce bouton. Malheureusement, ceci est hors de portée, mais si vous faites cela dans un widget, ceci aura un effet:
<p>
<label for="<?php echo $this->get_field_id( 'image' ); ?>">Image:</label>
<br>
<input class="widefat" id="<?php echo $this->get_field_id( 'image' ); ?>" name="<?php echo $this->get_field_name( 'image' ); ?>" value="<?php echo $instance['image'];?>" />
<br>
<button class="upload_image_button">Upload Image</button>
</p>
Jusqu'ici, nous ne faisons que cibler le bouton, continuant ainsi:
// Create the media frame.
var file_frame = wp.media.frames.file_frame = wp.media({
title: 'Select or upload image',
library: { // remove these to show all
type: 'image' // specific mime
},
button: {
text: 'Select'
},
multiple: false // Set to true to allow multiple files to be selected
});
Le code est bien commenté, mais voici la documentation correspondante: https://codex.wordpress.org/Javascript_Reference/wp.media
Nous appelons donc simplement l'API WP JS pour accéder au cadre multimédia. Maintenant, pour obtenir le chemin du fichier, nous avons besoin de:
file_frame.on('select', function () {
Chaque fois que nous sélectionnons quelque chose dans le cadre, récupérons le chemin du fichier en fichier au format JSON AJAX, et nous le laisserons utiliser -
var attachment = file_frame.state().get('selection').first().toJSON();
Rappelez-vous ce bouton qui devait être connecté à une entrée? Oui, alors nous insérons ce lien que nous venons d'entrer dans cette entrée:
$button.siblings('input').val(attachment.url).change();
Et ainsi, un nouveau lien vers votre image est né.