🔖

【shopifyテーマ開発】サイト内検索のセクション作成

2023/01/15に公開

こんばんは。PeiWebです。今回は、トップページにサイト内検索するセクションを制作してみました✨

完成形

まずは、完成形を見ていきます。

通常、デフォルトのバリデーションの設定では以下のようになっていますが、

それでは、実装していきます。

Liquidを用いたカスタマイズ

早速、実装していきます。まずは、いつも通り、Schemaから定義していきます。
一例として、定義するSchemaは以下です。
スキーマの定義
赤色の枠のところを実装していきます。

custom-index-search.liquid

今回、サイト内検索の制作を行うセクションを「custom-index-search.liquid」とします。

Schemaの定義

custom-index-search.liquid
{% schema %}
  {
    "name": "サイト内検索",
    "limit": 1,
    "settings": [
      {
        "type": "html",
        "id": "header",
        "label": "タイトル",
        "default": "何かお探しですか?"
      }, {
        "type": "image_picker",
        "id": "img",
        "label": "画像"
      }, {
        "type": "color",
        "id": "color_txt",
        "label": "テキストカラー",
        "default": "#ffffff"
      }
    ],
    "presets": [
      {
        "name": "検索窓"
      }
    ]
  }
{% endschema %}

サイト内検索は、サイト内で1個しか必要ないので「"limit": 1」としております。
タイトル、画像、テキストカラーを加えております。

HTML追記

続いて、HTMLを追記していきます。
以下のコードがあるが確認できます。

custom-index-search.liquid
{% style %}
  .index_search p,
  .index_search h2 {
    color: {{ section.settings.color_txt }}
    ;
  }
{% endstyle %}

<div class="page-width-search index_search" style="background:  url('{{section.settings.img | img_url: 'master' }}') no-repeat center center / cover;">
  <div class="index_search_contents">
    <h2 class="center">{{ section.settings.header }}</h2>
    <div class="search_form_feild">
      <form
        action="{{ routes.search_url }}"
        method="get"
        role="search"
        class="search search-modal__form">
        <div class="field">
          <input
            class="search__input field__input"
            id="Search-In-Modal-1"
            type="search"
            name="q"
            value="{{ search.terms | escape }}"
            placeholder="{{ 'general.search.search' | t }}"
            {%- if settings.predictive_search_enabled -%}
            role="combobox"
            aria-expanded="false"
            aria-owns="predictive-search-results-list"
            aria-controls="predictive-search-results-list"
            aria-haspopup="listbox"
            aria-autocomplete="list"
            autocorrect="off"
            autocomplete="off"
            autocapitalize="off"
            spellcheck="false"
            {%- endif -%}>
          <label class="field__label" for="Search-In-Modal-1">{{ 'general.search.search' | t }}</label>
          <input
            type="hidden"
            name="options[prefix]"
            value="last">
          <button class="search__button field__button" aria-label="{{ 'general.search.search' | t }}">
            <svg
              class="icon icon-search"
              aria-hidden="true"
              focusable="false"
              role="presentation">
              <use href="#icon-search"></svg>
            </button>
          </div>

          {%- if settings.predictive_search_enabled -%}
            <div
              class="predictive-search predictive-search--header"
              tabindex="-1"
              data-predictive-search>
              <div class="predictive-search__loading-state">
                <svg
                  aria-hidden="true"
                  focusable="false"
                  role="presentation"
                  class="spinner"
                  viewBox="0 0 66 66"
                  xmlns="http://www.w3.org/2000/svg">
                  <circle
                    class="path"
                    fill="none"
                    stroke-width="6"
                    cx="33"
                    cy="33"
                    r="30"></circle>
              </svg>
            </div>
          </div>

          <span
            class="predictive-search-status visually-hidden"
            role="status"
            aria-hidden="true"></span>
        {%- endif -%}
      </form>
    </div>
  </div>
</div>

今回、shopifyテーマ「down」の検索結果のファイル「main-search.liquid」から検索窓を引用しました。
詳しく解説していきます。

routes.search_url

以下のような検索ページを返します。
検索ページ

こちらは、routeオブジェクトに、「search_url」が追記した形となっております。
参考までに、他のプロパティも紹介していきます。

プロパティ 返すページ
account_addresses_url ログインページ
account_logout_url ログアウトページ
account_register_url アカウント登録ページ
account_url アカウントページ
cart_url 購入画面(カートのページ)
collections_url コレクションページ
root_url ホーム画面

search.terms | escape

検索語句を返します。そのため、検索する値を入力し検索ページに飛ばすために、valueオプションに記載しております。
また、異なるスタイルを適用するハイライトフィルターを使うことが可能です。

general.search.search | t

こちらは、対応する言語の言葉を返しております。
言語は、日本語設定にされているので、日本語の翻訳ファイル「ja.json」をみていきます。

ja.json
    "search": {
      "search": "検索",
      "reset": "検索ワードをクリアする"
    }

"検索"と記載されているため、placeholderには、「検索」と表示されます。

settings.predictive_search_enabled

こちらは、日本語のschemaの設定をおこなている「ja.schema.json」に以下のように記載されております。

ja.schema.json
    "search_input": {
      "name": "検索行動",
      "settings": {
        "header": {
          "content": "商品のおすすめ"
        },
        "predictive_search_enabled": {
          "label": "商品のおすすめを有効にする"
        },
        "predictive_search_show_vendor": {
          "label": "販売元を表示",
          "info": "商品のおすすめが有効な場合に表示されます。"
        },
        "predictive_search_show_price": {
          "label": "価格を表示",
          "info": "商品のおすすめが有効な場合に表示されます。"
        }
      }
    },

つまり、「商品のおすすめを有効にする」にしているかどうかで条件分岐されていることがわかりますね。

CSS

これで、骨組みは終わりましたので、あとはCSSで調整するだけですね。

.index_search {
  height: 50vh;
  padding: 5rem 2rem;
  display: table;
  width: 100%;
}

@media (min-width: 750px) {
  .index_search {
    padding: 5rem;
  }
}

.index_search .index_search_contents {
  display: table-cell;
  vertical-align: middle;
}

.search-modal__form {
  margin: auto;
}

@media (max-width: 749px) {
  .page-width-search {
    padding-left: 2rem;
    padding-right: 2rem;
  }
}

.field__button{
  top: 0 !important;
  right: 0 !important;
}
.field__label {
  top: 10px !important;
  left: 10px !important;
}

最後に、、、
少しでも参考になれば記事にイイねしていただけますと嬉しいです。

Webサイト & ECサイト構築のご相談・ご依頼はTwitterのDMまでお願いいたします!
お待ちしております^^
https://twitter.com/pei_traveler


Discussion