WordPress: Sortierung nach mehreren Custom Fields
Während über das Thema „Sortieren nach Custom Field Values“ schon sehr viele Artikel vorhanden sind, die alle das Sortieren nach einem Custom Field behandeln, scheint es bisher keine Information dazu zu geben, wie man Artikel in WordPress nach mehreren Custom Field Values sortieren kann.
Hat man zum Beispiel ein Feld Vorwahl und ein Feld Telefonnummer als Custom Fields angelegt und möchte nun eine Liste aller Posts, nach Telefonnummer sortiert, anzeigen, so muss diese natürlich erst nach der Vorwahl und innerhalb der Vorwahl dann nach Telefonnummer sortiert werden.
Wären alle Custom Fields eines Posts nur in einem Datensatz gespeichert, könnte man recht einfach die ORDER BY Klausel um das zweite Feld erweitern. (z.B. ORDER BY Feld1, Feld2)
Leider ist dies nicht der Fall. Für jedes Custom Field wird in der Tabelle postmeta ein eigener Datensatz angelegt. Die Vorwahl steht also in einem anderen Datensatz als die Telefonnummer.
Hier liegt auch das Problem.
Abhilfe schafft ein zweiter JOIN auf die postmeta Tabelle der das zweite Feld abfragt.
Beide Felder können dann in der ORDER BY Klausel durch CONCAT() zu einem String zusammengefasst werden, nachdem dann sortiert werden kann.
Um dies zu erreichen, muss die functions.php (befindet sich im Verzeichnis des aktuellen Themes) folgendermaßen erweitert werden:
/* Hier wird die Standard query um zwei Joins auf die Tabelle postmeta erweitert,
einmal wird so der Wert von Feld1, einmal der von Feld2 zurückgegeben.
Damit befinden sich jetzt BEIDE Werte in dem Ergebnis der Abfrage.*/
add_filter(‚posts_join‘,’my_join_filter‘);
function my_join_filter($arg)
{
global $wpdb;
$arg .= „LEFT JOIN ( SELECT * FROM $wpdb->postmeta WHERE meta_key = ‚Feld1‘)
AS postmeta ON $wpdb->posts.ID = postmeta.post_id
LEFT JOIN ( SELECT * FROM $wpdb->postmeta WHERE meta_key = ‚Feld2‘)
AS postmeta1 ON $wpdb->posts.ID = postmeta1.post_id“;
return $arg;
}
/* Hier wird die Sortierung festgelegt,
die nach dem mittels Concat zusammengebauten String erfolgen soll */
add_filter(‚posts_orderby‘,’my_orderby_filter‘);
function my_orderby_filter($arg) {
global $wpdb;
$arg = „Concat(postmeta.meta_value,postmeta1.meta_value) ASC“;
return $arg;
}
Achtung !
Um zu verhindern, daß bei einem Update des Themas diese Änderungen gelöscht werden sollte man statt die functions.php im Original
Thema zu ändern besser ein Childtheme anlegen.
(näheres dazu hier: http://www.opso-consulting.de/wordpress-themen-richtig-anpassen-child-themas/)
Übrigens: mit dem Befehl „echo $wp_query->request;“ kann man sich die aktuelle SQL-Abfrage zur Anzeige der Posts ausgeben lassen.