web-dev-qa-db-fra.com

Filtrer les éléments de la médiathèque par taille

Je souhaite empêcher les utilisateurs de pouvoir définir une image sélectionnée dans la médiathèque si sa largeur est inférieure à 100 pixels. Au départ, je pensais utiliser le filtre ajax_query_attachments_args, mais celui-ci filtre un objet WP_Query() qui ne peut pas être utilisé à cette fin, car le meta_query's meta_key— qui est _wp_attachment_metadata— contient des données sérialisées. C'est ce que je suis en train d'essayer:

function restrict_media_library_by_width($response, $attachment, $meta) {
  if(isset($response['width']) && isset($response['height']) && $response['width'] >= 100) {
    return $response;
  }
  return false;
}
add_filter('wp_prepare_attachment_for_js', 'restrict_media_library_by_width', 10, 3);

Le résultat que je vois est que le modal Médiathèque apparaît, charge une vignette "vide" et le chargeur AJAX continue d'apparaître et de disparaître par intermittence:

enter image description here

Cependant, si je modifie la dernière condition de mon instruction if pour utiliser == au lieu de >=, alors elle semble fonctionner comme prévu pour certaines valeurs :

function restrict_media_library_by_width($response, $attachment, $meta) {
  if(isset($response['width']) && isset($response['height']) && $response['width'] == 100) {
    return $response;
  }
  return false;
}
add_filter('wp_prepare_attachment_for_js', 'restrict_media_library_by_width', 10, 3);

Cela ne fonctionne pas toujours, mais je soupçonne que quelque chose me manque. Quelqu'un peut-il s'il vous plaît faire la lumière sur cela? Merci!

5
cfx

Jusqu'à présent, la seule solution envisageable que j'ai proposée consiste à exécuter une nouvelle requête dans le filtre ajax_query_attachments_args.

Ce n'est certainement pas idéal, mais fonctionne comme prévu en l'absence d'une alternative plus efficace:

function restrict_media_library_by_width($query) {
  $include = array();
  $exclude = array();
  $temp_query = new WP_Query($query);
  if($temp_query->have_posts()) {
    while($temp_query->have_posts()) {
      $temp_query->the_post();
      $meta = wp_get_attachment_metadata(get_the_ID());
      $meta['mime-type'] = get_post_mime_type(get_the_ID());
      if(isset($meta['mime-type']) &&
        ($meta['mime-type'] == 'image/jpeg' && isset($meta['width']) && $meta['width'] >= 100) ||
         $meta['mime-type'] == 'image/svg+xml') {
        $include[] = get_the_ID();
      } else {
        $exclude[] = get_the_ID();
      }
    }
  }
  wp_reset_query();

  $query['post__in']     = $include;
  $query['post__not_in'] = $exclude;

  return $query;
}
add_filter('ajax_query_attachments_args', 'restrict_media_library_by_width');
2
cfx