Genesis Grid Loop

Understanding the Genesis Grid Loop can be rather confusing, so these posts are designed to help you understand the Genesis Grid Loop, customize the Grid Loop, and make it easily work for you. The following posts focus on customizing the Grid Loop for various post types, tags, categories, and other custom taxonomies.

post

How to Make a Genesis Grid Archive Template for Tags

To display posts from a specific tag or tags, you need to add a ‘tag’ argument to the $grid_args array.

In the StudioPress tutorial about categories, you are given this example for your home.php.

<?php
remove_action( 'genesis_loop', 'genesis_do_loop' );
add_action( 'genesis_loop', 'child_grid_loop_helper' );
/** Add support for Genesis Grid Loop **/
function child_grid_loop_helper() {
    if ( function_exists( 'genesis_grid_loop' ) ) {
        genesis_grid_loop( array(
            'features' => 2,
            'feature_image_size' => 0,
            'feature_image_class' => 'alignleft post-image',
            'feature_content_limit' => 0,
            'grid_image_size' => 'grid-thumbnail',
            'grid_image_class' => 'alignleft post-image',
            'grid_content_limit' => 0,
            'more' => __( '[Continue reading...]', 'genesis' ),
            'posts_per_page' => 6,
            'cat' => '6,7' //enter your category IDs here separated by commas in ' '
        ) );
    } else {
        genesis_standard_loop();
    }
}

/** Remove the post meta function for front page only **/
remove_action( 'genesis_after_post_content', 'genesis_post_meta' );

genesis();

Simply change the ‘cat’ argument to ‘tag’. And you can have the customization you want. OR, you can grab it dynamically by making the following changes:

<?php
remove_action( 'genesis_loop', 'genesis_do_loop' );
add_action( 'genesis_loop', 'child_grid_loop_helper' );
/** Add support for Genesis Grid Loop **/
function child_grid_loop_helper() {
    $term = get_query_var( 'term' );
    if ( function_exists( 'genesis_grid_loop' ) ) {
        genesis_grid_loop( array(
            'features' => 2,
            'feature_image_size' => 0,
            'feature_image_class' => 'alignleft post-image',
            'feature_content_limit' => 0,
            'grid_image_size' => 'grid-thumbnail',
            'grid_image_class' => 'alignleft post-image',
            'grid_content_limit' => 0,
            'more' => __( '[Continue reading...]', 'genesis' ),
            'posts_per_page' => 6,
            'tag' => $term
        ) );
    } else {
        genesis_standard_loop();
    }
}

/** Remove the post meta function for front page only **/
remove_action( 'genesis_after_post_content', 'genesis_post_meta' );

genesis();

You can save this as tag.php to make all of your tag archives as a grid. Or, you can simply apply this to a single tag by naming it tag-{SLUG}.php or tag-{ID}.php (see WordPress Codex for Tag Templates for more information).

post

How to Make a Custom Taxonomy Genesis Grid Archive Template

First, catch up on the Grid Loops by reading these posts:

Now, that you have a basic understanding of the Grid, let’s apply this to a custom taxonomy archives.

First, you need a new document saved as taxonomy-{taxName}.php (for more information, see the WordPress Codex). So if you have a custom taxonomy of “Book Type,” registered as ‘book_type,’ then the file name will be taxonomy-book_type.php.

Second, create the header, just like a page template. This is primarily for your organization and your information. So I just model it after the page template just to be consistent.

<?php
/*
Template Name: Book Type Taxonomy Archive
*/

Third, you want to set all your customizations like remove post meta, post info, page layout, etc.

Fourth, you want to include the Grid Looper Helper function. This is a standard protocol for the Genesis Grid Loop:

<?php

remove_action( 'genesis_loop', 'genesis_do_loop' );
add_action( 'genesis_loop', 'wps_grid_loop_helper' );
/** Add support for Genesis Grid Loop **/
function wps_grid_loop_helper() {
    global $grid_args, $post;
    $taxonomy = 'book_type'; //change me
    $term = get_query_var( 'term' );
    $term_obj = get_term_by( 'slug' , $term , $taxonomy );
    $cpt = 'wps_books'; //change me

    if ( function_exists( 'genesis_grid_loop' ) ) {
		$grid_args_tax = array(
			'features' => 0,
			'feature_image_size' => 'book_featured',
			'feature_image_class' => 'aligncenter post-image',
			'feature_content_limit' => 100,
			'grid_image_size' => 'book_thumb',
			'grid_image_class' => 'aligncenter post-image',
			'grid_content_limit' => 0,
			'more' => '',
			'posts_per_page' => 10,
			'post_type' => $cpt,
			'paged' => get_query_var('paged') ? get_query_var('paged') : 1,
			'tax_query' => array(
				array(
					'taxonomy' => $taxonomy,
					'field' => 'slug',
					'terms' => array( $term_obj->slug ),
				)
			)
		);

			printf('<h2 class="book-section"> %s Books</h2>' , $term_obj->name );
			genesis_grid_loop($grid_args_tax);
	} else {
		genesis_standard_loop();
	}
}

Now, this can be rather complicated and intimidating, so let me break this down for you. While everything is the same as the previous Grid posts, there is one major change and that is the ‘tax_query’ (WordPress Codex). But just for those readers, who didn’t take my advice to read the previous articles, let me briefly explain the $grid_args_tax (for those who know the basic args, skip the next paragraph).

‘features’ refers to the number of featured posts in the grid loop. So if you want to display 10 but feature 2, you would set this number to 2, posts_per_page to 10 and Genesis will do the math to ensure that everything is kosher. However, in our example, we want zero features for the taxonomy listing. ‘feature_image_size’ and ‘grid_image_size’ are the post thumbnail size that you want the image to appear as. ‘feature_image_class’ and ‘grid_image_class’ refer to the CSS image class for styling. ‘feature_content_limit’ and ‘grid_content_limit’ refers to the number of characters allowed in the content. See the StudioPress articles for futher explanations.

Now ‘tax_query’ refers to the taxonomy args. It must take an array of arrays of the following args:

  • taxonomy (string): the taxonomy
  • field (string): select taxonomy term by ‘id’ or ‘slug’
  • terms (int/string/array): taxonomy terms
  • operator (string): ‘IN’, ‘NOT IN’, ‘AND’

In our example, we have the template for a predetermined specific taxonomy and the template dynamically grabbing the appropriate taxonomy term (so someone may be searching for a ‘Fiction’ Book Type). If you wanted, it could also fetch the taxonomy dynamically, if you wanted all of your taxonomy archives to be on the grid. To do this, simply add the following code: $taxonomy = get_query_var( 'taxonomy' );. For tags and categories, you probably could use this same method; however, there is also a simpler method which I will explain in a later post (Tags and Same Categories and Different Categories).

So, after you set the post type (‘post’, ‘page’, or some other custom post type registered name, e.g., ‘wps_books’) and the taxonomy (which is the same as the latter half of the file name, so in this example ‘book_type’), the function first grabs the slug of the term: $term = get_query_var( 'term' ); (more information: get_query_var). Then it calls for the genesis custom grid loop.

Now obviously, with this custom post type, I am going to want to determine my own grid loop content. To do this, I simply make these additions:

 <?php
add_action('genesis_before_post', 'wps_custom_grid');
function wps_custom_grid() {
	remove_action('genesis_post_content', 'genesis_grid_loop_content');
	add_action('genesis_post_content', 'wps_grid_loop_content');
}

function wps_grid_loop_content() {
global $_genesis_loop_args, $wp_query;
//do something
}

For an excellent post on customizing the content, see Bill Erickson’s post, Customizing the Genesis Grid Loop Content.

Some other good grid functions include the following:

<?php
// Add some extra post classes to the grid loop so we can style the columns
add_filter( 'genesis_grid_loop_post_class', 'wps_grid_loop_post_class' );
/**
 * Add some extra body classes to grid posts.
 *
 * Change the $columns value to alter how many columns wide the grid uses.
 *
 * @author Gary Jones
 * @link http://dev.studiopress.com/genesis-grid-loop-advanced.htm
 *
 * @global array $_genesis_loop_args
 * @global integer $loop_counter
 * @param array $classes
 */
function wps_grid_loop_post_class( $grid_classes ) {
    global $_genesis_loop_args, $loop_counter;

    // Alter this number to change the number of columns - used to add class names
    $columns = 3;

    // Only want extra classes on grid posts, not feature posts
    if ( $loop_counter >= $_genesis_loop_args['features'] ) {

        // Add genesis-grid-column-? class to know how many columns across we are
        $grid_classes[] = sprintf( 'genesis-grid-column-%s', ( ( $loop_counter - $_genesis_loop_args['features'] ) % $columns ) + 1 );

        // Add size1of? class to make it correct width
        $grid_classes[] = sprintf( 'size1of%s', $columns );
    }
    return $grid_classes;
}

// Make sure the first page has a balanced grid
add_action( 'genesis_loop', 'wps_bal_grid_loop' );
function wps_bal_grid_loop() {
    global $query_string, $paged, $grid_args, $_genesis_loop_args;

    if ( 0 == $paged )
        // If first page, add number of features to grid posts, so balance is maintained
        $grid_args['posts_per_page'] += $grid_args['features'];
    else
        // Keep the offset maintained from our page 1 adjustment
        $grid_args['offset'] = ( $paged - 1 ) * $grid_args['posts_per_page'] + $grid_args['features'];
}
post

Genesis Grid Loop: How to Set Features to a Specific Category and Non-Features/Grid Posts to a Separate (Another) Category

In order to set your Genesis Grid Loop ‘features’, which are the number of posts that will show at the top of the page when using the Grid Loop, to one specific category or categories and the non-features or grid posts to another category or set of categories, you will need to adjust your grid_loop_helper function.

Here is a simple way of displaying posts via categories via the Grid loop calling genesis_grid_loop() twice.

function child_grid_loop_helper() {
    global $paged;
    if ( function_exists( 'genesis_grid_loop' ) ) {
        //set featured grid_args
        $grid_args_featured = array(
            'features' => 1,
            'feature_image_size' => 'child_full',
            'feature_image_class' => 'aligncenter post-image',
            'feature_content_limit' => 100,
            'grid_image_size' => 'child_thumb',
            'grid_image_class' => 'aligncenter post-image',
            'grid_content_limit' => 0,
            'more' => '',
            'posts_per_page' => 1,
            'post_type' => 'books_fbd',
            'cat' => '8',
            'paged' => $paged
        );
        //set non-featured grid_args
        $grid_args_rest = array(
            'features' => 0,
            'feature_image_size' => 'child_full',
            'feature_image_class' => 'aligncenter post-image',
            'feature_content_limit' => 100,
            'grid_image_size' => 'child_thumb',
            'grid_image_class' => 'aligncenter post-image',
            'grid_content_limit' => 0,
            'more' => '',
            'posts_per_page' => 4,
            'post_type' => 'books_fbd',
            'cat' => '7',
            'paged' => $paged
        );

        //assuming that features won't go beyond 1 page
        if ( ($grid_args_featured['paged'] > 1) || ($grid_args_past['paged'] > 1) )
            genesis_grid_loop( $grid_args_rest ); //do not show featured after page 1
        else {
            genesis_grid_loop( $grid_args_featured );
            genesis_grid_loop( $grid_args_rest );
        }

    } else {
        genesis_standard_loop();
    }
}  

However, I have posted on the StudioPress forums, which creates another argument for ‘features_cat’ suggesting some edits for the genesis_grid_loop() function.

post

How to Display Posts from a Specific Category using Genesis Grid Loop

To display posts from a specific category or categories, you need to add a ‘cat’ argument to the $grid_args array. StudioPress gives a good introductory tutorial, How to Use the Genesis Grid Loop, on how to set this up.

In the StudioPress tutorial, you are given this example for your home.php.

<?php
remove_action( 'genesis_loop', 'genesis_do_loop' );
add_action( 'genesis_loop', 'child_grid_loop_helper' );
/** Add support for Genesis Grid Loop **/
function child_grid_loop_helper() {
    if ( function_exists( 'genesis_grid_loop' ) ) {
        genesis_grid_loop( array(
            'features' => 2,
            'feature_image_size' => 0,
            'feature_image_class' => 'alignleft post-image',
            'feature_content_limit' => 0,
            'grid_image_size' => 'grid-thumbnail',
            'grid_image_class' => 'alignleft post-image',
            'grid_content_limit' => 0,
            'more' => __( '[Continue reading...]', 'genesis' ),
            'posts_per_page' => 6,
            'cat' => '6,7' //enter your category IDs here separated by commas in ' '
        ) );
    } else {
        genesis_standard_loop();
    }
}

/** Remove the post meta function for front page only **/
remove_action( 'genesis_after_post_content', 'genesis_post_meta' );

genesis();