Support » Developing with WordPress » Adding Numeric Pagination for Archive, Search and Index

  • Resolved kirasiris

    (@kirasiris)


    So I’m trying to build a pagination function which is supposed to work with three files index.php, search.php and search.php . The code that I currently have works with just index but I would like to make it compatible with both the archive and the search files.

    NOTE: I though that it could work by just adding the is_search(),etc but thats not the case; another question why do I have to use is_singular instead of is_home(which I tried but did not work)?

    
    function numeric_pagination() {
        if( is_singular() || is_search() || is_archive() && have_posts() )
            return;
        global $wp_query;
        /* Stop the code if there is only a single page 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 into 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 '<nav aria-label="pagination"><ul class="pagination">' . "\n";
        /*Display Previous Post Link */
        if ( get_previous_posts_link() )
            printf( '<li>%s</li>' . "\n", get_previous_posts_link() );
        /*Display Link to first page*/
        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 */
        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></nav>' . "\n";
    }
    

    Any idea about what I can do to improve the code?

    • This topic was modified 3 years ago by kirasiris.
Viewing 5 replies - 1 through 5 (of 5 total)
  • Michael

    (@alchymyth)

    this first line stops pagination to show for ‘singular’ and for ‘search’ and for ‘archive with posts’:

    if( is_singular() || is_search() || is_archive() && have_posts() )
            return;

    start by changing it to:

    if( is_singular() )
            return;

    on what other files are you trying to avoid the pagination?

    Thread Starter kirasiris

    (@kirasiris)

    I’m sorry I did not explain myself very clear. I’m not trying to avoid pagination,
    in fact I want to display it in index, archive and search

    Moderator bcworkz

    (@bcworkz)

    Your conditional is pretty much preventing pagination on almost anything by returning without doing anything if any one of those terms return true.

    Try inverting the conditional logic:

    if( !is_search() && !is_archive() || !have_posts() )
            return;

    I don’t think you want to use is_singular() as a condition for pagination. Singular pages have a different sort of pagination, such as next post or page-link (using <!--nextpage--> tag in content), not numeric pages of post listings.

    is_singluar() returns true for home pages, but also many other conditions. is_home() returns true when the blog index page is displayed. If you have a static front page, is_home() will not return true for that page, but is_front_page() will return true.

    Thread Starter kirasiris

    (@kirasiris)

    Yes, thank you I did not realize I was returning nothing in the function but thank you for helping. Yes, you were right about not wanting to use is_singular() but somehow it did not work before, now it does.

    Moderator bcworkz

    (@bcworkz)

    it did not work before, now it does.

    Caching. Blame it on caching. Every modern day coder gets thrown off once in a while by caching. At least that’s what I tell clients 😉

Viewing 5 replies - 1 through 5 (of 5 total)
  • The topic ‘Adding Numeric Pagination for Archive, Search and Index’ is closed to new replies.