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!

link|improve this question
1  
Perhaps the answer I provided on this post, a question asking how to get the number of attachment for a CPT, would work with some tweaks: wordpress.stackexchange.com/questions/37741/… – 5t3ph Jan 11 at 18:43
Thanks Steph. That looks like it would work. (And it's pretty much the approach I described in my last paragraph above.) It just seems inefficient to retrieve all attachments and then sift through them one by one. I'd rather be able to select the right ones from the start. But it looks like that's not possible without a custom SQL statement. Maybe I'm over-thinking it. Anyway, I now have two approaches to try and compare. Thanks! – Doug Jan 11 at 20:52
feedback

1 Answer

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

link|improve this answer
Interesting idea. I never like writing custom SQL, but yours looks pretty straightforward. I'll give it a shot. – Doug Jan 11 at 18:24
feedback

Your Answer

 
or
required, but never shown

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