Blätterfunktion für WordPress

Die Blätterfunkion/ Pagination auf Webseiten hat sich schon immer bewährt und wer mit WordPress arbeitet kennt das eine oder andere Plugin für diese Lösung. Oft kommen dabei viele Funktionen für das Einstellen mit und die brauche ich eher selten. Ich nutze daher eine eigene Lösung und die möchte hier vorstellen.


Die Blätterfunkion/ Pagination auf Webseiten hat sich schon immer bewährt und wer mit WordPress arbeitet kennt das eine oder andere Plugin für diese Lösung. Oft kommen dabei viele Funktionen für das Einstellen mit und die brauche ich eher selten. Ich nutze daher eine eigene Lösung und die möchte hier vorstellen, da sie nun auch mit Parametern umgehen kann und so sollte sie in vielen Bereichen einsetzbar sein. Sie kann natürlich beliebig angepasst und für die eigenen Zwecke verändert werden.
Eine schöne schlanke Alternative gibt ebenfalls bei Sergej zu finden und ein Blick lohnt sicher. Er stellt auch ein Beispiel für die Formatierung bereit.

Beispiel Screenshots

Die Funktion

Die folgende Funktion stellt den Kern da und kann als Plugin oder im Theme, in der functions.php abgelegt werden. Der Code-Abschnitt im Anschluss stellt die Möglichkeit der Anpassung via Hook da, so dass man auf die Parameter zugreifen kann.


function fb_paging_bar( $args = array() ) {
	
	$defaults = array(
		'range'           => 4,
		'custom_query'    => FALSE,
		'previous_string' => __( '«««', FB_GREYFOTO_TEXTDOMAIN ),
		'next_string'     => __( '»»»', FB_GREYFOTO_TEXTDOMAIN ),
		'view_fp'         => TRUE,
		'view_lp'         => TRUE,
		'before_output'   => '<div class="postlink">',
		'after_output'    => '</div>'
	);
	
	$args = wp_parse_args( 
		$args, 
		apply_filters( 'fb_paging_bar_defaults', $defaults )
	);
	
	$args['range'] = (int) $args['range'] - 1;
	if ( !$args['custom_query'] )
		$args['custom_query'] = @$GLOBALS['wp_query'];
	$count = (int) $args['custom_query']->max_num_pages;
	$page  = intval( get_query_var( 'paged' ) );
	$ceil  = ceil( $args['range'] / 2 );
	
	if ( $count <= 1 )
		return FALSE;
	
	if ( !$page )
		$page = 1;
	
	if ( $count > $args['range'] ) {
		if ( $page <= $args['range'] ) {
			$min = 1;
			$max = $args['range'] + 1;
		} elseif ( $page >= ($count - $ceil) ) {
			$min = $count - $args['range'];
			$max = $count;
		} elseif ( $page >= $args['range'] && $page < ($count - $ceil) ) {
			$min = $page - $ceil;
			$max = $page + $ceil;
		}
	} else {
		$min = 1;
		$max = $count;
	}
	
	$echo = '';
	$previous = intval($page) - 1;
	$previous = esc_attr( get_pagenum_link($previous) );
	if ( $previous && (1 != $page) )
		$echo .= '<a href="' . $previous . '" title="' . __( 'previous', FB_GREYFOTO_TEXTDOMAIN) . '">' . $args['previous_string'] . '</a>';
	$firstpage = esc_attr( get_pagenum_link(1) );
	
	if ( $args['view_fp'] && $firstpage && (1 != $page) )
		$echo .= '<a href="' . $firstpage . '">' . __( 'First', FB_GREYFOTO_TEXTDOMAIN ) . '</a>';
	
	if ( !empty($min) && !empty($max) ) {
		for( $i = $min; $i <= $max; $i++ ) {
			if ($page == $i) {
				$echo .= '<span class="active">' . str_pad( (int)$i, 2, '0', STR_PAD_LEFT ) . '</span>';
			} else {
				$echo .= sprintf( '<a href="%s">%002d</a>', esc_attr( get_pagenum_link($i) ), $i );
			}
		}
	}
	
	if ($args['view_lp']) {
		$lastpage = esc_attr( get_pagenum_link($count) );
		if ( $lastpage && ($count != $page) ) {
			$count = str_pad( (int)$count, 2, '0', STR_PAD_LEFT );
			$echo .= '<a href="' . $lastpage . '">' . __( 'Last', FB_GREYFOTO_TEXTDOMAIN ) . '(' . $count . ')' . '</a>';
		}
	}
	
	$next = intval($page) + 1;
	$next = esc_attr( get_pagenum_link($next) );
	if ($next && ($count != $page) )
		$echo .= '<a href="' . $next . '" title="' . __( 'next', FB_GREYFOTO_TEXTDOMAIN) . '">' . $args['next_string'] . '</a>';
	
	if ( isset($echo) )
		echo $args['before_output'] . $echo . $args['after_output'];
}

Im Template, wo die Pagination genutzt werden soll, wird einfach die Funktion aufgerufen:


<?php if ( function_exists('fb_paging_bar') ) fb_paging_bar(); ?>

Beispiel für Anpassungen

Für eigene Argumente steht ein Hook bereit und mittels diesem Hook kann jeder Parameter des Arrays $args angepasst werden.


function change_fb_paging_bar_defaults($args) {
	
	$args['previous_string'] = ''; // empty string
	$args['next_string'] = '';
	
	return $args;
}
add_filter('fb_paging_bar_defaults', 'change_fb_paging_bar_defaults');

Viel Freude damit und für Hinweise, Ideen und Verbesserungen bin ich wie immer dankbar.

Kommentare sind geschlossen.