Kategorie-Seiten alphabetisch sortieren

In einer Facebook-Gruppe wurde gefragt, wie man alle Beiträge auf einer Kategorieseite alphabetisch sortieren kann. In diesem Beitrag möchte ich darauf eingehen, wie man die Sortierung von Beiträgen auf Archiv-Seiten von Kategorien (und anderen) anpassen kann.

Sortierung von Beiträge auf allen Kategorie-Seiten

Selbst wenn ich nicht genau weiß, wieso die Person die Beiträge auf allen Kategorie-Seiten (und nicht etwa auf einer Archivseite eines anderen Post-Types) sortieren wollte, wäre das hier der passende Code dafür:

function aa_sort_all_archives( $query ) {
	// Only sort main query.
	if ( ! $query->is_main_query() ) {
		return;
	}
	// Only sort category archives.
	if ( ! is_category() ) {
		return;
	}

	$query->set( 'order', 'ASC' );
	$query->set( 'orderby', 'post_title' );
}

add_action( 'pre_get_posts', 'aa_sort_all_archives' );

Wann immer man die Query verändern möchte, sollte man eine Callback-Funktion zum pre_get_posts Hook verwenden. In dieser Callback-Funktion prüfen wir zuerst einmal, ob wir uns in der Haupt-Query befinden. Dann prüfen wir mit einer weiteren Bedingung nach für unseren Anwendungsfall. Ist diese Bedingung nicht erfüllt, verlassen wir die Funktion ebenfalls. Wenn alle Bedingungen erfüllt sind, dann passen wir die Query an. In Zeile 7 prüfen wir also, ob wir auf einer Kategorie-Seite sind. Wenn das der Fall ist, dann setzen wir die Sortierreihenfolge auf aufsteigend („ascending“) in Zeile 11 und das Feld, nach dem sortiert werden soll in Zeile 12 auf das post_title Feld. Das war’s!

Nur Beiträge in einer bestimmen Kategorie ordnen

Für manche Post-Types ist es wohl eher unwahrscheinlich, dass man die Posts nach für alle Kategorien sortieren möchte. Daher können wir auch den „slug“ (oder den Namen bzw. die ID) einer Kategorie an die is_category() Funktion übergeben. In diesem Beispiel habe ich eine spezielle Kategorie „alphabetical“ verwendet, um nur auf dieser Kategorieseite die Beiträge zu sortieren:

function aa_sort_alphabetical_archives( $query ) {
	// Only sort main query.
	if ( ! $query->is_main_query() ) {
		return;
	}
	// Only sort category archives.
	if ( ! is_category( 'alphabetical' ) ) {
		return;
	}

	$query->set( 'order', 'ASC' );
	$query->set( 'orderby', 'post_title' );
}

add_action( 'pre_get_posts', 'aa_sort_alphabetical_archives' );

In der gleichen Art und Weise lassen sich auch viele andere Archiv-Seiten unter Verwendung der „Conditional Tags“ überprüfen. Im CODEX findet ihr außerdem eine Seite über „Alphabetizing Posts“, darin wird aber die Verwendung einer sekundären Query gezeigt. Macht so etwas bitte niemals! Und lasst auch nicht alle Beiträge ausgeben! Macht also nichts von dem, was die Seite euch hier erzählt 😉

Fazit

Das Sortierung von Beiträgen (oder anderen Beitragstypen) kann auf einer Archiv-Seite am besten mit dem pre_get_posts Hook gelöst werden. Wenn ihr das erste Mal mit diesem Hook arbeitet, dann kann es passieren, dass es nicht gleich so funktioniert, wie ihr es gerne hättet, aber es lohnt sich wirklich sich mit dem Hook zu beschäftigen.

Ihr findet den Code zu diesem Beitrage auch als funktionierendes Plugin in einem GIST, wo ihr es euch auch als ZIP-Datei herunterladen und dann auf eurer Seite installieren könnt.

Veröffentlicht von

Bernhard ist fest angestellter Webentwickler, entwickelt in seiner Freizeit Plugins, schreibt in seinem Blog über WordPress und andere Themen, treibt sich gerne bei den WP Meetups in Berlin und Potsdam herum und läuft nach Feierabend den ein oder anderen Halbmarathon.

4 Kommentare » Schreibe einen Kommentar

  1. Hi!
    Ich dachte immer, dass die Sortierung in 99,99% aller Themes in WP automatisch mit eingebaut ist, oder wenn nicht, einfach per Plugin hinzugefügt werden kann. Jetzt war es bei mir aber tatsächlich so, dass irgendeine Einstellung die Sortierung „blockiert hat“. Mit deinem Code hat es aber mittlerweile funktioniert, vielen Dank!

  2. Hallo, danke für diesen Schnipsel.

    Kann man dazu auch eine alphabetische Indexierung ausgeben (= horizontale Leiste mit Buchstaben, aus der dann nur die Beiträge aus der Kategorie alphabetical ausgegeben werden)?

    Gruß
    Stefan

    • Hallo Stefan,

      der Code-Schnipsel verändert nur die Sortierung einer Archivseite (z.B. in der category.php Datei). Wenn du zusätzliche Dinge ausgeben möchtest, dann musst du hier vermutlich ein eigenes Template in deinem Child-Theme schreiben, das dann diese horizontale Linie ausgibt. Innerhalb dieses Templates (oder der Seite) kannst du dann eine WP_Query und einen Loop schreiben, um das entsprechend auszugeben.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert