pagination on custom post wp_query

前端 未结 4 1801
轻奢々
轻奢々 2020-12-01 14:40


        
相关标签:
4条回答
  • 2020-12-01 15:19

    There are 3 ways that I would suggest for pagination with a custom post wp_query. Unfortunately to this day there isn't a lot of good information about this out there, or at least what is out there is unclear in some cases. Hopefully this helps!

    Note, you also did have the wp_reset_postdata() in the wrong place, but even still more is needed to get it to work correctly.

    Option 1 - use max_num_pages variable

    <?php
        $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
        $args = array( 
            'posts_per_page' => 1, 
            'paged' => $paged, 
            'post_type' => 'cpt_type'
        );
        $cpt_query = new WP_Query($args);
    ?>
    
    <?php if ($cpt_query->have_posts()) : while ($cpt_query->have_posts()) : $cpt_query->the_post(); ?>
    
        //Loop Code Here...
    
    <?php endwhile; endif; ?>
    
    <nav>
        <ul>
            <li><?php previous_posts_link( '&laquo; PREV', $cpt_query->max_num_pages) ?></li> 
            <li><?php next_posts_link( 'NEXT &raquo;', $cpt_query->max_num_pages) ?></li>
        </ul>
    </nav>
    

    You'll see above, a slightly different format for previous_posts_link and next_posts_link which now access the max_num_pages variable. Be sure to use your own query variable name when accessing max_num_pages. Notice I use $cpt_query since that is the variable for my query example.

    Option 2 - temporarily use the $wp_query variable for your loop query

    This is what a lot of folks recommend, but be careful to asign the $wp_query variable to a temp variable and re-assign it or you will run in to all kinds of troubles. Which is why I recommend Option #1. As noted on CSS Tricks, you can do something like this:

    <?php 
      $temp = $wp_query; 
      $wp_query = null; 
      $wp_query = new WP_Query(); 
      $wp_query->query('showposts=6&post_type=news'.'&paged='.$paged); 
    
      while ($wp_query->have_posts()) : $wp_query->the_post(); 
    ?>
    
      <!-- LOOP: Usual Post Template Stuff Here-->
    
    <?php endwhile; ?>
    
    <nav>
        <?php previous_posts_link('&laquo; Newer') ?>
        <?php next_posts_link('Older &raquo;') ?>
    </nav>
    
    <?php 
      $wp_query = null; 
      $wp_query = $temp;  // Reset
    ?>
    

    Option 3 - use WP-pagenavi plugin

    Just as another option what you can do instead is use the WP-pagenavi plugin, and setup your query as in Option #1. But make one change in the code, remove everything within the element and replace with this function, once you have installed the plugin. So you'll end with:

    <nav>
        <?php wp_pagenavi( array( 'query' => $cpt_query ) ); ?>
    </nav>
    
    0 讨论(0)
  • 2020-12-01 15:25
    <?php    
    add_shortcode('show_all_news', 'show_all_news');
        function show_all_news($atts) {
            $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
            $limit = 4;
            $offset = ( $limit * $paged ) - $limit;
            $atts['pages'] = $paged; 
            $atts['post-type'] = 'your_custom_post_type'; 
            $atts['orderby'] = 'date'; 
            $atts['order'] = 'DESC';
            $atts['offset'] = $offset; 
            $atts['posts_per_page'] = $limit; 
            $atts['caller_get_posts'] = 1; 
    
            $result = new WP_Query($atts);
            echo '<div class="news-cont">';  
            if($result->have_posts())
            {
                while ($result->have_posts()) : $result->the_post(); 
                    echo '<div class="bg-white news-block">'; 
                    echo '<em class="date">'. get_the_date().'</em>' ?>
    
                    <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
                    <?php 
                    echo "<p>";
                    the_excerpt(); 
                    echo "</p>";
                    echo '</div>';
                endwhile;
    
                ?>
                    <ul class="pagination" style="width:100%;">
                        <li id="previous-posts" style="float:left">
                            <?php previous_posts_link( '<< Vorige Pagina', $result->max_num_pages ); ?>
                        </li>
                        <li id="next-posts" style="float:right">
                            <?php next_posts_link( 'Volgende Pagina >>', $result->max_num_pages ); ?>
                        </li>
                    </ul>
                <?php 
    
            }
            echo '</div>'; 
            wp_reset_query();
        }
    
    0 讨论(0)
  • 2020-12-01 15:29

    I think you put <?php wp_reset_query(); ?> in the wrong place.. shouldn't it be next or after pagination codes?

    something like this

    <?php endwhile; ?>
    <?php else: ?>
    <?php wp_reset_query(); ?>
    
    0 讨论(0)
  • 2020-12-01 15:39

    This question was answered very adequately by @Trevor but I needed to implement numbered pagination, and there was a bit more research to do. I hope my code helps others implement numbered pagination.

        <div class="frontpage-posts">
            <?php
            if (get_query_var('paged')) {
              $paged = get_query_var('paged');
            } elseif (get_query_var('page')) {
              $paged = get_query_var('page');
            } else {
              $paged = 1;
            }
            $temp = $wp_query;
            $wp_query = null;
            $wp_query = new WP_Query('posts_per_page=12&paged=' . $paged);
            if ($wp_query->have_posts()) :
              while ($wp_query->have_posts()) : $wp_query->the_post();
                echo the_title();
              endwhile; ?>
              <nav>
                <?php
                the_posts_pagination(array(
                  'mid_size'  => 2,
                  'prev_text' => __('Back', 'textdomain'),
                  'next_text' => __('Onward', 'textdomain'),
                ));
                ?>
              </nav>
            <?php
              $wp_query = null;
              $wp_query = $temp;
              wp_reset_postdata();
            endif;
            ?>
          </div>
    
    0 讨论(0)
提交回复
热议问题