Zurück zur Übersicht

BuddyPress: Gruppen individuell sortieren

Für ein Kundenprojekt stand ich vor der Aufgabe, BuddyPress-Gruppen in einer vom Kunden jederzeit festlegbaren Reihenfolge aufzulisten. Natürlich sollte dies für alle Gruppen-Auflistungen geschehen, die irgendwo auf der Projektseite dargestellt werden.

Nach einigem Suchen nach bereits bestehenden Lösungen (die es derzeit nicht zu geben scheint) und einigem Hadern mit der Tatsache, dass das SQL für die Gruppenabfrage nur ungenügend mit Filtern versehen ist, entschloss ich mich für folgende Lösung:
Im Gruppen-Admin kann ein Administrator für jede Gruppe eine „Position“ über ein Eingabefeld festlegen. Der Wert in diesem Eingabefeld entspricht der Position der Gruppe in der Liste. Das mag bei weitem nicht so komfortabel sein wie eine Drag&Drop-Liste, doch ist es mit nur einer Handvoll Code umzusetzen.

Zunächst fügen wir das Eingabefeld für die Position ein. Es erscheint im Gruppen-Admin unter „Details“:

Erklärung: wir holen uns die aktuelle Position der Gruppe via groups_get_groupmeta(), um den Wert in dem neuen Eingabefeld darstellen zu können.

Als Nächstes müssen wir uns in die Speicherroutine von BuddyPress einklinken, sobald die Gruppen-Details abgespeichert werden:

Erklärung: wir aktualisieren die Gruppen-Metadaten mit dem Wert aus dem neuen Eingabefeld.

Nun geschieht die eigentliche Sortierung: wir haken uns in die Funktion bp_has_groups() ein und sortieren die Gruppen unseren Vorgaben entsprechend:

Erklärung: zunächst prüfen wir die $_REQUEST – Werte. Hat ein Benutzer nämlich eine der Standard-Gruppensortierungen gewählt, so wollen wir diese Sortierung nicht überschreiben.

Anschließend verwenden wir usort(), um das Objekte-Array $groups_template->groups zu sortieren. Dies geschieht mit Hilfe der Callback-Funktion ms_sort_groups().

Dies ist im Grunde nur ein erster, aber bereits funktionierender Schritt. Denkbar wäre eine über Drag&Drop bearbeitbare Liste im Backend, um das Sortieren etwas komfortabler zu gestalten. Wer weiss, vielleicht erstelle ich ein Plugin daraus, sollte ich die Zeit dazu finden.

Schreibe einen Kommentar