Um Beiträge in WordPress-Kategorien zu sortieren, benötigst du kein Plugin – ein einziges PHP-Snippet reicht. Damit blendest du auf Kategorie-Archivseiten ein Dropdown ein und kannst Beiträge nach Datum oder Titel sortieren.
Kurzfassung: Die Anleitung ist für GeneratePress gedacht und deckt zwei Setups ab:
- Variante A (GeneratePress Hooks / klassisches Archiv): Dropdown wird per Hook ausgegeben.
- Variante B (GenerateBlocks Block-Template / Query Loop): Dropdown wird per Shortcode direkt unter dem Kategorie-Titel platziert.
Beide Varianten nutzen dieselbe Sortierlogik über pre_get_posts. Deine Permalinks bleiben dabei unverändert – die Sortierung wird über den URL-Parameter ?sort_by=... gesteuert.
Inhaltsverzeichnis
Vorteile einer Sortierfunktion auf Kategorie-Seiten
- Bessere Nutzerführung: Besucher können die Liste so sortieren, wie sie sie gerade brauchen.
- Mehr Übersicht: Gerade bei großen Kategorien ist „Älteste zuerst“ oder „Titel A–Z“ praktisch.
- Ohne Plugin für die Sortierung: Du kannst das Snippet z. B. über „Code Snippets“ einpflegen.
Welche Variante passt zu deinem Setup?
Damit das Dropdown an der richtigen Stelle angezeigt wird, ist entscheidend, wie dein Kategorie-Archiv aufgebaut ist:
- Klassisches GeneratePress Kategorie-Archiv (Theme-Loop): Nutze die Hook-Variante (Variante A).
- GenerateBlocks Block-Template / Query Loop (Loop Template): Nutze die Shortcode-Variante (Variante B) und setze den Shortcode im Template direkt unter den Kategorie-Titel (Einstellung im Block-Editor).
Wichtig bei Loop Templates: Wenn du ein GeneratePress Loop Template mit Query Loop nutzt, sollte der Query Loop die Option Inherit query from template aktiv haben. Wenn du im Query Loop eigene Query-Parameter setzt, kann die Sortierung über die Main Query sonst nicht wie erwartet greifen.
Technische Umsetzung: Sortierfunktion für Kategorie-Archive
Das Snippet besteht aus drei Teilen:
- Dropdown-Ausgabe (Formular)
- Ausgabe-Variante (Hook oder Shortcode)
- Sortierlogik per
pre_get_posts
Der Code (alles in einem Snippet)
Der folgende Code enthält alle drei Teile in einem Snippet – du brauchst nichts weiter.
Kategorie-IDs anpassen: Ersetze im Code die Beispiel-IDs (z. B. 22, 23, 25) durch deine eigenen Kategorie-IDs. Du findest sie im Backend unter Beiträge → Kategorien (mit der Maus über den Kategorienamen fahren und auf die URL achten – dort steht meist tag_ID=...).
function dwf_category_sorting_allowed_categories() {
return array(22, 23, 25); // Beispiel-IDs: ersetzen durch deine Kategorie-IDs
}
function dwf_category_sorting_allowed_sorts() {
return array('date_desc', 'date_asc', 'title_asc', 'title_desc');
}
function dwf_category_sorting_get_current_sort() {
$sort_by = 'date_desc';
if (isset($_GET['sort_by']) && is_string($_GET['sort_by'])) {
$sort_by = sanitize_key(wp_unslash($_GET['sort_by']));
}
if (!in_array($sort_by, dwf_category_sorting_allowed_sorts(), true)) {
return 'date_desc';
}
return $sort_by;
}
function dwf_category_sorting_render_dropdown() {
$allowed_categories = dwf_category_sorting_allowed_categories();
if (!is_category($allowed_categories)) {
return '';
}
$current_sort = dwf_category_sorting_get_current_sort();
ob_start();
?>
<form method="get" id="custom-sorting-form" style="margin-bottom: 20px;">
<label for="sort_by">Sortieren nach:</label>
<select name="sort_by" id="sort_by" onchange="this.form.submit()">
<option value="date_desc" <?php selected($current_sort, 'date_desc'); ?>>Neueste zuerst</option>
<option value="date_asc" <?php selected($current_sort, 'date_asc'); ?>>Älteste zuerst</option>
<option value="title_asc" <?php selected($current_sort, 'title_asc'); ?>>Titel (A-Z)</option>
<option value="title_desc" <?php selected($current_sort, 'title_desc'); ?>>Titel (Z-A)</option>
</select>
</form>
<?php
return ob_get_clean();
}
/**
* Variante A: Classic Kategorie-Archiv (GeneratePress Hooks)
*/
function dwf_category_sorting_setup_hook() {
$allowed_categories = dwf_category_sorting_allowed_categories();
if (!is_category($allowed_categories)) {
return;
}
add_action('generate_after_archive_title', function () {
echo dwf_category_sorting_render_dropdown();
}, 10);
}
add_action('wp', 'dwf_category_sorting_setup_hook');
/**
* Variante B: Block-Template / Query Loop
* Im Block-Template direkt unter den Kategorie-Titel setzen:
* [dwf_category_sorting]
*/
function dwf_category_sorting_shortcode() {
return dwf_category_sorting_render_dropdown();
}
add_shortcode('dwf_category_sorting', 'dwf_category_sorting_shortcode');
/**
* Sortierung der Beiträge im Kategorie-Archiv
*/
function dwf_category_sorting_pre_get_posts($query) {
$allowed_categories = dwf_category_sorting_allowed_categories();
if (is_admin() || !$query->is_main_query()) {
return;
}
if (!$query->is_category($allowed_categories)) {
return;
}
$sort_by = dwf_category_sorting_get_current_sort();
switch ($sort_by) {
case 'date_asc':
$query->set('orderby', 'date');
$query->set('order', 'ASC');
break;
case 'date_desc':
$query->set('orderby', 'date');
$query->set('order', 'DESC');
break;
case 'title_asc':
$query->set('orderby', 'title');
$query->set('order', 'ASC');
break;
case 'title_desc':
$query->set('orderby', 'title');
$query->set('order', 'DESC');
break;
}
}
add_action('pre_get_posts', 'dwf_category_sorting_pre_get_posts');
Variante B (Block-Template): Shortcode im Template platzieren
Wenn dein Kategorie-Archiv über ein Loop Template / eine Block-Loop-Vorlage aufgebaut ist, setze einen Shortcode-Block direkt unter den Kategorie-Titel und füge diesen Shortcode ein:
[dwf_category_sorting]
Anleitung: Snippet über „Code Snippets“ einfügen
- Plugin installieren: Installiere das Plugin Code Snippets (falls du es noch nicht nutzt).
- Neues Snippet anlegen: WP-Backend → Snippets → Neu hinzufügen.
- Code einfügen: Kopiere das Snippet aus dem Artikel hinein.
- Kategorie-IDs anpassen: Ersetze die Beispiel-IDs (z. B.
22, 23, 25) durch deine IDs. - Aktivieren & testen: Kategorie-Archiv aufrufen und Sortierung prüfen.
Wenn du mehr Snippets suchst: In meinem Artikel 25 Snippets für WordPress findest du weitere praktische Code-Beispiele.
Wenn es nicht klappt (Troubleshooting)
- Dropdown erscheint nicht: Prüfe, ob du ein Block-Template/Query Loop nutzt. Dann den Shortcode in der Block-Loop-Vorlage unter dem Kategorie-Titel platzieren.
- Nach Umzug funktioniert es nicht mehr: Kategorie-IDs können sich ändern. Prüfe die IDs im Backend unter Beiträge → Kategorien (URL/Tag_ID).
- Sortierung greift nicht: Prüfe, ob die URL den Parameter
?sort_by=...enthält und ob wirklich das Kategorie-Archiv die Main Query ist. - Loop Template: Prüfe im Query Loop, ob Inherit query from template aktiv ist.
FAQ
Wie finde ich meine Kategorie-IDs in WordPress?
Im Backend unter Beiträge → Kategorien. Fahre mit der Maus über eine Kategorie und schaue unten links (oder in der Browser-Statusleiste) auf den Link – dort steht meist tag_ID=.... Diese Zahl trägst du im Snippet ein.
Funktioniert das auch mit anderen Themes als GeneratePress?
Die Sortierung über pre_get_posts ist Theme-unabhängig. Die Ausgabe per Hook ist jedoch GeneratePress-spezifisch. Wenn du ein anderes Theme nutzt, musst du entweder einen passenden Hook deines Themes verwenden oder die Shortcode-Variante im Template platzieren.
Was passiert bei Pagination (Seite 2, 3, …) mit der Sortierung?
Die Sortierung wird über ?sort_by=... gesteuert. Damit sie über mehrere Archiv-Seiten erhalten bleibt, sollte der Parameter beim Wechsel auf Seite 2/3 weiterhin in der URL stehen. Wenn das bei deinem Setup nicht passiert, liegt es meist an der Pagination-/Template-Ausgabe und muss dort ergänzt werden – zum Beispiel indem du bei einer paginate_links()-Ausgabe den Parameter per add_args weitergibst.
Fazit
Mit dem Snippet kannst du Beiträge auf Kategorie-Archivseiten nach Datum oder Titel sortieren. Je nach Setup bindest du das Dropdown entweder per GeneratePress Hook ein oder platzierst es als Shortcode im GenerateBlocks Loop Template. Wenn du die Kategorie-IDs einmal eingetragen hast, läuft das Snippet ohne weiteren Aufwand.

