トピック数でカテゴリを並べ替える

メインページのカテゴリの順序をトピック数順に並べ替えることは、検討されたことがありますか?

カテゴリAには100件のトピックがあります
カテゴリBには50件のトピックがあります
カテゴリCには20件のトピックがあります。

メインページの順序はABCになります。もしCが突然120件のトピックに変更された場合、順序はCABになります。

これは合理的に達成可能でしょうか?カテゴリがあまり頻繁に移動しないように、ヒステリシス(履歴効果)は可能でしょうか?

こんにちは。

もしご興味があれば、小さなコンポーネントを作成できます。念のため確認ですが、カテゴリページ(/categories)のことですよね?

それは親切なお申し出ですが、こちら側ではテーマコンポーネントとして購入するほど必要ではありません。Discourse全般に nice feature としてあっても良いと思います。既存の latest による並び替え(頻繁に並び順が変わる)と、完全に固定されたレイアウトとの nice balance になると思います。

「いいね!」 1

いいえ、いいえ、無料です :slight_smile:

編集:
このスクリプトは テーマコンポーネント にインストールできます。

これは、カテゴリリストの項目をページ自体にのみ配置します。
これは、互換性を維持するために、テンプレートや内部には影響しません。
テーマによっては、調整が必要になる場合があります。

うまくいくかどうか教えてください。

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>