Liquid Snippets by ALSEL
🔍 コレクション/検索中級

検索結果ページのレイアウト

検索キーワード入力フォームと検索結果の商品一覧を表示するセクション。検索実施時の結果数表示、ページネーション、レスポンシブグリッドレイアウトに対応する。

用途
search テンプレートに配置して、ストアの検索ページ全体を構成する。モバイル・タブレット・デスクトップで表示列数を自動調整できる。
設置場所
sections/search-main.liquid に配置し、templates/search.liquid で `{% section 'search-main' %}` で呼び出す。
注意点
検索フォームの `name="type" value="product"` は商品のみの絞込なので、ブログ記事やページも検索対象にしたい場合は該当行を削除する。ページネーションが機能するには snippet/pagination.liquid が存在している必要がある。テーマカスタマイザーの「ブレークポイント」設定値(モバイル・タブレット・デスクトップ)は実装の Bootstrap クラス名(row-cols-*)と連動しているため、別のグリッドシステムを使う場合は class 属性の prepend 部分を書き換える。
タグ:searchpaginationproduct-gridresponsiveform

コード

178 行 / liquid
<section 
  id="search-main-{{ collection.id }}" 
  class="
    search-main
    {{ section.settings.pt | prepend: 'pt-' }} 
    {{ section.settings.pb | prepend: 'pb-' }}
  ">
  <header class="section-header text-center mb-9">
    <div 
      class="container" 
      style="max-width: 600px;">
      <h1 class="title mb-4 {{ section.settings.header_title_font_size }}">
        {% if search.performed %}
          {{ 'general.search.search_page.title_search_performed' | t }}
        {% else %}
          {{ 'general.search.search_page.title' | t }}
        {% endif %}
      </h1>
      <form action="{{ routes.search_url }}" class="search-form" method="get" role="search">
        <input name="options[prefix]" type="hidden" value="last">
        <input type="hidden" name="type" value="product">
        <div class="form-control-wrapper">
          <div class="form-floating">
            <input 
              id="search-input"
              class="form-control pe-13"
              type="search"
              placeholder="{{ 'general.search.input_label' | t }}"
              name="q"
              value="{{ search.terms | escape }}"
              autocorrect="off" 
              autocomplete="off" 
              autocapitalize="off"
              spellcheck="false">
            <label for="newsletter-input-email">
              {{ 'general.search.input_label' | t }}
            </label>
          </div>
          <button type="submit" class="btn btn-link px-6" aria-label="{{ 'general.search.btn_label' | t }}">
            {% render 'svg-icons', icon: 'search', size: 24, class: '' %}
          </button>
        </div>
      </form>
    </div>
  </header>
  
  {% if search.performed %}
    {% paginate search.results by section.settings.limit %}
      <div class="search-inner">
        <div class="container">
          <div class="search-utilities mb-4">
            <p class="search-product-count small mb-0">
              {{ 'general.search.search_page.count_products' | t: count: search.results_count }}
            </p>
          </div>
          {% if search.results_count == 0 %}
            <p class="alert alert-warning my-6">
              {{ 'general.search.search_page.no_results' | t: terms: search.terms }}
            </p>
          {% else %}
            {% if search.results.first.object_type == 'product' %}
              <div 
                class="
                  product-list mx-n3 mx-desktop-n4 mb-0 row 
                  {{ section.settings.breakpoint_mobile | prepend: 'row-cols-' }}
                  {{ section.settings.breakpoint_tablet | prepend: 'row-cols-tablet-' }}
                  {{ section.settings.breakpoint_desktop | prepend: 'row-cols-desktop-' }}
                " 
                role="list">
                {% for product in search.results %}
                  <div class="p-3 p-desktop-4 mb-3 mb-desktop-4" role="list-item">
                    {% render 'product-card', product: product %}
                  </div>
                {% endfor %}
              </div>
              {% render 'pagination', paginate: paginate %}
            {% endif %}
          {% endif %}
        </div>
      </div>
    {% endpaginate %}
  {% endif %}
</section>

{% schema %}
{
  "name": "Search",
  "settings": [
    {
      "type": "header",
      "content": "General"
    },
    {
      "type": "select",
      "id": "header_title_font_size",
      "label": "Title font-size",
      "default": "h1",
      "options": [
        { "group": "Heading", "value": "h1", "label": "H1" },
        { "group": "Heading", "value": "h2", "label": "H2" },
        { "group": "Heading", "value": "h3", "label": "H3" },
        { "group": "Heading", "value": "h4", "label": "H4" },
        { "group": "Heading", "value": "h5", "label": "H5" },
        { "group": "Heading", "value": "h6", "label": "H6" }
      ]
    },
    {
      "type": "range",
      "id": "limit",
      "label": "Limit products",
      "min": 2,
      "max": 50,
      "default": 48,
      "step": 1
    },
    {
      "type": "header",
      "content": "Breakpoints",
      "info": "Adjust items per row based on the screen resolution"
    },
    {
      "type": "range",
      "id": "breakpoint_mobile",
      "label": "Mobile (<600px)",
      "min": 1,
      "max": 3,
      "step": 1,
      "default": 2
    },
    {
      "type": "range",
      "id": "breakpoint_tablet",
      "label": "Tablet (≥600px)",
      "min": 1,
      "max": 4,
      "step": 1,
      "default": 3
    },
    {
      "type": "range",
      "id": "breakpoint_desktop",
      "label": "Desktop (≥1200px)",
      "min": 1,
      "max": 6,
      "step": 1,
      "default": 4
    },
    {
      "type": "header",
      "content": "Spacing"
    },
    {
      "type": "range",
      "id": "pt",
      "label": "Top",
      "min": 0,
      "max": 20,
      "step": 1,
      "default": 9
    },
    {
      "type": "range",
      "id": "pb",
      "label": "Bottom",
      "min": 0,
      "max": 20,
      "step": 1,
      "default": 9
    }
  ],
  "templates": ["search"],
  "presets": [
    {
      "name": "Search"
    }
  ]
}
{% endschema %}

出典・ライセンス

License:
MIT

このコードは kondasoft 著作の MIT ライセンスソースです。 原本の著作権は kondasoft が保有します。日本語訳は ALSEL によるものです。

関連項目

🔍 コレクション/検索初級

ページネーションの表示

ページネーションUI(前へ・次へ、ページ番号)を paginate オブジェクトから描画するスニペット。デフォルトのページネーション形式で複数ページに分割したコンテンツをナビゲートできる。

📁 shopify-code-snippets·MIT·6
🔍 コレクション/検索初級

ページネーションの現在位置表示

コレクションや検索結果の一覧ページで、現在のページ番号と全ページ数を表示する。Shopify の多言語対応翻訳キーを使用して、言語ごとに自動で表記を切り替える。

📁 shopify-code-snippets·MIT·6
🔍 コレクション/検索中級

検索結果のペジネーション比較

検索結果を paginate タグで複数パターン分割して表示するテンプレート。デフォルトペジネーションと window_size:1 オプション指定の両方の書き方を示しており、ページネーション動作の違いを検証するサンプルコード。

📁 theme-tools·MIT·12
🔍 コレクション/検索初級

検索結果のページネーション設定

検索結果を paginate タグでページ分割し、複数の window_size 設定を並べて出力する方法。28件単位のペーグネーションと、ウィンドウサイズを明示的に指定した設定の2パターンを示している。

📁 theme-tools·MIT·12
🔍 コレクション/検索初級

コレクションページの商品ギャラリー

コレクション内の商品を3列のテーブルレイアウトで表示するテンプレート。各商品にサムネイル、タイトル、価格(セール時は定価を取消線)を表示し、ページネーションに対応する。

📁 liquid·MIT·20
🔍 コレクション/検索初級

コレクションページの商品一覧

コレクション内の商品を一覧表示し、商品画像・タイトル・説明文・価格帯をカード状に並べる。ページネーション機能で20件ごとに分割表示する。

📁 liquid·MIT·23