Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@zackkatz
Last active May 24, 2023 18:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zackkatz/15556fc81029831bda066b7286d8478d to your computer and use it in GitHub Desktop.
Save zackkatz/15556fc81029831bda066b7286d8478d to your computer and use it in GitHub Desktop.
GravityView - Show Next/Prev Entry Navigation
<?php
/**
* ::WARNING::
* This is an early work-in-progress!
*
* There are known issues, namely: This works only with no search values for now.
* It supports sorting, but that's pretty much it. It hasn't been thoroughly tested!
* Use at your own risk.
*
* @license GPL-2.0+
*/
// If you want to not show before the entry details, add # to the beginning of the next line.
add_action( 'gravityview/template/before', 'gk_gravityview_entry_nav' );
// If you want to show after the entry details, remove the # from the beginning of the next line.
# add_action( 'gravityview/template/after', 'gk_gravityview_entry_nav' );
/**
* Display navigation to next/previous entry when applicable.
*
* @param \GV\Template_Context $context The context.
*/
function gk_gravityview_entry_nav( \GV\Template_Context $context ) {
if ( ! gravityview()->request->is_entry() ) {
return;
}
/** @var \GV\View $view */
$view = $context->view;
// Handle pagination. For now, we need to load all entries.
// This is massively inefficient but we'll improve this soon.
$view->settings->set( 'page_size', -1 );
$all_entries = $view->get_entries()->all();
$entry_count = $view->get_entries()->count();
$prev_entry = $next_entry = '';
$current_entry_position = 0;
foreach( $all_entries as $key => $query_entry ) {
if( $query_entry->ID == $context->entry->ID ) {
$current_entry_position = $key + 1;
/** @var \GV|\GV\GF_Entry $prev_entry */
$prev_entry = \GV\Utils::get( $all_entries, $key - 1, null );
/** @var \GV|\GV\GF_Entry $next_entry */
$next_entry = \GV\Utils::get( $all_entries, $key + 1, null );
break;
}
}
if( ! $prev_entry && ! $next_entry ) {
return;
}
?>
<style>
.gv-entry-nav-container {
display: flex;
margin: 2em 0;
clear: both;
justify-content: space-between;
}
.gv-entry-nav-item {
display: flex;
flex: 1;
flex-basis: 50%;
align-items: center;
}
.gv-entry-nav-item__prev {
justify-content: flex-start;
}
.gv-entry-nav-item__count {
justify-content: center;
}
.gv-entry-nav-item__next {
justify-content: flex-end;
}
.gv-entry-nav-item a {
border: 1px solid #ccc;
padding: .33em .66em;
border-radius: 5px;
}
</style>
<nav class="gv-entry-nav-container">
<?php
$prev_entry_link = '';
if ( $prev_entry ) {
$prev_entry_link = GVCommon::get_link_html( $prev_entry->get_permalink( $view ), '&larr; Previous Entry' );
}
printf( '<span class="gv-entry-nav-item gv-entry-nav-item__prev">%s</span>', $prev_entry_link );
if ( $entry_count && $current_entry_position ) {
printf( '<span class="gv-entry-nav-item gv-entry-nav-item__count">%s</span>', strtr( esc_html__( 'Entry&nbsp;{current}&nbsp;of&nbsp;{count}', 'gk-gravityview' ), [
'{current}' => '<strong>' . $current_entry_position . '</strong>',
'{count}' => '<strong>' . $entry_count . '</strong>',
] ) );
}
$next_entry_link = '';
if ( $next_entry ) {
$next_entry_link = GVCommon::get_link_html( $next_entry->get_permalink( $view ), 'Next Entry &rarr;' );
}
printf( '<span class="gv-entry-nav-item gv-entry-nav-item__next">%s</span>', $next_entry_link );
?>
</nav>
<?php
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment