Für manche Anforderungen muss das Standardverhalten der WordPress Installation geändert werden. So ist eine Sortierung der Artikel nach Veröffentlichungsdatum nicht immer erwünscht. Daher möchte ich euch in diesem Artikel eine Möglichkeit vorstellen, wie ihr die Artikel eures Blogs anhand von Werten aus einem Custom Field sortieren könnt.

Wie im vorherigen Artikel erwähnt, arbeite ich zurzeit an einem Projekt, bei dem eine WordPress Instanz als Backend für eine Facebook-Fanpage verwendet wird. Eine Anforderung bei diesem Projekt war, dass die Artikel nach einem individuellen Wert sortiert werden. Dieser Wert kann bei jedem Artikel hinterlegt werden. Dazu drängt sich ein Custom Field als Grundlage geradezu auf.

Um eine Sortierung nach Custom Field Values zu erreichen, sollte folgender PHP-Quellcode in die functions.php eingefügt werden. Die functions.php befindet sich im Theme-Verzeichnis eures aktivierten Themes.

// Posts Sortierung nach Custom Field Values  
add_filter('posts_join', 'add_join' );
function add_join($pjoin){	
	global $wpdb;
	$pjoin .= "LEFT JOIN (
    SELECT *
    FROM $wpdb->postmeta
    WHERE meta_key =  'prioritaet' ) AS postmeta ON $wpdb->posts.ID = postmeta.post_id";

	return ($pjoin);
}

add_filter('posts_orderby', 'change_sortorder' );
function change_sortorder( $orderby ){
	global $wpdb;
	$orderby = "postmeta.meta_value+0 DESC";	
 	return $orderby;
}

Mit Hilfe dieser zwei Funktionen werden die Ergebnisse nach dem Wert des benutzerdefinierten Feldes prioritaet sortiert. Die erste Funktion, add_join erweitert die Abfrage der Artikel um ein JOIN auf die Postmeta Datenbanktabelle. Die Funktion wird mit Hilfe von add_filter an der Filter-Action post_join registriert.

Mit der Angabe meta_key = ‚prioritaet‘ wird das entsprechende Custom Field angebeben, dass später zur Sortierung genutzt werden soll.

Die zweite Funktion, change_sortorder wird ebenfalls mit add_filter an einer bestimmten Filter-Action, post_order, angehängt. Diese Funktion ändert die Sortierung der Artikel, mit der Angabe von postmeta.meta_value+0 DESC. An dieser Stelle wird auf die Daten aus der ersten Funktion zugegriffen und letztendlich sortiert.

Es kann durchaus sein, dass, je nach Anforderung und Umsetzung, vielleicht nicht jeder Artikel ein benutzerdefiniertes Feld mit den entsprechenden Daten besitzt. Daher sollte man eine zweite Sortierreihenfolge angeben. Möglich wäre z.B. eine Sortierung nach dem Veröffentlichungsdatum:

$orderby = "postmeta.meta_value+0 DESC, $wpdb->posts.post_date DESC";

oder eine Sortierung nach Artikeltitel:

$orderby = "postmeta.meta_value+0 DESC, $wpdb->posts.post_title ASC";

Die Möglichkeiten, die WordPress mit den Custom Queries und Hooks bietet, ermöglichen eine Umsetzung nahezu jeder Anforderung.

Ein kleiner Hinweis am Rande: Durch diese zwei Funktionen wird das Paging oder die Suche nicht beeinflusst.

Wer Interesse an Custom Queries in WordPress bekommen hat, dem sei der Beitrag Custom Queries auf WordPress.org empfohlen.