Custom Next and Previous Links

Auf aufgerufenen Seiten soll am Ende eine Navigation zur vorherigen und zur nächsten Seite angezeigt werden:

Sie Navigation soll sich der Menüordnung anpassen, die im WordPress Admincenter eingestellt werden kann:

Die vordefinierten Funktionen previous_post_link und next_post_link können diese Funktion leider nicht liefern.

Nutzung von Filter Hooks

Darum muss man sich mit sogenannten „Hooks“ weiterhelfen:

Hooks are a way for one piece of code to interact/modify another piece of code at specific, pre-defined spots. They make up the foundation for how plugins and themes interact with WordPress Core, but they’re also used extensively by Core itself.

https://developer.wordpress.org/plugins/hooks/

Für unser Beispiel nutzen wir einen Filter, der wenn aufgerufen, einen von uns erstellten Filter über die core Methode von WordPress schiebt. Hier ein Beispiel:

function wporg_filter_title( $title ) {
    return 'The ' . $title . ' was filtered';
}
add_filter( 'the_title', 'wporg_filter_title' );

Diesen „Filter“ kann man in functions.php einfügen und er macht Folgendes:

  • Wenn man den Seitentitel mit der Funktion „the_title()“ aufruft, wird dieser Filter aufgerufen
  • Es wird nicht nur der Titel der Seite zurückgegeben, sondern auch „The … was filtered.

Alle möglichen Filterparameter, wie hier „the_title“ kann man unter Plugin API/Filter Reference finden.

Eigenen Filter Hook bauen

Die Idee und der Code des Filters kommt von 1fix.io. Folgenden Code kann man in functions.php einfügen. Im Anschluss …

/**
 * custom page hooks for displaying next/previous posts by menu order
 */
function my_previous_post_where() {
	global $post, $wpdb;
	return $wpdb->prepare( "WHERE p.menu_order < %s AND p.post_type = %s AND p.post_parent = %s AND p.post_status = 'publish'", 
		$post->menu_order, $post->post_type, $post->post_parent);
}
// überschreibt "get_previous_post_where"
add_filter( 'get_previous_post_where', 'my_previous_post_where' );

function my_next_post_where() {
	global $post, $wpdb;
	return $wpdb->prepare( "WHERE p.menu_order > %s AND p.post_type = %s AND p.post_parent = %s AND p.post_status = 'publish'", 
		$post->menu_order, $post->post_type, $post->post_parent);
}
// überschreibt "get_next_post_where"
add_filter( 'get_next_post_where', 'my_next_post_where' );

function my_previous_post_sort() {
	return "ORDER BY p.menu_order desc LIMIT 1";
}
// überschreibt "get_previous_post_sort"
add_filter( 'get_previous_post_sort', 'my_previous_post_sort' );

function my_next_post_sort() {
	return "ORDER BY p.menu_order asc LIMIT 1";
}
// überschreibt "get_next_post_sort"
add_filter( 'get_next_post_sort', 'my_next_post_sort' );

Diese Filter testen nun immer, ob die Funktionen previous_post_link und next_post_link aufgerufen werden und filtern das Ergebnis entsprechend des oben erstellten Codes.

Hier z.B.: der Aufruf in page.php:

<div id="pageNavigationFooter">
    	<?php previous_post_link(); ?>    <?php next_post_link(); ?>
</div>

Links