web-dev-qa-db-ja.com

特定のカテゴリのページのリスト(投稿ではなく)の生成

Jekyllを(ブログではなく)Webサイトの静的ジェネレーターとして使用しており、インデックスページのすべてのページの自動生成リストが必要です。具体的には、さまざまなカテゴリを作成し、各カテゴリのすべての記事を個別に一覧表示します。 ここにあります 以下に問題がある場合、私が説明している例。 Jekyllでこれを行う方法はありますか(GitHubページなど)? 変数のドキュメントページ を見ましたが、それはブログ投稿形式に固有のようです。

51
Mike

自分のサイトを構築しているときに、これとまったく同じ問題に遭遇し、(IMHO)簡単で堅牢なソリューションを見つけました。うまくいけば、これは似たようなことをしたい他の人にとって便利です。

問題

サイト上のページのサブセット(投稿ではない)を指定し、カテゴリに基づいて見出しの下にリストします。例:resourceページ(または参照ページ、または表示したいページの論理的なグループ化)とみなされる一連のページがある場合、それらをカテゴリ(コード、説明など)の下にリストしたいと思います。

ソリューション

目的の動作を得るには、次の3つの場所で変更を行う必要があります。

  • _config.yml
  • resources.md
  • resource-file-X.md

_config.yml

_config.ymlには、リソースファイルに表示されるすべてのカテゴリ/キーワード/タグ(またはそれを呼び出すもの)のリストを追加する必要があります。ここに私が持っているものがあります:

category-list: [code, editors, math, unix]

変数は何でも呼び出すことができます。category-listを選択しました。resource.mdファイルで同じ変数を使用していることを確認してください。

注:リストに項目を配置する順序は、resource.mdページにリストされる順序です。

resource-file-X.md

これらは、resources.mdページでインデックスを作成してリンクするファイルです。必要なのは、これらの各ファイルの先頭に2つのファイル変数を追加することだけです。 1つ目は、このファイルがresourceファイルであることを示すことです。

resource: true

2つ目は、このファイルにインデックスを付けるカテゴリを指定することです。必要な数のカテゴリでインデックスを作成できます。ページのインデックスを作成しない場合は、リストを空白のままにします。 Cでの適切なEINTR処理に関する私のリファレンスには、次のカテゴリがあります。

categories: [code, unix]

resources.md

これは、それぞれのカテゴリに基づいてページのリストを生成するファイルです。必要なのは、このファイル(またはリストに含める任意のファイル)に次のコードを追加することだけです。

{% for cat in site.category-list %}
### {{ cat }}
<ul>
  {% for page in site.pages %}
    {% if page.resource == true %}
      {% for pc in page.categories %}
        {% if pc == cat %}
          <li><a href="{{ page.url }}">{{ page.title }}</a></li>
        {% endif %}   <!-- cat-match-p -->
      {% endfor %}  <!-- page-category -->
    {% endif %}   <!-- resource-p -->
  {% endfor %}  <!-- page -->
</ul>
{% endfor %}  <!-- cat -->

コードの内訳

この仕組みの簡単な説明:

  • _config.ymlで指定された各カテゴリをループします。
  • そのカテゴリ名の見出しを表示します。
  • そのカテゴリに属する​​ページの番号なしリストを開始します。
  • サイト上のページをループします。
  • ページがファイル変数resourceで示されるresourceファイルである場合、ファイルが属する各カテゴリに対して、それらのいずれかがリストされている現在のカテゴリと一致する場合、そのページへのリンクを表示します。

注:リソースファイルのcategory-listおよびcategoriesの変数_config.ymlは、何でも好きなように呼び出すことができます。リストを生成するファイル内の変数

別の注意:_config.ymlを変更する場合、Jekyllを完全に再起動する必要があります。たとえ--watchオプションを使用していても、停止して再起動する必要があります。変更が有効にならない理由を理解するのに少し時間がかかりました!

最終製品

最終製品は my site のリソースページで見ることができますが、今日はこれをまとめただけなので、この記事の執筆時点では完全にはほど遠いですが、ホームページにしたい。

お役に立てれば!

82
m-renaud

液体の「含む」プロパティを使用してこれを行うよりクリーンな方法があります

_config.ymlにカテゴリのインデックスを追加します

categories: [fruit, meat, vegetable, cheese, drink]

page.mdのフロントマター内で、_config.ymlで利用可能な1つ以上のカテゴリを追加します

---
layout: page
title: Orange juice
description: Orange juice is juice from oranges. It's made by squeezing oranges.
categories: [fruit, drink]
---

テンプレート上で、実行するフルーツカテゴリのすべてのページを取得します。

{% for page in site.pages %}
  {% if page.categories contains 'fruit' %}
    <div class="item">
      <h3>{{page.title}}</h3>
      <p>{{page.description}}</p>  
    </div>
  {% endif %}
{% endfor %}
15
felipesk

ページと投稿(記事)を区別する必要があります。カテゴリー別にソートされたすべての投稿をリストすることは全く問題ではありません。 site.categoriesをループできます。これには、カテゴリ名とそのカテゴリ内のすべての投稿のリストが含まれています。

すべてのページをリストすることも可能です。site.pagesをループすることができます。ただし、ページは特定のカテゴリに属していません(投稿のみが属します)。

投稿された例を見てみると、投稿にカテゴリを使用してから、site.categoriesをループするのが方法のようです。正確に目的の出力が得られます。

2
Polygnome

いくつかのバリエーション/単純化が可能です(フェリペスクの回答)。たぶん、ジキルの改善による。

_config.ymlにはNOインデックスが必要です。

ページのリストがページにリストされていないであるが、例えばドキュメントにある場合、ドキュメントにもカテゴリを追加できます。

---
layout: doc
title: Fruit List
categories: [fruit]
---

そして、次のように使用します:

{% for p in site.pages %}
   {% if p.categories contains page.category %}
     * [{{ p.title }}]({{ p.url | absolute_url }})
        <small>{{ p.excerpt }}</small>
   {% endif %}
{% endfor %}

投稿では、これはさらに短くなる可能性があります。

{% for post in site.categories[page.category] %}
  * [{{ post.title }}]({{ post.url | absolute_url }})  
      <small>{{ post.excerpt }}</small>
{% endfor %}

なぜこれが投稿にしか機能しないのか、私にはまだわかりませんでした。

興味深い点は、このスニペットはどこでも使用できることです(docs/pages/postsを混在させる場合)!したがって、それを_includesとして追加し、次のように使用します。

## Further Reading
{% include pages-list.md %}

私はテーマを使用しています Minimal Mistakes

1
pme