WordPress.org

Support

Support » Plugins and Hacks » WP-PageNavi » [Plugin: WP-PageNavi] Rel=Next Rel=Prev

[Plugin: WP-PageNavi] Rel=Next Rel=Prev

Viewing 5 replies - 1 through 5 (of 5 total)
  • I actually just implemented this for my site. I wrote an article about how you can do it here:
    http://www.timesocket.com/technology/adding-rel-prev-next-wp-paginavi/

    This should be implemented in the plugin in my opinion.

    Thanks for the reply!

    My code doesn’t look like that:

    <?php
    
    /**
     * Template tag: Boxed Style Paging
     *
     * @param array $args:
     *	'before': (string)
     *	'after': (string)
     *	'options': (string|array) Used to overwrite options set in WP-Admin -> Settings -> PageNavi
     *	'query': (object) A WP_Query instance
     */
    function wp_pagenavi( $args = array() ) {
    	if ( !is_array( $args ) ) {
    		$argv = func_get_args();
    		$args = array();
    		foreach ( array( 'before', 'after', 'options' ) as $i => $key )
    			$args[ $key ] = $argv[ $i ];
    	}
    
    	$args = wp_parse_args( $args, array(
    		'before' => '',
    		'after' => '',
    		'options' => array(),
    		'query' => $GLOBALS['wp_query'],
    		'type' => 'posts'
    	) );
    
    	extract( $args, EXTR_SKIP );
    
    	$options = wp_parse_args( $options, PageNavi_Core::$options->get() );
    
    	$instance = new PageNavi_Call( $args );
    
    	list( $posts_per_page, $paged, $total_pages ) = $instance->get_pagination_args();
    
    	if ( 1 == $total_pages && !$options['always_show'] )
    		return;
    
    	$pages_to_show = absint( $options['num_pages'] );
    	$larger_page_to_show = absint( $options['num_larger_page_numbers'] );
    	$larger_page_multiple = absint( $options['larger_page_numbers_multiple'] );
    	$pages_to_show_minus_1 = $pages_to_show - 1;
    	$half_page_start = floor( $pages_to_show_minus_1/2 );
    	$half_page_end = ceil( $pages_to_show_minus_1/2 );
    	$start_page = $paged - $half_page_start;
    
    	if ( $start_page <= 0 )
    		$start_page = 1;
    
    	$end_page = $paged + $half_page_end;
    
    	if ( ( $end_page - $start_page ) != $pages_to_show_minus_1 )
    		$end_page = $start_page + $pages_to_show_minus_1;
    
    	if ( $end_page > $total_pages ) {
    		$start_page = $total_pages - $pages_to_show_minus_1;
    		$end_page = $total_pages;
    	}
    
    	if ( $start_page < 1 )
    		$start_page = 1;
    
    	$out = '';
    	switch ( intval( $options['style'] ) ) {
    		// Normal
    		case 1:
    			// Text
    			if ( !empty( $options['pages_text'] ) ) {
    				$pages_text = str_replace(
    					array( "%CURRENT_PAGE%", "%TOTAL_PAGES%" ),
    					array( number_format_i18n( $paged ), number_format_i18n( $total_pages ) ),
    				$options['pages_text'] );
    				$out .= "<span class='pages'>$pages_text</span>";
    			}
    
    			if ( $start_page >= 2 && $pages_to_show < $total_pages ) {
    				// First
    				$first_text = str_replace( '%TOTAL_PAGES%', number_format_i18n( $total_pages ), $options['first_text'] );
    				$out .= $instance->get_single( 1, 'first', $first_text, '%TOTAL_PAGES%' );
    			}
    
    			// Previous
    			if ( $paged > 1 && !empty( $options['prev_text'] ) )
    				$out .= $instance->get_single( $paged - 1, 'previouspostslink', $options['prev_text'] );
    
    			if ( $start_page >= 2 && $pages_to_show < $total_pages ) {
    				if ( !empty( $options['dotleft_text'] ) )
    					$out .= "<span class='extend'>{$options['dotleft_text']}</span>";
    			}
    
    			// Smaller pages
    			$larger_pages_array = array();
    			if ( $larger_page_multiple )
    				for ( $i = $larger_page_multiple; $i <= $total_pages; $i+= $larger_page_multiple )
    					$larger_pages_array[] = $i;
    
    			$larger_page_start = 0;
    			foreach ( $larger_pages_array as $larger_page ) {
    				if ( $larger_page < ($start_page - $half_page_start) && $larger_page_start < $larger_page_to_show ) {
    					$out .= $instance->get_single( $larger_page, 'smaller page', $options['page_text'] );
    					$larger_page_start++;
    				}
    			}
    
    			if ( $larger_page_start )
    				$out .= "<span class='extend'>{$options['dotleft_text']}</span>";
    
    			// Page numbers
    			$timeline = 'smaller';
    			foreach ( range( $start_page, $end_page ) as $i ) {
    				if ( $i == $paged && !empty( $options['current_text'] ) ) {
    					$current_page_text = str_replace( '%PAGE_NUMBER%', number_format_i18n( $i ), $options['current_text'] );
    					$out .= "<span class='current'>$current_page_text</span>";
    					$timeline = 'larger';
    				} else {
    					$out .= $instance->get_single( $i, "page $timeline", $options['page_text'] );
    				}
    			}
    
    			// Large pages
    			$larger_page_end = 0;
    			$larger_page_out = '';
    			foreach ( $larger_pages_array as $larger_page ) {
    				if ( $larger_page > ($end_page + $half_page_end) && $larger_page_end < $larger_page_to_show ) {
    					$larger_page_out .= $instance->get_single( $larger_page, 'larger page', $options['page_text'] );
    					$larger_page_end++;
    				}
    			}
    
    			if ( $larger_page_out ) {
    				$out .= "<span class='extend'>{$options['dotright_text']}</span>";
    			}
    			$out .= $larger_page_out;
    
    			if ( $end_page < $total_pages ) {
    				if ( !empty( $options['dotright_text'] ) )
    					$out .= "<span class='extend'>{$options['dotright_text']}</span>";
    			}
    
    			// Next
    			if ( $paged < $total_pages && !empty( $options['next_text'] ) )
    				$out .= $instance->get_single( $paged + 1, 'nextpostslink', $options['next_text'] );
    
    			if ( $end_page < $total_pages ) {
    				// Last
    				$out .= $instance->get_single( $total_pages, 'last', $options['last_text'], '%TOTAL_PAGES%' );
    			}
    			break;
    
    		// Dropdown
    		case 2:
    			$out .= '<form action="" method="get">'."\n";
    			$out .= '<select size="1" onchange="document.location.href = this.options[this.selectedIndex].value;">'."\n";
    
    			foreach ( range( 1, $total_pages ) as $i ) {
    				$page_num = $i;
    				if ( $page_num == 1 )
    					$page_num = 0;
    
    				if ( $i == $paged ) {
    					$current_page_text = str_replace( '%PAGE_NUMBER%', number_format_i18n( $i ), $options['current_text'] );
    					$out .= '<option value="'.esc_url( $instance->get_url( $page_num ) ).'" selected="selected" class="current">'.$current_page_text."</option>\n";
    				} else {
    					$page_text = str_replace( '%PAGE_NUMBER%', number_format_i18n( $i ), $options['page_text'] );
    					$out .= '<option value="'.esc_url( $instance->get_url( $page_num ) ).'">'.$page_text."</option>\n";
    				}
    			}
    
    			$out .= "</select>\n";
    			$out .= "</form>\n";
    			break;
    	}
    	$out = $before . "<div class='wp-pagenavi'>\n$out\n</div>" . $after;
    
    	echo apply_filters( 'wp_pagenavi', $out );
    }
    
    class PageNavi_Call {
    
    	protected $args;
    
    	function __construct( $args ) {
    		$this->args = $args;
    	}
    
    	function __get( $key ) {
    		return $this->args[ $key ];
    	}
    
    	function get_pagination_args() {
    		global $numpages;
    
    		$query = $this->query;
    
    		switch( $this->type ) {
    		case 'multipart':
    			// Multipart page
    			$posts_per_page = 1;
    			$paged = max( 1, absint( get_query_var( 'page' ) ) );
    			$total_pages = max( 1, $numpages );
    			break;
    		case 'users':
    			// WP_User_Query
    			$posts_per_page = $query->query_vars['number'];
    			$paged = max( 1, floor( $query->query_vars['offset'] / $posts_per_page ) + 1 );
    			$total_pages = max( 1, ceil( $query->total_users / $posts_per_page ) );
    			break;
    		default:
    			// WP_Query
    			$posts_per_page = intval( $query->get( 'posts_per_page' ) );
    			$paged = max( 1, absint( $query->get( 'paged' ) ) );
    			$total_pages = max( 1, absint( $query->max_num_pages ) );
    			break;
    		}
    
    		return array( $posts_per_page, $paged, $total_pages );
    	}
    
    	function get_single( $page, $class, $raw_text, $format = '%PAGE_NUMBER%' ) {
    		if ( empty( $raw_text ) )
    			return '';
    
    		$text = str_replace( $format, number_format_i18n( $page ), $raw_text );
    
    		return "<a href='" . esc_url( $this->get_url( $page ) ) . "' class='$class'>$text</a>";
    	}
    
    	function get_url( $page ) {
    		return ( 'multipart' == $this->type ) ? get_multipage_link( $page ) : get_pagenum_link( $page );
    	}
    }
    
    # http://core.trac.wordpress.org/ticket/16973
    if ( !function_exists( 'get_multipage_link' ) ) :
    function get_multipage_link( $page = 1 ) {
    	global $post, $wp_rewrite;
    
    	if ( 1 == $page ) {
    		$url = get_permalink();
    	} else {
    		if ( '' == get_option('permalink_structure') || in_array( $post->post_status, array( 'draft', 'pending') ) )
    			$url = add_query_arg( 'page', $page, get_permalink() );
    		elseif ( 'page' == get_option( 'show_on_front' ) && get_option('page_on_front') == $post->ID )
    			$url = trailingslashit( get_permalink() ) . user_trailingslashit( $wp_rewrite->pagination_base . "/$page", 'single_paged' );
    		else
    			$url = trailingslashit( get_permalink() ) . user_trailingslashit( $page, 'single_paged' );
    	}
    
    	return $url;
    }
    endif;
    
    // Template tag: Drop Down Menu (Deprecated)
    function wp_pagenavi_dropdown() {
    	wp_pagenavi();
    }
    
    class PageNavi_Core {
    	static $options;
    
    	function init( $options ) {
    		self::$options = $options;
    
    		add_action( 'wp_print_styles', array( __CLASS__, 'stylesheets' ) );
    	}
    
    	function stylesheets() {
    		if ( !self::$options->use_pagenavi_css )
    			return;
    
    		if ( @file_exists( get_stylesheet_directory() . '/pagenavi-css.css' ) )
    			$css_file = get_stylesheet_directory_uri() . '/pagenavi-css.css';
    		elseif ( @file_exists( get_template_directory() . '/pagenavi-css.css' ) )
    			$css_file = get_template_directory_uri() . '/pagenavi-css.css';
    		else
    			$css_file = plugins_url( 'pagenavi-css.css', __FILE__ );
    
    		wp_enqueue_style( 'wp-pagenavi', $css_file, false, '2.70' );
    	}
    }

    Any ideas how I should modify mine? Yours looks different on the link.

    You only need to modify one function which is the get_single() function.

    Here is the full code for the core.php file:

    <?php
    
    /**
     * Template tag: Boxed Style Paging
     *
     * @param array $args:
     *      'before': (string)
     *      'after': (string)
     *      'options': (string|array) Used to overwrite options set in WP-Admin -> Settings -> PageNavi
     *      'query': (object) A WP_Query instance
     */
    function wp_pagenavi( $args = array() ) {
            if ( !is_array( $args ) ) {
                    $argv = func_get_args();
                    $args = array();
                    foreach ( array( 'before', 'after', 'options' ) as $i => $key )
                            $args[ $key ] = $argv[ $i ];
            }
    
            $args = wp_parse_args( $args, array(
                    'before' => '',
                    'after' => '',
                    'options' => array(),
                    'query' => $GLOBALS['wp_query'],
                    'type' => 'posts'
            ) );
    
            extract( $args, EXTR_SKIP );
    
            $options = wp_parse_args( $options, PageNavi_Core::$options->get() );
    
            $instance = new PageNavi_Call( $args );
    
            list( $posts_per_page, $paged, $total_pages ) = $instance->get_pagination_args();
    
            if ( 1 == $total_pages && !$options['always_show'] )
                    return;
    
            $pages_to_show = absint( $options['num_pages'] );
            $larger_page_to_show = absint( $options['num_larger_page_numbers'] );
            $larger_page_multiple = absint( $options['larger_page_numbers_multiple'] );
            $pages_to_show_minus_1 = $pages_to_show - 1;
            $half_page_start = floor( $pages_to_show_minus_1/2 );
            $half_page_end = ceil( $pages_to_show_minus_1/2 );
            $start_page = $paged - $half_page_start;
    
            if ( $start_page <= 0 )
                    $start_page = 1;
    
            $end_page = $paged + $half_page_end;
    
            if ( ( $end_page - $start_page ) != $pages_to_show_minus_1 )
                    $end_page = $start_page + $pages_to_show_minus_1;
    
            if ( $end_page > $total_pages ) {
                    $start_page = $total_pages - $pages_to_show_minus_1;
                    $end_page = $total_pages;
            }
    
            if ( $start_page < 1 )
                    $start_page = 1;
    
            $out = '';
            switch ( intval( $options['style'] ) ) {
                    // Normal
                    case 1:
                            // Text
                            if ( !empty( $options['pages_text'] ) ) {
                                    $pages_text = str_replace(
                                            array( "%CURRENT_PAGE%", "%TOTAL_PAGES%" ),
                                            array( number_format_i18n( $paged ), number_format_i18n( $total_pages ) ),
                                    $options['pages_text'] );
                                    $out .= "<span class='pages'>$pages_text</span>";
                            }
    
                            if ( $start_page >= 2 && $pages_to_show < $total_pages ) {
                                    // First
                                    $first_text = str_replace( '%TOTAL_PAGES%', number_format_i18n( $total_pages ), $options['first_text'] );
                                    $out .= $instance->get_single( 1, 'first', $first_text, '%TOTAL_PAGES%' );
                            }
    
                            // Previous
                            if ( $paged > 1 && !empty( $options['prev_text'] ) )
                                    $out .= $instance->get_single( $paged - 1, 'previouspostslink', $options['prev_text'] );
    
                            if ( $start_page >= 2 && $pages_to_show < $total_pages ) {
                                    if ( !empty( $options['dotleft_text'] ) )
                                            $out .= "<span class='extend'>{$options['dotleft_text']}</span>";
                            }
    
                            // Smaller pages
                            $larger_pages_array = array();
                            if ( $larger_page_multiple )
                                    for ( $i = $larger_page_multiple; $i <= $total_pages; $i+= $larger_page_multiple )
                                            $larger_pages_array[] = $i;
    
                            $larger_page_start = 0;
                            foreach ( $larger_pages_array as $larger_page ) {
                                    if ( $larger_page < ($start_page - $half_page_start) && $larger_page_start < $larger_page_to_show ) {
                                            $out .= $instance->get_single( $larger_page, 'smaller page', $options['page_text'] );
                                            $larger_page_start++;
                                    }
                            }
    
                            if ( $larger_page_start )
                                    $out .= "<span class='extend'>{$options['dotleft_text']}</span>";
    
                            // Page numbers
                            $timeline = 'smaller';
                            foreach ( range( $start_page, $end_page ) as $i ) {
                                    if ( $i == $paged && !empty( $options['current_text'] ) ) {
                                            $current_page_text = str_replace( '%PAGE_NUMBER%', number_format_i18n( $i ), $options['current_text'] );
                                            $out .= "<span class='current'>$current_page_text</span>";
                                            $timeline = 'larger';
                                    } else {
                                            $out .= $instance->get_single( $i, "page $timeline", $options['page_text'] );
                                    }
                            }
    
                            // Large pages
                            $larger_page_end = 0;
                            $larger_page_out = '';
                            foreach ( $larger_pages_array as $larger_page ) {
                                    if ( $larger_page > ($end_page + $half_page_end) && $larger_page_end < $larger_page_to_show ) {
                                            $larger_page_out .= $instance->get_single( $larger_page, 'larger page', $options['page_text'] );
                                            $larger_page_end++;
                                    }
                            }
    
                            if ( $larger_page_out ) {
                                    $out .= "<span class='extend'>{$options['dotright_text']}</span>";
                            }
                            $out .= $larger_page_out;
    
                            if ( $end_page < $total_pages ) {
                                    if ( !empty( $options['dotright_text'] ) )
                                            $out .= "<span class='extend'>{$options['dotright_text']}</span>";
                            }
    
                            // Next
                            if ( $paged < $total_pages && !empty( $options['next_text'] ) )
                                    $out .= $instance->get_single( $paged + 1, 'nextpostslink', $options['next_text'] );
    
                            if ( $end_page < $total_pages ) {
                                    // Last
                                    $out .= $instance->get_single( $total_pages, 'last', $options['last_text'], '%TOTAL_PAGES%' );
                            }
                            break;
    
                    // Dropdown
                    case 2:
                            $out .= '<form action="" method="get">'."\n";
                            $out .= '<select size="1" onchange="document.location.href = this.options[this.selectedIndex].value;">'."\n";
    
                            foreach ( range( 1, $total_pages ) as $i ) {
                                    $page_num = $i;
                                    if ( $page_num == 1 )
                                            $page_num = 0;
    
                                    if ( $i == $paged ) {
                                            $current_page_text = str_replace( '%PAGE_NUMBER%', number_format_i18n( $i ), $options['current_text'] );
                                            $out .= '<option value="'.esc_url( $instance->get_url( $page_num ) ).'" selected="selected" class="current">'.$current_page_text."</option>\n";
                                    } else {
                                            $page_text = str_replace( '%PAGE_NUMBER%', number_format_i18n( $i ), $options['page_text'] );
                                            $out .= '<option value="'.esc_url( $instance->get_url( $page_num ) ).'">'.$page_text."</option>\n";
                                    }
                            }
    
                            $out .= "</select>\n";
                            $out .= "</form>\n";
                            break;
            }
            $out = $before . "<div class='wp-pagenavi'>\n$out\n</div>" . $after;
    
            echo apply_filters( 'wp_pagenavi', $out );
    }
    
    class PageNavi_Call {
    
            protected $args;
    
            function __construct( $args ) {
                    $this->args = $args;
            }
    
            function __get( $key ) {
                    return $this->args[ $key ];
            }
    
            function get_pagination_args() {
                    global $numpages;
    
                    $query = $this->query;
    
                    switch( $this->type ) {
                    case 'multipart':
                            // Multipart page
                            $posts_per_page = 1;
                            $paged = max( 1, absint( get_query_var( 'page' ) ) );
                            $total_pages = max( 1, $numpages );
                            break;
                    case 'users':
                            // WP_User_Query
                            $posts_per_page = $query->query_vars['number'];
                            $paged = max( 1, floor( $query->query_vars['offset'] / $posts_per_page ) + 1 );
                            $total_pages = max( 1, ceil( $query->total_users / $posts_per_page ) );
                            break;
                    default:
                            // WP_Query
                            $posts_per_page = intval( $query->get( 'posts_per_page' ) );
                            $paged = max( 1, absint( $query->get( 'paged' ) ) );
                            $total_pages = max( 1, absint( $query->max_num_pages ) );
                            break;
                    }
    
                    return array( $posts_per_page, $paged, $total_pages );
            }
    
            function get_single( $page, $class, $raw_text, $format = '%PAGE_NUMBER%' ) {
                    if ( empty( $raw_text ) )
                            return '';
    
                    $text = str_replace( $format, number_format_i18n( $page ), $raw_text );
    
                    //return "<a href='" . esc_url( $this->get_url( $page ) ) . "' class='$class'>$text</a>";
    
                    if ( $class == "previouspostslink" ) { return "<link rel='prev' title='$text' href='" . esc_url( $this->get_url( $page ) ) . "' class='$class' />"; }
                    else if ( $class == "nextpostslink" ) { return "<link rel='next' title='$text' href='" . esc_url( $this->get_url( $page ) ) . "' class='$class' />"; }
                    else { return "<a href='" . esc_url( $this->get_url( $page ) ) . "' class='$class'>$text</a>"; }
            }
    
            function get_url( $page ) {
                    return ( 'multipart' == $this->type ) ? get_multipage_link( $page ) : get_pagenum_link( $page );
            }
    }
    
    # http://core.trac.wordpress.org/ticket/16973
    if ( !function_exists( 'get_multipage_link' ) ) :
    function get_multipage_link( $page = 1 ) {
            global $post, $wp_rewrite;
    
            if ( 1 == $page ) {
                    $url = get_permalink();
            } else {
                    if ( '' == get_option('permalink_structure') || in_array( $post->post_status, array( 'draft', 'pending') ) )
                            $url = add_query_arg( 'page', $page, get_permalink() );
                    elseif ( 'page' == get_option( 'show_on_front' ) && get_option('page_on_front') == $post->ID )
                            $url = trailingslashit( get_permalink() ) . user_trailingslashit( $wp_rewrite->pagination_base . "/$page", 'single_paged' );
                    else
                            $url = trailingslashit( get_permalink() ) . user_trailingslashit( $page, 'single_paged' );
            }
    
            return $url;
    }
    endif;
    
    // Template tag: Drop Down Menu (Deprecated)
    function wp_pagenavi_dropdown() {
            wp_pagenavi();
    }
    
    class PageNavi_Core {
            static $options;
    
            function init( $options ) {
                    self::$options = $options;
    
                    add_action( 'wp_print_styles', array( __CLASS__, 'stylesheets' ) );
            }
    
            function stylesheets() {
                    if ( !self::$options->use_pagenavi_css )
                            return;
    
                    if ( @file_exists( get_stylesheet_directory() . '/pagenavi-css.css' ) )
                            $css_file = get_stylesheet_directory_uri() . '/pagenavi-css.css';
                    elseif ( @file_exists( get_template_directory() . '/pagenavi-css.css' ) )
                            $css_file = get_template_directory_uri() . '/pagenavi-css.css';
                    else
                            $css_file = plugins_url( 'pagenavi-css.css', __FILE__ );
    
                    wp_enqueue_style( 'wp-pagenavi', $css_file, false, '2.70' );
            }
    }

    Hey There!
    Thank you so so much for helping me.

    When I use that code the << and >> just go away. I’m left with only numbers. I still see the code <link rel=”next… etc but there is no box with a << and >> in them to indicate left and right. Any idea why it might do that?
    Screen Shot:

    View post on imgur.com

    And here is what its supposed to look like:

    View post on imgur.com

    Not sure why your code on your blog is different and the one you gave me seems to be breaking something. Im using the latest version! Anyway.. thanks again.

    Looks like I overlooked that and the code wasn’t working properly. I did figure out how to fix it with but after reviewing http://googlewebmastercentral.blogspot.com/2011/09/pagination-with-relnext-and-relprev.html, I realized that the link rel tags must be placed in the <head> section of the page rather than the <body> so this would not be a good solution.

    I saw the following article http://yoast.com/rel-next-prev-paginated-archives/ and it looks like their SEO plugin has the ability to add these to the <head> section.

Viewing 5 replies - 1 through 5 (of 5 total)
  • The topic ‘[Plugin: WP-PageNavi] Rel=Next Rel=Prev’ is closed to new replies.
Skip to toolbar