Last active
December 14, 2015 19:19
-
-
Save csbeck/5136217 to your computer and use it in GitHub Desktop.
Advanced Custom Genesis Grid Template
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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, | |
// single pages and single attachments. | |
return ( ! is_singular() ); | |
} | |
/** | |
* 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' => 2, | |
'feature_content_limit' => 0, | |
'feature_image_size' => 'grid-feature-image', | |
'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' => 10, | |
); | |
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', 'fourth', '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; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment