web-dev-qa-db-ja.com

Wp_queryからすべての画像を除外するにはどうすればよいですか?

添付ファイルをクエリし、すべての画像を除外したいです。

'post_mime_type' => 'image/*'を使って、 only imagesを含める方法を見ることはできますが、その反対の方法を見つけることができませんでした。 posts__not_inと同等のmime_typeはありますか?

3
SinisterBeard

ほとんどの解決策は、すべてのMIME except画像を含めることです。 WordPressには、m - のArray()を返す get_allowed_mime_types() (巧妙に命名された)と呼ばれるすべての受け入れられたMIMEタイプを保持する気の利いた小さな関数があります。必要なのは、返された配列と、クエリに不要なMIMEタイプの配列の違いを取得することだけです。

$unsupported_mimes  = array( 'image/jpeg', 'image/gif', 'image/png', 'image/bmp', 'image/tiff', 'image/x-icon' );
$all_mimes          = get_allowed_mime_types();
$accepted_mimes     = array_diff( $all_mimes, $unsupported_mimes );
$attachment_query   = new WP_Query( array(
    'post_type'         => 'attachment',
    'post_status'       => 'inherit',
    'post_mime_type'    => $accepted_mimes,
    'posts_per_page'    => 20,
) );
11
Howdy_McGee

MIMEタイプを持たない添付ファイル以外の投稿タイプ(投稿、ページなど)も含める場合は、posts_whereフィルタを使用する必要があります。

add_filter( 'posts_where' , 'remove_images' );

function remove_images($where) {
    global $wpdb;
    $where.=' AND '.$wpdb->posts.'.post_mime_type NOT LIKE \'image/%\'';
    return $where;
}
3
SinisterBeard

MIMEタイプにはposts_not_inと同等のものがないことはほぼ確実です。

もちろん、画像であるすべての添付ファイルをクエリすることもできます。できれば、パラメータfieldsidsに設定してIDを返すだけです。その後、2番目のクエリでこれらのIDをposts__not_inと共に使用できます。欠点は、2つのクエリが必要なことです。

もう1つの可能性は、posts_whereフィルターにフックして、あなたが望むような結果を得るために何らかのSQLを適用することです。

2
Nicolai