WordPress Tag Cloud mit Umlauten (äöü) korrekt sortieren - Oder: Der WordPress Filter im Live-Beispiel erklärt

Keywords: #anleitung #filter #php #tagcloud #tutorial #wordcloud #wordpress

WordPress bringt von Hause aus ein Widget mit, dass die verwendeten Tags als Cloud darstellt (wer es ein wenig schöner mag, greift auf mein WordCloud Plugin zurück). Das Ganze hat nur einen Haken: Die entsprechende WordPress-Funktion wp_generate_tag_cloud nutzt aosort() als Sortierfunktion. Und die kommt mit Umlauten nicht sonderlich gut klar. Eine Lösung wäre also, die Umlaute für die Sortierung zu übersetzen, also Ä ind Ae, ö in oe und so weiter.

Das schöne an WordPress: Sehr viele Funktionalitäten lassen sich über Hooks und Filter modifizieren. So bietet auch der Sortier-Algorithmus die Möglichkeit an, den Array mit einer eigenen Funktion zu filtern. Die perfekte Gelegenheit, um sich mit dem Thema Filter mal etwas näher zu beschäftigen. Ein Blick in den Source-Code von wp_generate_tag_cloud() zeigt ab Zeile 875 (seit Version 4.8.0):

    /**
     * Filters how the items in a tag cloud are sorted.
     *
     * @since 2.8.0
     *
     * @param WP_Term[] $tags Ordered array of terms.
     * @param array     $args An array of tag cloud arguments.
     */

    $tags_sorted = apply_filters( 'tag_cloud_sort', $tags, $args );

    if ( empty( $tags_sorted ) ) {
        return $return;
    }

...

Die Tags lassen sich also über den Filter tag_cloud_sort mit einer eigenen Funktion sortieren. Gesagt, getan. Folgendes packen wir in die functions.php unseres Child Themes (wir ignorieren dabei mal die Vorgabe, Funktionalitäten nicht im Theme unterzubringen):

add_filter('tag_cloud_sort', 'custom_tag_sort', 10, 2);

Der zweite Parameter verweist auf unsere eigene Sortier-Funktion. Die 10 beschreibt die Priorität und mit 2 wird die Anzahl der Funktions-Parmaeter festgelegt, nämlich $tags und $args. Unsere eigene Sortier-Funktion sieht dann folgendermaßen aus (in Ahnlehnung an “Arrays sortieren mit Umlauten”).

function custom_tag_sort($tags, $args) {
        
    if (count($tags) == 0) { return $tags; }
    $tagsSorted = array();
    $tagsReturn   = array();
    $search   = array("Ä","ä","Ö","ö","Ü","ü","ß");
    $replace  = array("Ae","ae","Oe","oe","Ue","ue","ss");
    
    foreach($tags as $key => $val) {
        $tagsSorted[$key] = str_replace($search, $replace, $val->name);
    }

    natcasesort($tagsSorted);
    
    foreach($tagsSorted as $key => $val) {
        $tagsReturn[$key] = $tags[$key];
    }

    return $tagsReturn;
        
}

Am Anfang schauen wir, ob überhaupt Tags übergeben werden, andernfalls gehts gleich wieder zurück. Danach initialisieren wir unsere Variablen. Von Interesse dürften hier vor allem $search und $replace sein. Damit legen wir fest, welche Umlaute und Sonderzeichen ersetzt werden sollen. Die Liste darfst du natürlich beliebig erweitern.

In der ersten foreach-Schleife durchlaufen wir die Tag-Liste und ersetzen ganz schlicht die Umlaute entsprechend der Vorgabe.

Danach sortieren wir unsere “bereinigte” Tag-List mit der alternativen Sortier-Funktion natcasesort(). natcase steht für natural sort, case insensitive. Sprich: Natürliche Sortierung, Ignorieren der Groß-/Kleinschreibung. Natürliche Sortierung heißt ganz einfach: So wie ein Mensch sortieren würde.

In der letzten Schleife sorgen wir dafür, dass die nun sortierte Tag-Liste wieder unsere ursprünglichen Umlaute enthält und geben die sortierte Liste dann zurück.

Das war es auch schon. Unsere Liste ist, unter Berücksichtigung der deutschen Umlaute, sauber sortiert. Ab dort übernimmt WordPress die weitere Verarbeitung. Und wir haben gelernt, wie wir einen einfachen Filter in WordPress implementieren.