CSSで可能?カテゴリページでのカテゴリのグループ化

ホームページでカテゴリを CSS でグループ化したいと考えています(標準機能や設定がないことは承知しています)。

カテゴリをネストするのではなく、いくつかをグループ化し、それらにヘッダーを付けたいと考えています。個々のカテゴリはパディングで「分離」できること、また各カテゴリはカテゴリ ID またはカテゴリ名でターゲットできることは理解しています。そのため、以下のような見た目を実現したいと考えています。

シンプルにするため、カテゴリはソートされた順序にある必要があり、各カテゴリは category_id でターゲットする必要がありますが、あるカテゴリの後に、あるいは別のカテゴリの前にパディングを適用する CSS が存在するのではないかと思っています。

大きな疑問点は、パディング内にテキストを挿入してヘッダーを作成する機能があるかどうかです。

この提案の目的は、長いカテゴリリストビューを分割し、以下のように分離することです:

  • カテゴリ 1-2 を「スタッフ」ヘッダーの下に配置
  • カテゴリ 3-4 を「コミュニティリソース」ヘッダーの下に配置
  • カテゴリ 5, 8, 11, 12, 13 を「一般ディスカッションカテゴリ」ヘッダーの下に配置

これらをサブカテゴリにしたいわけではありません。現在の構造とカテゴリシステムをそのまま好んでいます。やりたいのは、カテゴリ表示ページでの表示方法を少し変えるだけです。理想的には、これは単なる視覚的なレイアウトの変更であり、プラットフォームのライブラリ構造に変更を加えるものではありません。

これを実現する方法をご存知でしょうか?

これは私のワークコラボレーションサイトのレイアウトにとって画期的なものになるはずです。

Sam さん、codinghorror さん、カテゴリ再編成メニューに、これをネイティブで実行できる「グループ化」ステップ(オプションとしてグループ化のオン/オフなど)を追加する方法はないでしょうか?メインページのグループ内でカテゴリを順序立てて配置すれば、自動的に分離できるかもしれません。これはコア機能、プラグイン、それともテーマコンポーネントとして実装すべきでしょうか?

anyone? buehler.

feedback appreciated

This kind of stuff is possible in a theme component but extremely complicated. I think you would need to override templates which makes this also pretty fragile.

少し遅くなりました :smile: ですが、誰かの役に立つかもしれません。注意点として以下を挙げます:

  • すべての CSS コードが必要というわけではありません。特に表の行の境界線や背景色などは、お好みに合わせて調整してください。
  • 通常の表からフレックスボックスレイアウトに変更しました。表の行には負の余白を設定できないなどのレイアウト上の問題があるためです。それに、より柔軟性があります :smile:
  • Category Group 1Category Group 2 を、希望するカテゴリグループ名に置き換えてください。
  • 例ではカテゴリ ID の 2 と 4 を使用しています。Chrome の開発者ツールで要素を検出(下の画像参照)し、適切なカテゴリ ID を見つけてください。その後、例の [data-category-id="2"][data-category-id="4"] をご自身の ID に置き換えてください。

これを「Common」タブに貼り付けてください:

.category-list{
    display: flex;
    flex-direction: column;
}
.category-list thead tr{
    display: flex;
}
.category-list .topics {
    width: 95px;
    margin-left: auto;
    min-width: 95px;
    white-space: nowrap;
}
.category-list tbody tr {
    background-color: var(--primary-very-low);
    box-sizing: border-box;
    display: flex;
}
body .category-list [data-category-id="2"],body .category-list [data-category-id="4"] {
    position: relative;
    margin-top: 50px;
}
body [data-category-id="2"]::before {
    content: "Category Group 1";
}
body [data-category-id="4"]::before {
    content: "Category Group 2";
}
body [data-category-id="2"]::before,body [data-category-id="4"]::before {
    position: absolute;
    top: -35px;
    left: 0;
    font-weight: bold;
    font-size: 15px;
    text-transform: uppercase;
    color: var(--primary-medium);
}

これを「Desktop」タブに貼り付けてください:

.category-list tbody tr {
    margin-bottom: 15px;
    border: 1px solid var(--primary-low);
}

そしてこれを「Mobile」タブに貼り付けてください:

body .category-list-item.category .posts {
    width: auto;
    margin-left: auto;
}
body .category-list-item>footer,body .subcategory-list-item>footer{
    background-color: var(--primary-very-low);
}
.categories-list .category-list th {
    padding: 0;
}
.category-list-item>footer .category-stat, .subcategory-list-item>footer .category-stat {
    float: right;
}
.category-list-item>footer .category-stat:first-child, .subcategory-list-item>footer .category-stat:first-child{
    margin-right: 0;
}
body .category-list-item.category tr:first-of-type{
    padding: 10px 0;
    border-bottom: 1px solid var(--primary-low);
}
body tr.category-topic-link:last-of-type{
    border-bottom: 1px solid var(--primary-low);
}
body .categories-list .category-list th {
    padding: 0;
}
body .category-list-item {
    border-top: none;
    margin-bottom: 10px;
}
body .category-list-item {
    padding: 0;
    border: 1px solid var(--primary-low)!important;
}
.category-list-item>footer, .subcategory-list-item>footer {
    border-top: none;
}

これがデスクトップとモバイル環境での表示例です:

こんにちは、Cos さん。とても興味深いですね。共有ありがとうございます。同じ趣旨(より良いプレゼンテーションを得るため)で、特定のプレゼンテーションを持つ WordPress ページをディスコースの前に配置しようとしています。そして、そのページにカテゴリ名を送信したいと考えています。例えば、回答を受け取ったカテゴリ、ユーザーが選択したカテゴリ、または特定のカテゴリなどです。これは可能だと思いますか?もし可能なら、どのようにすればよいでしょうか?

残念ながら、CSSだけではそれはできません。おそらく、WordPress Discourse プラグインが必要になるでしょう。さらに、wp discourse ショートコードも必須です。

当社の WordPress サイトでも既にこのプラグインを使用しており、現在まで非常にうまく機能しています。サイドバーウィジェットでのプラグインの見た目は以下の通りです:

@sam@cosdesign の回答は機能しています。これをコアのメニューに組み込んで、デフォルトでは無効にしつつ、管理パネルでグループのヘッダータイトルを設定できるようにし、各カテゴリの属性ページでは、管理パネルで有効化されたセクションヘッダーからドロップダウンで選択して、カテゴリをそのヘッダーの下に配置できるようにすることは可能でしょうか。

これはプラットフォームへの追加がそれほど難しくないはずで、大規模なマルチユーザーロール・グループ、マルチカテゴリ環境の導入を大きく改善するでしょう。

Discourse コアでこのようなグループ化がサポートされるようになりました。

「デスクトップカテゴリページスタイル」として「注目のトピックを持つサブカテゴリ」を選択します。

すると、カテゴリページは次のようになります。

RTLで可能ですか?
試しましたが、失敗しました💔

なるほど。コアとなる Discourse のスタイルシートは、ここで RTL バージョンを作成するために反転されます: discourse/lib/stylesheet/compiler.rb at main · discourse/discourse · GitHub CSS ファイルは、RTL バージョンを作成するためにコンパイルされるとは思いません。もしそれが正しければ、RTL レイアウトが使用されている場合にテーマで発生した問題が説明できるでしょう。

RTL ロケールでサイトを訪問し、方向が反転されているかどうかを確認して、サイトのテーマに方向を含む CSS ルールを追加することで、これを(確認)できます。反転されないと思います。

たとえば、テーマに次を追加した場合:

.category-list-item footer .category-stat, .subcategory-list-item footer .category-stat {
    float: right;
}

次のように変換されないと思います:

.category-list-item footer .category-stat, .subcategory-list-item footer .category-stat {
    float: left;
}

おっしゃる通りだと思います。上記のコードの使い方がまだよく分かりません :confused:

何か提案はありますか?

RTLに対応していないテーマの例をご存知ですか?もしご存知でしたら、そのテーマのリンクをここに投稿してください。そうすれば、私の理論をテストし、テスト後に何が問題なのかを説明します。

編集:問題の説明を以下に示します。

DiscourseのコアコードベースにあるCSSファイルの場合、RTLのCSSは、サイトのレイアウトの方向によって異なるほとんどのCSSルールを「反転」させることによって作成されます。たとえば、padding-leftpadding-rightに反転します。これは、RTLcss gem(https://github.com/discourse/rtlcss)によって行われます。

問題は、DiscourseのテーマではCSSルールが反転されないことです。つまり、テーマに方向を指定するCSSルールがある場合、RTL言語が使用されている場合とLTR言語が使用されている場合で方向は同じになります。これは軽微な例です。

テーマがRTLインターフェイスで使用されると、padding-left: 8px;padding-right: 8px;に反転されません。これにより、配置に軽微な問題が発生します。テーマがRTL言語で使用される場合に発生する、より大きな問題の例もきっとあるはずです。

テーマエディタでデフォルトのDiscourseテーマに追加するCSSについても同様です。これは、このトピックのコードを使用した例です。Can it be done with CSS? Grouping categories on category page - #4 by cosdesign

以下は、そのCSSからのルールで、方向を設定しています。

body [data-category-id="2"]::before,body [data-category-id="4"]::before {
    position: absolute;
    top: -35px;
    left: 0; // ここを変更する必要があります
    font-weight: bold;
    font-size: 15px;
    text-transform: uppercase;
    color: var(--primary-medium);
}

RTLロケールの場合、問題は次のとおりです。

そのルールがコアDiscourseのCSSファイルにあった場合、RTL言語が選択されるとleft: 0;は自動的にright: 0;に変換されます。CSSはテーマに追加されるため、手動で次のように編集する必要があります。

body [data-category-id="2"]::before,body [data-category-id="4"]::before {
    position: absolute;
    top: -35px;
    right: 0; // RTLレイアウトの適切な位置に変更されました
    font-weight: bold;
    font-size: 15px;
    text-transform: uppercase;
    color: var(--primary-medium);
}

Discourseは、RTLレイアウトが使用されている場合にhtmlタグにrtlクラスを追加します。テーマ開発者はこのクラスを使用して、テーマをLTRおよびRTLレイアウトの両方で機能させることができます。これは機能し、正しいと思いますが、おそらくleft: autoの宣言は不要かもしれません。

body [data-category-id="2"]::before,body [data-category-id="4"]::before {
    position: absolute;
    top: -35px;
    left: 0;
    font-weight: bold;
    font-size: 15px;
    text-transform: uppercase;
    color: var(--primary-medium);
}
/* RTLレイアウトの配置を修正 */
.rtl body [data-category-id="2"]::before,.rtl body [data-category-id="4"]::before {
    right: 0;
    left: auto;
}

開発者はテーマでこのアプローチを取るべきかどうかはわかりません。時間がかかり、エラーやメンテナンスの問題につながる可能性があります。おそらくDiscourseは、いくつかのテーマをコンパイルしてRTLバージョンを提供することを検討できるでしょう。これらのアプローチのいくつかを使用してテストする価値があるかもしれません。

require "rtlcss"

Rtlcss.flip_css("theme_css")

これは短い回答になるはずでした :slight_smile: 私が書いたことが正しく、他のトピックで対処されていない場合、新しいトピックに移動すべきかもしれません。

これらの Theme component がお探しのものかもしれません。または、コードを見てアイデアを得るための良いベースになるでしょう。

「Modern Category + Group boxes」は、Air Theme で使用されているものと同様にうまく機能します。