Pagination Doesn't work with wordpress custom

2019-09-01 02:00发布

问题:

Pagination Doesn't work with word press custom post. i have tried these code below,but pagination doesn't appear. tried different query but no result. i am new in php and word press.i just copy and past code. can anyone please help me? what i have done so far are below.

in function.php

/*pagination*/  

function wpbeginner_numeric_posts_nav() {

    if( is_singular() )
        return;

    global $wp_query;

    /** Stop execution if there's only 1 page */
    if( $wp_query->max_num_pages <= 1 )
        return;

    $paged = get_query_var( 'paged' ) ? absint( get_query_var( 'paged' ) ) : 1;
    $max   = intval( $wp_query->max_num_pages );

    /** Add current page to the array */
    if ( $paged >= 1 )
        $links[] = $paged;

    /** Add the pages around the current page to the array */
    if ( $paged >= 3 ) {
        $links[] = $paged - 1;
        $links[] = $paged - 2;
    }

    if ( ( $paged + 2 ) <= $max ) {
        $links[] = $paged + 2;
        $links[] = $paged + 1;
    }

    echo '<div class="navigation"><ul>' . "\n";

    /** Previous Post Link */
    if ( get_previous_posts_link() )
        printf( '<li>%s</li>' . "\n", get_previous_posts_link() );

    /** Link to first page, plus ellipses if necessary */
    if ( ! in_array( 1, $links ) ) {
        $class = 1 == $paged ? ' class="active"' : '';

        printf( '<li%s><a href="%s">%s</a></li>' . "\n", $class, esc_url( get_pagenum_link( 1 ) ), '1' );

        if ( ! in_array( 2, $links ) )
            echo '<li>…</li>';
    }

    /** Link to current page, plus 2 pages in either direction if necessary */
    sort( $links );
    foreach ( (array) $links as $link ) {
        $class = $paged == $link ? ' class="active"' : '';
        printf( '<li%s><a href="%s">%s</a></li>' . "\n", $class, esc_url( get_pagenum_link( $link ) ), $link );
    }

    /** Link to last page, plus ellipses if necessary */
    if ( ! in_array( $max, $links ) ) {
        if ( ! in_array( $max - 1, $links ) )
            echo '<li>…</li>' . "\n";

        $class = $paged == $max ? ' class="active"' : '';
        printf( '<li%s><a href="%s">%s</a></li>' . "\n", $class, esc_url( get_pagenum_link( $max ) ), $max );
    }

    /** Next Post Link */
    if ( get_next_posts_link() )
        printf( '<li>%s</li>' . "\n", get_next_posts_link() );

    echo '</ul></div>' . "\n";

}

in custom post query

<?php
                            global $post;
                            $args = array( 'posts_per_page' => 5, 'post_type'=> 'latestnews');
                            $myposts = get_posts( $args );
                            foreach( $myposts as $post ) : setup_postdata($post); 
                        ?>
                        <div class="page_news">
                        <div class="single_page_news">
                            <h2><?php the_title(); ?><h2>
                            <p><?php the_content(); ?></p>
                        </div>
                        </div>
                        <?php endforeach; ?>

                        <?php wpbeginner_numeric_posts_nav(); ?>

please help me

回答1:

Use These code

$paged = ( get_query_var('page') ) ? get_query_var('page') :1;
$query = new WP_Query( array( 'posts_per_page' => 1,'paged' => $paged,'post_type' => 'achievements','orderby' => 'date', 'order' => 'ASC' ) );
while ( $query->have_posts() ) : $query->the_post();

endwhile;

Instead of

$args = array( 'posts_per_page' => 5, 'post_type'=> 'latestnews');
 $myposts = get_posts( $args );

Follow this link http://thenetapp.com/2014/01/how-to-list-wordpress-posts-with-pagination/



回答2:

Your pagination function is only set up for the default main query, not for a custom query.

Also, don't use get_posts for paginated queries. It it is nice function to use for a custom query, but it becomes a bummer to work with once you require pagination.

Rather use WP_Query for paginated queries, it is much easier to use.

Example:

$paged = (get_query_var(‘paged’)) ? get_query_var(‘paged’) :  1;

$args = array(
   'posts_per_page' => 1,
   'paged' => $paged,
   'post_type' => 'YOUR POST TYPE'
);

$q = new WP_Query($args);

if($q->have_post()) {
   while($q->have_posts()) {
     $q->the_post();

     //YOUR LOOP

   }
  //YOUR PAGINATION
}
wp_reset_postdata();

You can have a look at the codex for extra parameters.

You now need to change every instance of $wp_query in your pagination function to $q for it to work.

Just a point of note, you don't have to call the $post global

EDIT

From your comments, there is a much easier way to accomplish your goal without any custom query

This page is an archive page that is meant to display your custom post type latestnews. You can simply just rename your archive-custom.php to archive-latestnews.php. See the Template Hierarchy. Just make sure has_archive is set to true when you register your post type

You should also never shop the main query for a custom query on any type of archive page. It is always troublesome, as you can see. So, delete your custom query and replace it with the default query

This is all you should have in your archive page

if(have_post()) {
   while(have_posts()) {
     the_post();

     //YOUR LOOP

   }
  //YOUR PAGINATION
}

Just change all the instances of $q back to $wp_query again. Everything should work then

For extra info, you have to check out this post I've done on WPSE