Forums

Resetting Results of query_post (1 post)

  1. Tom Belknap
    Member
    Posted 2 years ago #

    OK, I think I understand the nature of the problem, but not the solution.

    I'm trying to create a contextual archive list: the next five posts and the previous five posts after the current post a visitor is viewing. Since there is no native WP function that will do this, I tried using query_posts to accomplish this task in the following way:

    function iabc_context_archive($current_post) {
    	global $wpdb;
    	if(is_single()) :
    		// get newer posts:
    		add_filter('posts_where', 'iabc_filterWhere_newer');
    		$newer = query_posts('showposts=5&sortby=data&sort=DESC');
    		remove_filter('posts_where', 'iabc_filterWhere_newer');
    		// get older posts:
    		add_filter('posts_where', 'iabc_filterWhere_older');
    		$older = query_posts('showposts=5&sortby=data&sort=ASC');
    		remove_filter('posts_where', 'iabc_filterWhere_older');
    		// merge returns into single array. Add the current post and mark it as such:
    		if($current_post) :
    			$current_post->thepost = 1;
    			$newer[] = $current_post;
    		endif;
    		$list = array_merge((array)$newer, (array)$older);
    	else:
    		// just get the latest posts
    		$list = get_posts('numberposts=5');
    	endif;
    	// Output:
    	print('<ul id="archive">');
    	foreach((array)$list as $next) :
    		$title = str_split($next->post_content, 40);
    		$next->thepost ? $class = ' class="current" ' : $class = '';
    		print('<li'.$class.'><a href="'.get_permalink($next->ID).'" title="'.$title[0].'">'.$title[0].'</a></li>');
    	endforeach;
    	print('</ul>');
    }
    
    function iabc_filterWhere_newer($where = '') {
    	global $post;
    	$where .= " AND post_date > '".$post->post_date."'";
    	return $where;
    }
    
    function iabc_filterWhere_older($where = '') {
    	global $post;
    	$where .= " AND post_date < '".$post->post_date."'";
    	return $where;
    }

    The problem I am finding is that the links don't work with this active. They go to the correct URL, but at that URL, WordPress seems to be pulling the wrong content: instead of grabbing post ID 21, it seems to be pulling post ID 12, which is the last published article on the site.

    I take this to mean that the posts_where is not getting reset from my last operation, even though I am removing the filter. I have no idea how to correct this problem, and would be very thankful for anyone who can provide a solution!

    An example of the problem can be seen here:
    http://iam.bit-character.com/archives/21
    Click on the plus sign fixed to the bottom right side of your browser window to see the list.

Topic Closed

This topic has been closed to new replies.

About this Topic