Filtrar itens da biblioteca de mídia por tamanho

4

Eu quero impedir que os usuários possam definir uma imagem em destaque da biblioteca de mídia se a largura for menor que 100px. Originalmente, pensei em usar o filtro ajax_query_attachments_args , mas ele filtra um objeto WP_Query() que efetivamente não pode ser usado para essa finalidade porque o meta_query do meta_key , que é _wp_attachment_metadata , contém dados serializados. Isso é o que estou tentando atualmente:

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

O resultado que vejo é que o modal da Biblioteca de Mídia aparece, carrega uma miniatura "vazia" e o carregador AJAX continua aparecendo e desaparecendo intermitentemente:

No entanto, se eu alterar a última condicional na minha instrução if para usar == em vez de >= , então parece funcionar como esperado para determinados valores :

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

Nem sempre funciona, mas suspeito que estou perdendo alguma coisa aqui. Alguém pode por favor lançar alguma luz sobre isso? Obrigado!

    
por cfx 07.03.2015 / 23:24

1 resposta

1

Até agora, a única solução viável que desenvolvi foi executar uma nova consulta no filtro ajax_query_attachments_args .

Definitivamente não é ideal, mas funciona como esperado na ausência de uma alternativa mais eficiente:

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');
    
por cfx 08.03.2015 / 17:17