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
?
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,
) );
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;
}
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é.