<?php /** * Possibly amend the loop. * * Specify the conditions under which the grid loop should be used. * * @author Bill Erickson * @author Gary Jones * @link http://code.garyjones.co.uk/genesis-grid-loop-advanced/ * * @return boolean Return true of doing the grid loop, false if not. */ function child_is_doing_grid_loop() { // Amend this conditional to pick where this grid looping occurs // This says to use the grid loop everywhere except single posts and pages return ( ! is_single() && ! is_page() ); } /** * Grid Loop Arguments * * Specify all the desired grid loop and query arguments * * @author Bill Erickson * @author Gary Jones * @link http://code.garyjones.co.uk/genesis-grid-loop-advanced/ * * @return array $arguments */ function child_grid_loop_arguments() { $grid_args = array( 'features' => 1, 'feature_content_limit' => 0, 'feature_image_size' => 0, 'feature_image_class' => 'alignleft post-image', 'grid_content_limit' => 0, 'grid_image_size' => 'grid-thumbnail', 'grid_image_class' => 'alignleft post-image', 'more' => __( 'Continue reading →', 'genesis' ), ); $query_args = array( 'posts_per_page' => 6, ); return array( 'grid_args' => $grid_args, 'query_args' => $query_args, ); } add_action( 'genesis_before_loop', 'child_prepare_grid_loop' ); /** * Prepare Grid Loop. * * Swap out the standard loop with the grid and apply classes. * * @author Gary Jones * @author Bill Erickson * @link http://code.garyjones.co.uk/genesis-grid-loop-advanced/ */ function child_prepare_grid_loop() { if ( child_is_doing_grid_loop() ) { // Remove the standard loop remove_action( 'genesis_loop', 'genesis_do_loop' ); // Use the prepared grid loop add_action( 'genesis_loop', 'child_do_grid_loop' ); // Add some extra post classes to the grid loop so we can style the columns add_filter( 'genesis_grid_loop_post_class', 'child_grid_loop_post_class' ); } } add_action( 'pre_get_posts', 'child_grid_query' ); /** * Grid query to get the posts that will appear in the grid. * * Any changes to the actual query (posts per page, category…) should be here. * * @author Bill Erickson * @author Gary Jones * @link http://code.garyjones.co.uk/genesis-grid-loop-advanced/ * * @param WP_Query $query */ function child_grid_query( $query ) { // Only apply to main query, if this matches our grid query conditional, and if it isn't in the back-end if ( $query->is_main_query() && child_is_doing_grid_loop() && ! is_admin() ) { // Get all arguments $args = child_grid_loop_arguments(); // Don't edit below, this does the logic to figure out how many posts on each page $posts_per_page = $args['query_args']['posts_per_page']; $features = $args['grid_args']['features']; $offset = 0; $paged = $query->query_vars['paged']; if ( 0 == $paged ) // If first page, add number of features to grid posts, so balance is maintained $posts_per_page += $features; else // Keep the offset maintained from our page 1 adjustment $offset = ( $paged - 1 ) * $posts_per_page + $features; $query->set( 'posts_per_page', $posts_per_page ); $query->set( 'offset', $offset ); } } /** * Prepare the grid loop. * * Only use grid-specific arguments. All query args should be done in the * child_grid_query() function. * * @author Gary Jones * @author Bill Erickson * @link http://code.garyjones.co.uk/genesis-grid-loop-advanced/ * * @uses genesis_grid_loop() Requires Genesis 1.5 * * @global WP_Query $wp_query Post query object. */ function child_do_grid_loop() { global $wp_query; // Grid specific arguments $all_args = child_grid_loop_arguments(); $grid_args = $all_args['grid_args']; // Combine with original query $args = array_merge( $wp_query->query_vars, $grid_args ); // Create the Grid Loop genesis_grid_loop( $args ); } /** * Add some extra body classes to grid posts. * * Change the $columns value to alter how many columns wide the grid uses. * * @author Gary Jones * @author Bill Erickson * @link http://code.garyjones.co.uk/genesis-grid-loop-advanced/ * * @global array $_genesis_loop_args * @global integer $loop_counter * * @param array $grid_classes */ function child_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; // Be able to convert the number of columns to the class name in Genesis $fractions = array( '', 'half', 'third', 'quarter', 'fifth', 'sixth' ); // Only want extra classes on grid posts, not feature posts if ( $loop_counter >= $_genesis_loop_args['features'] ) { // Make a note of which column we're in $column_number = ( ( $loop_counter - $_genesis_loop_args['features'] ) % $columns ) + 1; // Add genesis-grid-column-? class to know how many columns across we are $grid_classes[] = sprintf( 'genesis-grid-column-%d', $column_number ); // Add one-* class to make it correct width $grid_classes[] = sprintf( 'one-' . $fractions[$columns - 1], $columns ); // Add a class to the first column, so we're sure of starting a new row with no padding-left if ( 1 == $column_number ) $grid_classes[] = 'first'; } return $grid_classes; }