|
<?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 ), '← 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 {current} of {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 →' ); |
|
} |
|
|
|
printf( '<span class="gv-entry-nav-item gv-entry-nav-item__next">%s</span>', $next_entry_link ); |
|
|
|
?> |
|
</nav> |
|
<?php |
|
} |