Wordpress: get_terms(), sortiert nach 'description'

Die Funktion get_terms() nimmt einiges an Parametern in Form eines Arrays entgegen, so auch einen der bestimmt, nach welchem Attribut sortiert werden soll – leider akzeptiert WP keinen Wert um nach der Beschreibung der Begriffe zu sortieren. Zum Glück wird dieser Teil des SQL-Statements auch durch einen Filter geschickt, dieser heißt get_terms_orderby und den kann man dann nutzen. Die Funktionsparameter werden zu einer Datenbankabfrage über die Tabellen wp_terms und wp_term_taxonomy zusammen gefügt. Dabei wird wp_terms der Alias t und wp_term_taxonomy der Alias tt zugewiesen. Die Beschreibung der Begriffe ist in der Tabelle wp_term_taxonomy gespeichert, die Spalte nach der sortiert werden soll benennt man also mit tt.description und platziert diese über den Filter an Ort und Stelle. Das geht so lange gut, bis sich das SQL-Schema der Funktion get_terms mal ändert, dann hat man im schlimmsten Fall einen SQL-Fehler produziert. Um sicher zu gehen, dass wenigstens der Alias der entsprechenden Tabelle stimmt, kann man die Spalte für die Anzahl der mit diesem Begriff verknüpften Posts, genannt count, heranziehen, der sich die Tabelle mit der description teilt. Die Sortierung nach der Anzahl wird von Hause aus nämlich unterstützt. Also:

/**
 * get SQL-clause to 
 * sort by wp_term_taxonomy.description
 * 
 * @param string $orderby
 * @return string
 */
function order_terms_by_desc( $orderby ) {

	return str_replace( '.count', '.description', $orderby );
}

Um dann im Theme (oder wo man sonst möchte) diverse Begriffe nach der Beschreibung sortiert zu bekommen, setzt man den Filter vor dem Funktionsaufruf (und nimmt ihn anschließend wieder raus!):

add_filter( 'get_terms_orderby', 'order_terms_by_desc' );
$terms = get_terms( 
	'eine-taxonomie',
	array(
		# some parameter
		'orderby' => 'count' # important!
	)
);
remove_filter( 'get_terms_orderby', 'order_terms_by_desc' );

 

Kommentare

Es wurden noch keine Kommentarte zu diesem Artikel geschrieben.

Fragen, Ideen oder Kritik? – Hier ist Platz dafür!

Dein Kommentar

Um ein Kommentar abzugeben, reicht der Text im Kommentarfeld. Die Angabe eines Namens wäre nett, ist aber nicht erforderlich.

Du darfst folgenden HTML-Code verwenden, musst aber nicht:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>