I think it makes a lot of sense to display certain post format archives differently than standard post archives. For instance, image post formats might look a lot better in a grid view with large images rather than a traditional blog format.
It’s easy enough to alter the post format archive template, but the taxonomy views (categories and tags) will still display in the standard layout- even if all the posts are the same format.
I thought it would be great to detect what type of posts were being displayed in the taxonomy before they rendered, and use a different layout if they were all in the same post format. This way I could continuity between the post format archives and taxonomy archives- assuming they all contained the same post format.
This loop allows us to detect if all the posts are image or gallery post formats:
$portfolio_view = true;
global $wp_query;
if ( $wp_query->have_posts() ) :
while ( $wp_query->have_posts() ) : $wp_query->the_post();
$format = get_post_format();
if ( ( $format != 'image' ) && ( $format != 'gallery' ) ) {
$portfolio_view = false;
}
endwhile;
endif;
if ( $portfolio_view ) {
// All image or gallery post formats
}
By using this code in the template_include hook, we can run the check before the post render, and then call a different template to display the content if it meets our conditions (such as our post type archive template).
function prefix_template_chooser( $template ) {
// Check if the taxonomy query contains only image or gallery post formats
if ( is_category() || is_tag() ) {
$portfolio_view = true;
global $wp_query;
if ( $wp_query->have_posts() ) :
while ( $wp_query->have_posts() ) : $wp_query->the_post();
$format = get_post_format();
if ( ( $format != 'image' ) && ( $format != 'gallery' ) ) {
$portfolio_view = false;
}
endwhile;
endif;
if ( $portfolio_view ) {
// In this case, I'm using an archive-portfolio template I've created
$template = get_query_template( 'archive-portfolio' );
}
}
return $template;
}
add_filter( 'template_include', 'prefix_template_chooser' );
This is kind of a magical hook. Have fun with it!