List most recent image uploads, but only for specific custom post type

I can get a list of the most recent image attachments like so:

$attachments = get_posts( array(
    'post_type' => 'attachment',
    'posts_per_page' => $number,
    'post_mime_type' => 'image'
) );

This returns all images that have been recently uploaded, whether they are attached to a post or page, or unattached through the Media menu.

What I’d like is to limit that list to only images that are attached to a custom post type I’ve created. (The custom post type is not that important; the same question could be: ‘only images attached to Posts’ or ‘only images attached to Pages.’)

I realize I could test each image after running the above query and eliminate any whose parent is not the right post type, but I want to return a specific number of images ($number), and this method could eliminate some or all of the returned images!

3 Answers
3

Did you try adding a filter to get_posts. This isn’t tested, just a thought after a bit of searching :

 function my_filter( $query )
 {
      if( is_home() ) //Example, if u want to display recent images on home
      {
           $query->set( 'post_type', array( 'attachment', 'my_cpt' ) );
      }
 }
 add_filter( 'pre_get_posts', 'my_filter' );

EDIT :
After rereading, I don’t think it accomplishes what you’re trying to do, I think it will display both attachments, and posts of your CPT.

Guess i’ill leave it here in case it gives you any ideas.

EDIT 2:
The only other way besides filtering in PHP that I can think of would be a custom sql query, and then setting up the post data. EX :

$sql = "SELECT * FROM wp_posts
        WHERE post_type="attachment"
        AND post_parent IN (SELECT ID FROM wp_posts WHERE post_type="your-cpt")
        //ORDER BY";

 $posts = $wpdb->get_results( $sql, OBJECT );

 //loop - setup_postdata

More info: WordPress Codex

Leave a Comment