Zum Inhalt

Posts by Taxonomy

Wozu

twtheme_posts_by_taxonomy() liefert eine Liste von Beitrags-IDs, die zuerst nach dem Namen ihres Terms und dann innerhalb des Terms nach einem Beitragsfeld sortiert ist. Genau das leistet WP_Query nicht: Nach einem Termnamen kann man dort nicht sortieren.

Die Funktion holt die Beiträge über get_posts() und sortiert sie danach in PHP mit usort().

Anwendung

$ids = twtheme_posts_by_taxonomy(
  'category',
  [
    'post_type' => 'post',
    'orderby'   => 'date',
    'order'     => 'DESC',
  ],
  [
    'hide_empty' => true,
  ],
  [
    'order'   => 'ASC',
    'orderby' => 'title',
  ]
);

Parameter

Parameter Typ Beschreibung
$taxonomy string Taxonomie-Slug, etwa category, post_tag oder eine eigene.
$args array WP_Query-Argumente.
$term_args array Argumente für get_terms(), etwa hide_empty.
$sort array Sortierung innerhalb eines Terms: order und orderby.

Zwei Parameter sind entfallen

Bis TWtheme 3.2.29 nahm die Funktion zusätzlich $transient_name und $transient_period für einen Zwischenspeicher. Der Cache war zu diesem Zeitpunkt längst ohne Wirkung, der Name nur noch Pflicht ohne Zweck. Beide Parameter sind entfernt.

Bestehende Aufrufe brauchst du deshalb nicht anzupassen: PHP verwirft überzählige Argumente stillschweigend. Ein Aufruf mit sechs Argumenten funktioniert also weiter — und tut jetzt sogar etwas, wenn er vorher wegen eines fehlenden Namens abgebrochen ist. Wer einen Zwischenspeicher braucht, legt ihn selbst um den Aufruf.

Sortierung

Zwei Stufen, in dieser Reihenfolge:

  1. Nach Termname — natürliche Sortierung ohne Rücksicht auf Groß- und Kleinschreibung, Richtung über $sort['order']. Beiträge in mehreren Terms werden nach ihrem ersten Term einsortiert.
  2. Innerhalb des Terms — nach $sort['orderby'].

Für die zweite Stufe sind nur Felder des Beitrags erlaubt:

orderby sortiert nach
date, modified Zeitstempel
ID, menu_order, parent, author Zahlenwert
title, name Text, natürliche Sortierung

Alles andere lässt die Reihenfolge unverändert.

Verhalten

  • fields wird intern auf all gesetzt und lässt sich nicht überschreiben, ebenso suppress_filters auf false.
  • Ist $args['orderby'] einer dieser Werte, gibt die Funktion null zurück: none, type, rand, comment_count, meta_value, meta_value_num, post__in. Der Grund ist die Sortierung in PHP — diese Ordnungen ließen sich danach nicht mehr nachbilden.
  • Enthält ein meta_query-Wert ein |, wird er in zwei serialisierte Werte zerlegt. Das trifft Felder, die ihre Werte serialisiert ablegen.
  • Ohne tax_query in $args setzt die Funktion selbst eine, die alle Terms der Taxonomie umfasst.

Rückgabe

Rückgabe Wann
array mit Beitrags-IDs Erfolg
null unerlaubtes orderby, unbekannte Taxonomie, keine Terms, keine Beiträge

Da null ein regulärer Fall ist und nicht die Ausnahme, gehört ein is_array() oder eine leere Prüfung vor die Schleife.

Typische Einsatzfälle

  • Beiträge nach Kategorie gruppiert ausgeben, innerhalb der Gruppe alphabetisch
  • Eine stabile Reihenfolge über mehrere Terms hinweg, die WP_Query nicht liefert