web-dev-qa-db-fra.com

Obtenir des informations de pièce jointe/image dans JS

Existe-t-il une méthode spécifique pour obtenir des informations de pièce jointe/image dans JS? J'ai un identifiant de pièce jointe et avant d'utiliser tout

add_action("wp_ajax_get_image_info", "get_image_info");

Je voudrais voir s'il existe une méthode native pour faire cela via JS uniquement.

4
Benn

En résumé, vous pouvez obtenir des informations sur une pièce jointe en utilisant la fonction wp.media.attachment(). Cela vous donnera des données complètes tant que cette pièce jointe est déjà chargée par un autre script ou un popup wp.media().

Si les données ne sont pas encore chargées, vous pouvez les charger à l'aide de la méthode .fetch() en pièce jointe, ce qui fonctionne car il s'agit d'un Backbone.Collection . Il s'agit d'une Collection car une pièce jointe peut contenir plusieurs fichiers sélectionnés.

// preload your attachment
wp.media.attachment(ID).fetch().then(function (data) {
  // preloading finished
  // after this you can use your attachment normally
  wp.media.attachment(ID).get('url');
});

Moyen facile de précharger:

function preloadAttachment(ID, callback) {
  // if it doesn't have URL we probably have to preload it
  if (wp.media.attachment(ID).get('url')) {
    wp.media.attachment(ID).fetch().then(function () {
      callback(wp.media.attachment(ID);
    });

    return;
  }

  callback(wp.media.attachment(ID));
}

// USAGE:
preloadAttachment(10, function (attachment) {
  console.log(attachment.get('url'));
  console.log(wp.media.attachment(10).get('url')); // this also works
})

Et c'est comme cela que vous voudrez procéder au préchargement de plus d'une pièce jointe , en une seule demande AJAX.

// An array of attachments you may want to preload
var attachment_ids = [10, 11, 12, 13];
wp.media.query({ post__in: attachment_ids })
  .more()
  .then(function () {
    // You attachments here normally
    // You can safely use any of them here
    wp.media.attachment(10).get('url');
  })

Notez le fait que la requête AJAX effectuée par wp.media.query() est paginée. Si vous avez besoin d’une solution robuste pour le chargement de nombreux documents, vous devez analyser chaque page avec les méthodes hasMore() ET more() .

Avertissement:

J'ai déjà utilisé cette méthode avant de connaître wp.media.query, mais cette méthode comporte la pénalité de faire une demande par pièce jointe préchargée. Mais il a aussi une fonctionnalité Nice: il ne fait aucune demande si toutes les pièces jointes devant être préchargées sont déjà dans l'état récupéré.

function preloadMultipleAttachments(attachment_ids) {
    // I'd rather use Promise.all() here but they do not work with
    // jQuery deferreds :/
    if (jQuery.when.all===undefined) {
        jQuery.when.all = function(deferreds) {
            var deferred = new jQuery.Deferred();
            $.when.apply(jQuery, deferreds).then(
                function() {
                    deferred.resolve(Array.prototype.slice.call(arguments));
                },
                function() {
                    deferred.fail(Array.prototype.slice.call(arguments));
                });

            return deferred;
        }
    }

    return jQuery.when.all(
        attachment_ids.filter(function (attachment_id) {
            return ! wp.media.attachment(attachment_id).get('url');
        }).map(function (id) {
            return wp.media.attachment(id).fetch();
        })
    );
},
11
Andrei Glingeanu

Jetpack possède une API JSON qui vous permet d'interroger à peu près tout ce qui se trouve dans une installation donnée. http://jetpack.me/support/json-api/

0
user12479