Created
February 9, 2011 13:23
-
-
Save franz-josef-kaiser/818457 to your computer and use it in GitHub Desktop.
WordPress pretty Pagination with first/last, next/prev and range parameters above/below current page
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/* | |
Plugin Name: Easy Pagination Deamon | |
Plugin URI: http://wordpress.org/extend/plugins/stats/ | |
Description: Offers the deamon_pagination($range) template tag for a sematically correct pagination. | |
Author: Franz Josef Kaiser | |
Author URI: http://say-hello-code.com | |
Version: 0.1 | |
License: GPL v2 - http://www.gnu.org/licenses/old-licenses/gpl-2.0.html | |
Text Domain: pagination_deamon_lang | |
Copyright 20010-2011 by Franz Josef Kaiser | |
This program is free software; you can redistribute it and/or modify | |
it under the terms of the GNU General Public License as published by | |
the Free Software Foundation; either version 2 of the License, or | |
(at your option) any later version. | |
This program is distributed in the hope that it will be useful, | |
but WITHOUT ANY WARRANTY; without even the implied warranty of | |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
GNU General Public License for more details. | |
You should have received a copy of the GNU General Public License | |
along with this program; if not, write to the Free Software | |
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | |
*/ | |
// ========================================== | |
Styles see https://gist.github.com/818523 | |
// ========================================== | |
// Secure: don't load this file directly | |
if( !class_exists('WP') ) : | |
header( 'Status: 403 Forbidden' ); | |
header( 'HTTP/1.1 403 Forbidden' ); | |
exit(); | |
endif; | |
!defined('PAGE_LANG') ? define( 'PAGE_LANG', 'pagination_deamon_lang' ) : wp_die('The constant PAGE_LANG is already defined.'); | |
!defined('PAGE_VERSION') ? define( 'PAGE_VERSION', 0.1 ) : wp_die('The constant PAGE_VERSION is already defined.'); | |
!defined('PAGE_PATH') ? define( 'PAGE_PATH', trailingslashit(WP_PLUGIN_URL.'/'.str_replace(basename( __FILE__),"",plugin_basename(__FILE__))) ) : wp_die('The constant PAGE_PATH is already defined.'); | |
/** | |
* Register styles | |
*/ | |
if ( !is_admin() ) { | |
wp_register_style( 'pagination', PAGE_PATH.'pagination.css', false, PAGE_VERSION, 'screen' ); | |
} | |
if ( !function_exists('oxo_pagination_styles') ) : | |
/** | |
* Print styles | |
*/ | |
function oxo_pagination_styles() { | |
if ( !is_admin() ) | |
wp_print_styles('pagination'); | |
} | |
endif; | |
if ( !function_exists('oxo_pagination') ) : | |
/** | |
* Wordpress pagination for archives/search/etc. | |
* | |
* Semantically correct pagination inside an unordered list | |
* | |
* Displays: First « 1 2 3 4 » Last | |
* First/Last only appears if not on first/last page | |
* Shows next/previous links «/» | |
* Accepts a range attribute (default = 5) to adjust the number | |
* of direct page links that link to the pages above/below the current one. | |
* | |
* @param (int) $range | |
*/ | |
function oxo_pagination( $range = 5 ) { | |
// $paged - number of the current page | |
global $paged, $wp_query; | |
// How much pages do we have? | |
if ( !$max_page ) | |
$max_page = $wp_query->max_num_pages; | |
// We need the pagination only if there is more than 1 page | |
if ( $max_page > 1 ) | |
if ( !$paged ) $paged = 1; | |
echo "\n".'<ul class="pagination">'."\n"; | |
// On the first page, don't put the First page link | |
if ( $paged != 1 ) | |
echo '<li class="page-num page-num-first"><a href='.get_pagenum_link(1).'>'.__('First', PAGE_LANG).' </a></li>'; | |
// To the previous page | |
echo '<li class="page-num page-num-prev">'; | |
previous_posts_link(' « '); // « | |
echo '</li>'; | |
// We need the sliding effect only if there are more pages than is the sliding range | |
if ( $max_page > $range ) : | |
// When closer to the beginning | |
if ( $paged < $range ) : | |
for ( $i = 1; $i <= ($range + 1); $i++ ) { | |
$class = $i == $paged ? 'current' : ''; | |
echo '<li class="page-num"><a class="paged-num-link '.$class.'" href="'.get_pagenum_link($i).'"> '.$i.' </a></li>'; | |
} | |
// When closer to the end | |
elseif ( $paged >= ( $max_page - ceil($range/2)) ) : | |
for ( $i = $max_page - $range; $i <= $max_page; $i++ ){ | |
$class = $i == $paged ? 'current' : ''; | |
echo '<li class="page-num"><a class="paged-num-link '.$class.'" href="'.get_pagenum_link($i).'"> '.$i.' </a></li>'; | |
} | |
endif; | |
// Somewhere in the middle | |
elseif ( $paged >= $range && $paged < ( $max_page - ceil($range/2)) ) : | |
for ( $i = ($paged - ceil($range/2)); $i <= ($paged + ceil($range/2)); $i++ ) { | |
$class = $i == $paged ? 'current' : ''; | |
echo '<li class="page-num"><a class="paged-num-link '.$class.'" href="'.get_pagenum_link($i).'"> '.$i.' </a></li>'; | |
} | |
// Less pages than the range, no sliding effect needed | |
else : | |
for ( $i = 1; $i <= $max_page; $i++ ) { | |
$class = $i == $paged ? 'current' : ''; | |
echo '<li class="page-num"><a class="paged-num-link '.$class.'" href="'.get_pagenum_link($i).'"> '.$i.' </a></li>'; | |
} | |
endif; | |
// Next page | |
echo '<li class="page-num page-num-next">'; | |
next_posts_link(' » '); // » | |
echo '</li>'; | |
// On the last page, don't put the Last page link | |
if ( $paged != $max_page ) | |
echo '<li class="page-num page-num-last"><a href='.get_pagenum_link($max_page).'> '.__('Last', PAGE_LANG).'</a></li>'; | |
echo "\n".'</ul>'."\n"; | |
} | |
endif; | |
?> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment