Kategorien nach Anzahl der Themen ordnen

Ich frage mich, ob es jemals in Erwägung gezogen wurde, die Reihenfolge der Kategorien auf der Hauptseite nach der Anzahl der Themen zu sortieren?

Beispiel

Kategorie A hat 100 Themen
Kategorie B hat 50 Themen
Kategorie C hat 20 Themen.

Reihenfolge auf der Hauptseite wäre ABC. Wenn C plötzlich auf 120 Themen wechselt, wäre die Reihenfolge CAB.

Wäre dies einigermaßen erreichbar? Wäre eine Hysterese überhaupt möglich, damit sich die Kategorien nicht zu oft verschieben?

Hallo,

Ich kann eine kleine Komponente erstellen, falls Sie interessiert sind. Sie sprechen doch von der Kategorien-Seite (/categories), oder?

Das ist ein freundliches Angebot. Von unserer Seite ist dies jedoch nicht notwendig genug, um es als Theme-Komponente zu kaufen. Ich denke, es wäre trotzdem eine schöne Funktion, die es generell in Discourse gibt. Ich habe das Gefühl, dass es ein gutes Gleichgewicht zwischen der bestehenden Sortierung nach „neuesten“ (was die Reihenfolge zu oft ändert) und einem vollständig festen Layout wäre.

1 „Gefällt mir“

Nein, nein, kostenlos :slight_smile:.

EDIT:
Sie können dieses Skript in einer Theme-Komponente installieren.
Es ordnet die Elemente der Kategorieliste nur auf der Seite selbst an.
Dies wirkt sich nicht auf Vorlagen oder interne Elemente aus, um eine bessere Kompatibilität zu gewährleisten.
Abhängig von Ihrem Theme sind möglicherweise Anpassungen erforderlich.

Lassen Sie mich wissen, ob es für Sie funktioniert.

js
<script type="text/discourse-plugin" version="0.8">

api.onPageChange((url, title) => {
    const { defaultHomepage } = require('discourse/lib/utilities');

    if (url !== '/categories' && (url !== '/' || defaultHomepage() !== 'categories')) {
        return;
    }
    
    const desktop_category_page_style = api.container.lookup('service:site-settings').desktop_category_page_style;
    
    const sort = ({parent, nodes, selector}) => {
        if (!parent || !nodes.length) {
            return
        }

        Array.from(nodes).sort((a, b) => {
            const valueA = a.querySelector(selector).textContent;
            const valueB = b.querySelector(selector).textContent;
            
            return valueB - valueA;
            
        })
        .forEach(row => parent.appendChild(row));
    }
    
    if (desktop_category_page_style.startsWith('categories')) {
        const parent = document.querySelector('.category-list tbody[aria-labelledby="categories-only-category"]');
        
        sort({
            parent: parent, 
            nodes: parent?.querySelectorAll('tr'), 
            selector: 'td.topics span.value'
        })
    }
    else if (desktop_category_page_style === 'subcategories_with_featured_topics') {
        const childs = document.querySelectorAll('table.category-list');
        
        sort({
            parent: childs[0]?.parentElement, 
            nodes: childs, 
            selector: 'th.parent-category span.value'
        })

    } else {
        // boxes doesn't have a count displayed
    }
});
</script>