morganestes
5/6/2015 - 5:17 AM

Traverse WordPress Search Results

Traverse WordPress Search Results

<?php
/**
 * Return search array
 */
function loopconf_search_array( $search_hash ) {
		
	// check for existence of unique transient
	if ( false === ( $search_array = get_transient( 'loopconf_search_' . $search_hash  ) ) ) {
	
		global $wpdb;
		
		$posts = $wpdb->get_results( $GLOBALS['wp_query']->request );

		$search_array = array();

		if ( false === empty( $posts ) ) {
			foreach ( $posts as $post ) {
				$search_array[] = $post->ID;
			}
		}			
			
		// save the transient for 10 minutes
		set_transient( 'loopconf_search_' . $search_hash, $search_array, MINUTE_IN_SECONDS * 10 );
	}
	
	return $search_array;
}

/**
 * Set session search_string
 */
function loopconf_set_search_string() {
	global $wp_query;
	
	$wp_session = WP_Session::get_instance();
	
	// if we’re on a search page, save the search data
	if ( !is_admin() && is_search()	&& isset( $wp_query->query_vars_hash ) ) {
		$search_string 			= $wp_query->query['s'];
		$search_hash			= $wp_query->query_vars_hash;
		$wp_session['search_string']	= $search_string;
		$wp_session['search_hash']	= $search_hash;
		$wp_session['search_array']	= loopconf_search_array( $search_hash );
	}
	
	// if we’re anywhere else, clear the search data
	if ( !is_admin() && !is_search() && !is_single() && is_main_query() ) {
		$wp_session['search_string'] = 
		$wp_session['search_hash']   = 
		$wp_session['search_array']  = null;
	}
}
add_action( 'pre_get_posts', 'loopconf_set_search_string' );

/**
 * Get the next or previous post in the array
 */
function loopconf_get_next_search_result( $next = true ) {
	
	$wp_session = WP_Session::get_instance();
	
	// make sure there’s a search saved in the session
	if ( isset( $wp_session['search_array'] ) === false ) {
		return false;
	}
	
	// set variables
	$next_key = 0;
	$search_array = $wp_session['search_array']->toArray();
	$current_key = array_search( get_the_ID(), $search_array );
	
	// get next or previous location in the array
	if ( $next === true ) {
		$next_key = $current_key + 1;
		if ( isset( $search_array[$next_key] ) === false ) {
			$next_key = 0;
		}
	} else {
		$next_key = $current_key - 1;
		if ( isset( $search_array[$next_key] ) === false ) {
			end( $search_array );
			$next_key = key( $search_array );
		}
	}
	
	// return value from that location
	return $search_array[$next_key];
}
?>

<?php
$prev_url = $next_url = false;

// get next and prev search results or just the links
if ( loopconf_get_next_search_result() ) {
	$wp_session = WP_Session::get_instance();
	$prev_url = get_permalink( loopconf_get_next_search_result() );																    false ) );
	$next_url = get_permalink( loopconf_get_next_search_result() );

} else {
	$prev_url = get_previous_post();
	$next_url = get_next_post();
}
?>

<div class="single-nav">
	<a href="<?php echo esc_url( $prev_url ); ?>" class="prev">Previous</a>
	<a href="<?php echo esc_url( $next_url ); ?>" class="next">Next</a>
</div>