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.

Read More

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!

Related posts

Leave a Reply

3 comments

  1. 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

  2. First you get the recent modified posts for your CPT only. Then get their attachments. Off course you can have some logic to limit array of attachments.

    $mycpt = get_posts(array(
                     'post_type'=>'mycpt',
                      'posts_per_page'=>-1,
                      'orderby'=>'modified'
                     ));
    
    $attachments = array();
    foreach($mycpt as $mycpt)
    {
      $post_attachements = get_posts( array(
        'post_parent'       => $mycpt->ID,
        'post_type'         => 'attachment',
        'post_mime_type'    => 'image',   
        'posts_per_page'    => -1
    ) );
       foreach($post_attachements as $post_attachements){
         $attachments[] = $post_attachements;
        }
    
    }
    
  3. put this code within the loop in single custom post type

    $attachments = get_posts( array(
        'post_parent'       => get_the_ID(),
        'post_type'         => 'attachment',
        'post_mime_type'    => 'image',
        'orderby'           => 'menu_order',
        'order'             => 'DESC',
        'posts_per_page'    => -1
    ) );
    
    if ( $attachments ) {
        foreach ( $attachments as $attachment ) {
            $attID     = $attachment->ID;
            echo '<a href="'.wp_get_attachment_url( $attID ).'" alt="'.apply_filters( 'the_title', $attachment->post_title ).'" class="att-item">'.wp_get_attachment_image( $attID, 'thumbnail' ).'</a>';
        }
    }