Support » Plugin: WP-Paginate » WP-Paginate and custom queries

  • Hi Eric.

    I would like to know if you are planning to upgrade your plugin in order to make it fully functional with custom queries.

    I’m using it in a page where I have only one main custom loop and it doesn’t work. Simply it considers the main default query instead of mine so posts_per_page value that the paginate method uses is the default one.

    I’ve resolved adding an optional second parameter called $custom_query to the WP_Paginate function and to the paginate method. In case the var is passed I use the $custom_query->query_vars array to get right values.

    Let me know if this could be a permanent upgrade for your plugin.

    Bye.
    Simone

    http://wordpress.org/extend/plugins/wp-paginate/

Viewing 15 replies - 1 through 15 (of 16 total)
  • This is a great solution… needs to be added!

    This is the trouble I’m having now – but the above is like a foreign language to me. Could you let me know the code?

    Thank you!

    These are the changes I made in wp-paginate.php

    /**
     * Pagination based on options/args
     */
    function paginate($args = false,$wp_query = false) {
    	if ($this->type === 'comments' && !get_option('page_comments'))
    		return;
    
    	$r = wp_parse_args($args, $this->options);
    	extract($r, EXTR_SKIP);
    
    	if (!isset($page) && !isset($pages)) {
    
    		if ($this->type === 'posts') {
    			if(!$wp_query){
    				global $wp_query;
    				$posts_per_page = get_query_var('posts_per_page');
    				$page = get_query_var('paged');
    			} else {
    				$posts_per_page = $wp_query->query_vars['posts_per_page'];
    				$page = $wp_query->query_vars['paged'];
    			}
    			$pages = intval(ceil($wp_query->found_posts / $posts_per_page));
    		}
    		else {
    			$page = get_query_var('cpage');
    			$comments_per_page = get_option('comments_per_page');
    			$pages = get_comment_pages_count();
    		}
    		$page = !empty($page) ? intval($page) : 1;
    	}
    
    	$prevlink = ($this->type === 'posts')
    		? esc_url(get_pagenum_link($page - 1))
    		: get_comments_pagenum_link($page - 1);
    	$nextlink = ($this->type === 'posts')
    		? esc_url(get_pagenum_link($page + 1))
    		: get_comments_pagenum_link($page + 1);
    
    	$output = stripslashes($before);
    	if ($pages > 1) {
    		$output .= sprintf('<ol class="wp-paginate%s">', ($this->type === 'posts') ? '' : ' wp-paginate-comments');
    		$output .= sprintf('<li><span class="title">%s</span></li>', stripslashes($title));
    		$ellipsis = "<li><span class='gap'>...</span></li>";
    
    		if ($page > 1 && !empty($previouspage)) {
    			$output .= sprintf('<li><a href="%s" class="prev">%s</a></li>', $prevlink, stripslashes($previouspage));
    		}
    
    		$min_links = $range * 2 + 1;
    		$block_min = min($page - $range, $pages - $min_links);
    		$block_high = max($page + $range, $min_links);
    		$left_gap = (($block_min - $anchor - $gap) > 0) ? true : false;
    		$right_gap = (($block_high + $anchor + $gap) < $pages) ? true : false;
    
    		if ($left_gap && !$right_gap) {
    			$output .= sprintf('%s%s%s',
    				$this->paginate_loop(1, $anchor),
    				$ellipsis,
    				$this->paginate_loop($block_min, $pages, $page)
    			);
    		}
    		else if ($left_gap && $right_gap) {
    			$output .= sprintf('%s%s%s%s%s',
    				$this->paginate_loop(1, $anchor),
    				$ellipsis,
    				$this->paginate_loop($block_min, $block_high, $page),
    				$ellipsis,
    				$this->paginate_loop(($pages - $anchor + 1), $pages)
    			);
    		}
    		else if ($right_gap && !$left_gap) {
    			$output .= sprintf('%s%s%s',
    				$this->paginate_loop(1, $block_high, $page),
    				$ellipsis,
    				$this->paginate_loop(($pages - $anchor + 1), $pages)
    			);
    		}
    		else {
    			$output .= $this->paginate_loop(1, $pages, $page);
    		}
    
    		if ($page < $pages && !empty($nextpage)) {
    			$output .= sprintf('<li><a href="%s" class="next">%s</a></li>', $nextlink, stripslashes($nextpage));
    		}
    		$output .= "</ol>";
    	}
    	$output .= stripslashes($after);
    
    	if ($pages > 1 || $empty) {
    		echo $output;
    	}
    }

    and

    /**
     * Pagination function to use for posts
     */
    function wp_paginate($args = false,$wp_query = false) {
    	global $wp_paginate;
    	$wp_paginate->type = 'posts';
    	return $wp_paginate->paginate($args,$wp_query);
    }

    Then in my theme files I used plugin function in this way:

    $custom_query = new WP_Query([***your custom query here***]);
    wp_paginate(false,$custom_query);

    Hope this helps.
    Bye

    Thank you!

    I’m almost there.

    My current theme file runs the custom query as follows:

    <?php $my_query = new WP_Query('category_name=news&posts_per_page=5');
      while ($my_query->have_posts()) : $my_query->the_post();
      $do_not_duplicate = $post->ID; ?>
    
                <h1><?php the_title(); ?></h1>
    
                <?php the_content(); ?>
    
                <?php endwhile; ?>
    
    <?php if(function_exists('wp_paginate')) { wp_paginate(); } ?>

    In order to put the pagination at the bottom, I replaced the final line with

    <?php $custom_query = new WP_Query('category_name=news&posts_per_page=5');
    wp_paginate(false,$custom_query); ?>

    Such that the whole thing then looks like:

    <?php $my_query = new WP_Query('category_name=news&posts_per_page=5');
      while ($my_query->have_posts()) : $my_query->the_post();
      $do_not_duplicate = $post->ID; ?>
    
                <h1><?php the_title(); ?></h1>
    
                <?php the_content(); ?>
    
                <?php endwhile; ?>
    
    <?php $custom_query = new WP_Query('category_name=news&posts_per_page=5');
    wp_paginate(false,$custom_query); ?>

    This results in the pagination being placed correctly, but not functioning correctly. When I click on the second and third pages etc, the content from the first page still shows and the pagination markers do not change [color] accordingly either. The URL does change however to indicate the page, appending /page/2/, etc.

    Obviously this must be due to running the query twice, but how would I amend the above in that light?

    Thanks for your patience and assistance.

    I think you only have to append the page number to your custom query.
    With get_query_var function you can take page parameter passed to the page by the url.

    $current_page = (get_query_var('paged')) ? get_query_var('paged') : 1;
    $my_query = new WP_Query('category_name=news&posts_per_page=5&paged='.$current_page);

    Wp-paginate takes only care of the navigation system. The plugin doesn’t do nothing on the query wp executes so you have to built it by yourself.

    Beautiful! That works! Now there’s only one more small thing – the page number boxes don’t change color to indicate the current page, e.g. All the non active / non current pages have a grey background, and the active/current one has a red background. When I click on page 2, for example, content changes properly now, but it is still page 1 that is red.

    I hope that makes sense. Thank you so much for all your help – could you please help with this one last thing?

    Thank you!

    @s.pescina This is a great solution for this problem. Have you considered branching WP-Paginate to incorporate this functionality? If you have no plans to do so, let me know and I’ll try to ind te time to do so myself.

    Hi Jameson.
    No, I didn’t plan anything. I don’t know how to work in this open source situations… Are there any rules to follow?

    Anyway, I don’t think to have the time for this right now, so you can do whatever you want.

    Only try to keep open this thread, please.
    Thank you.

    Hi s.pescina

    Here is a sample of where I have used a custom query and your solution above with wp-paginate.

    http://designarmoury.com/stg/army/testimonials/

    When changing page, the color of the page indicating that it is the current page doesn’t change. Whether I am on page 2, 3 etc, it is always page 1 which is red.

    How can I fix this please?

    Thank you!

    please post here your template code so I can figure out what’s the problem.

    bye

    Template code is like this:

    <?php $current_page = (get_query_var('paged')) ? get_query_var('paged') : 1; $my_query = new WP_Query('category_name=testimonials&posts_per_page=5&paged='.$current_page);
      while ($my_query->have_posts()) : $my_query->the_post();
      $do_not_duplicate = $post->ID; ?>
    
                <h1><?php the_title(); ?></h1>
    			<?php include('meta.php'); ?>
    
                <?php the_content(); ?>
    
                <img style="margin-top:10px;" src="<?php bloginfo('template_url'); ?>/images/divider.png" />
                <?php endwhile; ?>
    
    <?php $custom_query = new WP_Query('category_name=testimonials');
    wp_paginate(false,$custom_query); ?>

    Thanks!

    You have 2 custom queries and the one you are passing to the wp_paginate function doesn’t have the paged var.

    It seems to me you have to simply delete the second last line and then call wp_paginate(false,$my_query);

    let me know

    bye

    I love you 🙂

    Thank you!

    Great solution. Works very well now.

Viewing 15 replies - 1 through 15 (of 16 total)
  • The topic ‘WP-Paginate and custom queries’ is closed to new replies.