4

Is there a way to filter posts by featured image when initialising a WP_Query object?

Example

$my_query = WP_Query(array("has_thumbnail"=>true));

or, more ideally

$my_query = WP_Query(array("has_thumbnail_size"=>"custom_size"));

2 Answers 2

9

Technically featured image is custom field with name _thumbnail_id that holds attachment ID. So you can easily query with something like:

$args = array(
    'meta_query' => array(
        array(
            'key' => '_thumbnail_id',
        )
    )
 );
$query = new WP_Query( $args );

Size on other hand is attribute of that attachment and not post itself. You will need to loop through attachment and get sizes they have (if I remember right it should be in data returned by wp_get_attachment_metadata()).

0

Here's an alternate approach of filtering the posts after the query using whether the wp_get_attachment_thumb_url() returns an empty string to determine if the post has a thumbnail (featured image).

//get all the posts however your query does it. simple example when there aren't a lot: 
$args = array("nopaging" => true);
$posts = (new WP_Query($args))->posts;

//filter the posts array by looking up the thumb_url and seeing if it's empty
$posts_without_thumbnails = array_filter($posts,  function($post){
  $post_thumbnail_id = get_post_thumbnail_id( $post->ID );
  return ( wp_get_attachment_thumb_url( $post_thumbnail_id ) == "");
} );

If you need this to happen during the query, you can probably make a wordpress filter or action out of it or intercept the query_posts.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.