WordPress.org

Ready to get started?Download WordPress

Forums

WP-Paginate
WP-Paginate and custom queries (17 posts)

  1. s.pescina
    Member
    Posted 2 years ago #

    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/

  2. coders4hire
    Member
    Posted 2 years ago #

    This is a great solution... needs to be added!

  3. Trev Wilcox
    Member
    Posted 2 years ago #

    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!

  4. s.pescina
    Member
    Posted 2 years ago #

    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

  5. Trev Wilcox
    Member
    Posted 2 years ago #

    Thank you!

  6. Trev Wilcox
    Member
    Posted 2 years ago #

    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.

  7. s.pescina
    Member
    Posted 2 years ago #

    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.

  8. Trev Wilcox
    Member
    Posted 2 years ago #

    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!

  9. Jameson Proctor
    Member
    Posted 1 year ago #

    @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.

  10. s.pescina
    Member
    Posted 1 year ago #

    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.

  11. Trev Wilcox
    Member
    Posted 1 year ago #

    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!

  12. s.pescina
    Member
    Posted 1 year ago #

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

    bye

  13. Trev Wilcox
    Member
    Posted 1 year ago #

    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!

  14. s.pescina
    Member
    Posted 1 year ago #

    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

  15. Trev Wilcox
    Member
    Posted 1 year ago #

    I love you :)

    Thank you!

  16. jamesckemp
    Member
    Posted 1 year ago #

    Great solution. Works very well now.

  17. codepixelzmedia
    Member
    Posted 1 year ago #

    hi guys, I tried what has been posted here but it didn't help. could you see through it.
    Here's my code

    <?php
    		//wp_reset_query();
    		$current_page = (get_query_var('paged')) ? get_query_var('paged') : 1;
    		$query = new WP_Query( 'category_name=news&posts_per_page=10&paged='.$current_page );
    		if ($query->have_posts()) : while ($query->have_posts()) : $query->the_post(); ?>
     <h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3>
     <?php comments_number( '0 comments', '1 response', '% responses' ); ?> | <?php the_time('M j Y') ?><br />
     Posted in: <?php
    $categories = get_the_category();
    $separator = ', ';
    $output = '';
    if($categories){
    	foreach($categories as $category) {
    		$output .= '<a href="'.get_category_link( $category->term_id ).'" title="' . esc_attr( sprintf( __( "View all posts in %s" ), $category->name ) ) . '">'.$category->cat_name.'</a>'.$separator;
    	}
    echo trim($output, $separator);
    }
    ?>
      <?php the_excerpt();?>
      <hr />
     	<?php endwhile;
    	?>
    
        <?php
    	 else: ?>
    
    	<?php endif; ?>
    	<div class="navigation">
    			<?php if(function_exists('wp_paginate')) {
        wp_paginate(false,$query);
    } ?>

    The pagination does not show up

Topic Closed

This topic has been closed to new replies.

About this Plugin

About this Topic

Tags

No tags yet.