Broken? WP_Query and “attachment” as a post type

I have a gallery attached to a page. On that page, I’m running the following query:

$events_gallery = new WP_Query( // Start a new query for our videos
array(
    'post_parent' => $post->ID, // Get data from the current post
    'post_type' => 'attachment', // Only bring back attachments
    'post_mime_type' => 'image', // Only bring back attachments that are images
    'posts_per_page' => '3', // Show us the first three results
    'status' => 'inherit', // Inherit the status of the parent post 
    'orderby' => 'rand', // Order the attachments randomly  
    )
);

I’ve experimented quite a few ways and, for some reason, I can’t get attachments to return. Am I missing something obvious here?

Read More

Update*

Thanks to Wok for pointing me in the right direction.

It turns out I was using “status” instead of “post_status”. The codex had used “status” as the example in its in-context explanation of the “attachment” post type. I updated the codex to reference “post_status” instead. The correct code is as follows:

$events_gallery = new WP_Query( // Start a new query for our videos
array(
    'post_parent' => $post->ID, // Get data from the current post
    'post_type' => 'attachment', // Only bring back attachments
    'post_mime_type' => 'image', // Only bring back attachments that are images
    'posts_per_page' => '3', // Show us the first three results
    'post_status' => 'inherit', // Attachments default to "inherit", rather than published. Use "inherit" or "any".
    'orderby' => 'rand', // Order the attachments randomly  
    )
);  

Related posts

Leave a Reply

4 comments

  1. These are the query parameters i use…works for me when i loop through the results

    array(
        'post_parent' => $post->ID,
        'post_status' => 'inherit',
        'post_type'=> 'attachment',
        'post_mime_type' => 'image/jpeg,image/gif,image/jpg,image/png'                  
    );
    

    For more detail, please see official documentation for WP_Query’s status parameters

  2. Add in $args, it is important.

    'post_status' => 'any'
    

    Do not: 'post_status' => null

    This is important because attachments don’t have a post_status, so the default value for post_status, published, will find no attachments.

  3. Looking at the query it generates, it does appear to be a bug of sorts. ‘status’ => ‘inherit’ is interpreted as the parent’s status, when the entry in the db for the attachment is literally ‘inherit’.

    An alternative is to use get_children in place of WP_Query.

  4. I’ve been able to display all images that are attachments to a post using this code.

    <?php
    $args = array( 'post_type' => 'attachment', 'orderby' => 'menu_order', 'order' => 'ASC', 'post_mime_type' => 'image' ,'post_status' => null, 'post_parent' => $post->ID );
    $attachments = get_posts($args);
        if ($attachments) {
        foreach ( $attachments as $attachment ) { ?>
          <img src="<?php echo wp_get_attachment_url( $attachment->ID , false ); ?>" />
    <?php   }
        } ?>
    

    And to echo the URL of the original full size image, you could link that image off to

    <?php echo wp_get_attachment_url( $attachment->ID , false ); ?>
    

    Hopefully this is an approach to what you’re trying to do.