web-dev-qa-db-fra.com

Comment exclure toutes les images d'un wp_query?

Je veux interroger les pièces jointes et exclure toutes les images.

Je peux voir comment inclure seulement images à l’aide de 'post_mime_type' => 'image/*', mais je n’ai trouvé aucun moyen de parvenir à l’inverse. Existe-t-il un équivalent mime_type de posts__not_in?

3
SinisterBeard

La solution consiste à inclure tous les mimes sauf images. WordPress a une petite fonction astucieuse dans laquelle il conserve tous ses types de mimes acceptés appelés get_allowed_mime_types() (astucieusement nommé) qui renvoie un Array () de mimes. Tout ce que nous avons à faire est d’obtenir la différence entre le tableau retourné et le tableau de types MIME que nous ne voulons pas dans notre requête:

$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

Si vous souhaitez également inclure des types de publication autres que des pièces jointes (telles que des publications, des pages) qui n'ont pas de type mime, vous devez utiliser le filtre 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

Je suis à peu près certain qu'il n'y a pas d'équivalent de posts_not_in pour les types MIME.

Vous pouvez bien sûr interroger toutes les pièces jointes qui sont des images. De préférence, il suffit de renvoyer les ID via le paramètre fields et le mettre à ids. Ensuite, vous pouvez utiliser ces identifiants avec posts__not_in lors d'une seconde requête. L'inconvénient est que vous avez besoin de deux requêtes.

Une autre possibilité serait d’accrocher le filtre posts_where et d’appliquer du code SQL pour obtenir le résultat souhaité.

2
Nicolai