web-dev-qa-db-ja.com

サイズでメディアライブラリアイテムをフィルタリングする

幅が100px未満の場合、ユーザーがメディアライブラリから注目画像を設定できないようにします。当初はajax_query_attachments_argsフィルターを使用することを考えていましたが、meta_querymeta_key_wp_attachment_metadata)にはシリアル化されたデータが含まれているため、この目的に効果的に使用できないWP_Query()オブジェクトをフィルターします。これは私が現在試していることです:

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

私が見る結果は、メディアライブラリモーダルがポップアップし、「空の」サムネイルをロードし、AJAXローダーが断続的に現れたり消えたりすることです。

enter image description here

ただし、==ではなく>=を使用するようにifステートメントの最後の条件を変更すると、期待どおりに機能するように見えますfor特定の値

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

常に機能するとは限りませんが、ここで何かが欠けていると思います。誰かがこれに光を当ててください。ありがとう!

5
cfx

これまでのところ、私が考え出した唯一の実行可能な解決策は、ajax_query_attachments_argsフィルタ内で新しいクエリを実行することです。

これは絶対に理想的ではありませんが、より効率的な代替手段がない場合は期待通りに機能します。

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