カラーミーショップで価格降順で商品を並べる

カラーミーショップの商品一覧で、価格降順(価格高い順)に商品を並べる機能について相談を受けることがあります。昔からこの機能がないんですが、コーディング(Smarty)で対応する方法について考えてみました。

サンプルコードを書きましたので、参考にどうぞ。

商品一覧の表示を並び替える

商品一覧に表示する商品を並び替えする方法には、以下の3通りあります。
カラーミー制作される方は、基礎知識として知っておく必要があります。

登録の古い・新しいは、商品IDの昇順・降順になります。

おすすめ順…設定した表示番号順に表示されます。表示番号の設定がない場合、登録の古い商品から順に表示されます。

価格順…価格の安い順に表示されます。

新着順…登録の新しい商品から順に表示されます。

デザイン設定(項目編集)で出来ることを教えてください – カラーミーショップ ヘルプセンター


デザイン>デザイン編集で、商品一覧(商品検索も含む)の表示順の初期設定が行えます。
任意の順番に並べ替えたい場合は、カラーミーショップの管理画面内でおすすめ順を選択します。



次に管理画面内の商品検索やグループの商品一覧にある表示順で数字を入力して並び順を指定します。
表示順が空白の場合は先頭に表示されます。

仕様上の注意点

トップページに表示している、売れ筋商品・新着商品などの表示順は上記の「商品一覧の設定」とは関係ありません。
おすすめ順(=設定した表示番号順に表示。表示番号の設定がない場合、登録の古い商品から順に表示)で常に表示されます。

価格順は昇順(価格の安い順)のみです。

コードの考え方

デフォルトの価格昇順(価格の安い順)を、逆回しすると価格降順(価格の高い順)になります。
Smartyのマニュアルを読むと載っていますが、sectionループでstep=-1すると逆回しになります。

あとは、価格昇順・価格降順を押したときに、処理を分岐すればOKです。

価格降順のサンプルコード

一般的なECでは価格降順が備わっています。
ここでは、カラーミーショップの初期機能(価格昇順)に加えて、価格降順(価格の高い順)を追加するサンプルコードを書きました。

コードは、カラーミーショップ公式の無料テンプレート「Discover」に設置する場合を想定しています。Discoverに設置する際は丸々コピペしても動作します。
それ以外のテンプレートの場合は、サンプルコードを参考にして自サイトに設置してみてください。

表示順のリンク

下記コードの10-20行目が置き換え箇所になります。
価格降順時(価格順↓をクリックしたとき)は、URLに「&desc=1」(URLパラメータ―)を付加します。
パラメーターを見てサーバー側でなにか処理する訳ではありません。価格降順を選択したという目印として使います。

5行目、23行目regex_replaceを追加しています。
価格降順以外を選択した場合は、regex_replaceで「&desc=1」を取り払う必要があります($productlist_sort_def、$productlist_sort_newなどの中身を見ると、この処理の必要性が理解できます)。

Discoverテンプレートの商品一覧HTML 113行目~

          <!-- ソート -->
          <ul class="p-item-sort-list">
            <li class="p-item-sort-list__item">
            <{if $productlist_sort_now != ""}>
              <a href="<{$productlist_sort_def|regex_replace:"/\&desc=1/":""}>">おすすめ順</a>
              <{else}>
              <span>おすすめ順</span>
            <{/if}>
            </li>
            <li class="p-item-sort-list__item">
            <{if $productlist_sort_now != "p"}>
              <a href="<{$productlist_sort_price|regex_replace:"/\&desc=1/":""}>">価格順↑</a> <a href="<{$productlist_sort_price}>&desc=1">価格順↓</a>
            <{else}>
              <{if $smarty.get.desc == "1"}>
                <a href="<{$productlist_sort_price|regex_replace:"/\&desc=1/":""}>">価格順↑</a> <span>価格順↓</span>
              <{else}>
                <span>価格順↑</span> <a href="<{$productlist_sort_price}>&desc=1">価格順↓</a>
              <{/if}>
            <{/if}>
            </li>
            <li class="p-item-sort-list__item">
            <{if $productlist_sort_now != "n"}>
              <a href="<{$productlist_sort_new|regex_replace:"/\&desc=1/":""}>">新着順</a>
              <{else}>
              <span>新着順</span>
            <{/if}>
            </li>
          </ul>
          <!-- // ソート -->

繰り返し文を昇順・降順で表示する

下記コードの2-50行目、98行目が追加行です。

Discoverテンプレートの商品一覧HTML 139行目~

        <!-- 商品リスト -->
        <{if $smarty.get.sort == "p" && $smarty.get.desc == "1"}>
        <ul class="c-item-list">
          <{section name=num loop=$productlist step=-1}>
          <li class="c-item-list__item">
            <div class="c-item-list__img u-img-scale">
              <a href="<{$productlist[num].link_url}>">
                <{if $productlist[num].img_url != ""}>
                <img src="<{$productlist[num].img_url}>" alt="<{$productlist[num].name|escape:'html'}>" />
                <{else}>
                <img src="https://img.shop-pro.jp/tmpl_img/86/no-image.jpg" alt="<{$productlist[num].name|escape:'html'}>" />
                <{/if}>
              </a>
            </div>
            <div class="c-item-list__txt">
              <div class="c-item-list__ttl">
                <a href="<{$productlist[num].link_url}>">
                  <{$productlist[num].name}>
                </a>
              </div>
              <{if !$productlist[num].soldout_flg}>
              <div class="c-item-list__price<{if $members_login_flg && $productlist[num].discount_flg}> is-discount<{/if}>">
                <{* 販売価格(ログイン時は会員価格) *}>
                <{$productlist[num].price}>
                <{* 割引率(ログイン時、通常販売価格と会員価格が異なる場合のみ) *}>
                <{if $members_login_flg && $productlist[num].discount_flg}><{$productlist[num].discount_rate}>OFF<{/if}>
              </div>
              <{* 通常販売価格(ログイン時、通常販売価格と会員価格が異なる場合のみ) *}>
              <{if $members_login_flg && $productlist[num].discount_flg}>
              <div class="c-item-list__price is-strikethrough">
                <{$productlist[num].regular_price}>
              </div>
              <{/if}>
              <{else}>
              <{* 売り切れの表記 *}>
              <div class="c-item-list__price is-soldout">
                SOLD OUT
              </div>
              <{/if}>
              <{* 簡易説明文 *}>
              <{if $productlist[num].s_expl != ""}>
              <div class="c-item-list__expl">
                <{$productlist[num].s_expl}>
              </div>
              <{/if}>
            </div>
          </li>
          <{/section}>
        </ul>
        <{else}>
        <ul class="c-item-list">
          <{section name=num loop=$productlist}>
          <li class="c-item-list__item">
            <div class="c-item-list__img u-img-scale">
              <a href="<{$productlist[num].link_url}>">
                <{if $productlist[num].img_url != ""}>
                <img src="<{$productlist[num].img_url}>" alt="<{$productlist[num].name|escape:'html'}>" />
                <{else}>
                <img src="https://img.shop-pro.jp/tmpl_img/86/no-image.jpg" alt="<{$productlist[num].name|escape:'html'}>" />
                <{/if}>
              </a>
            </div>
            <div class="c-item-list__txt">
              <div class="c-item-list__ttl">
                <a href="<{$productlist[num].link_url}>">
                  <{$productlist[num].name}>
                </a>
              </div>
              <{if !$productlist[num].soldout_flg}>
              <div class="c-item-list__price<{if $members_login_flg && $productlist[num].discount_flg}> is-discount<{/if}>">
                <{* 販売価格(ログイン時は会員価格) *}>
                <{$productlist[num].price}>
                <{* 割引率(ログイン時、通常販売価格と会員価格が異なる場合のみ) *}>
                <{if $members_login_flg && $productlist[num].discount_flg}><{$productlist[num].discount_rate}>OFF<{/if}>
              </div>
              <{* 通常販売価格(ログイン時、通常販売価格と会員価格が異なる場合のみ) *}>
              <{if $members_login_flg && $productlist[num].discount_flg}>
              <div class="c-item-list__price is-strikethrough">
                <{$productlist[num].regular_price}>
              </div>
              <{/if}>
              <{else}>
              <{* 売り切れの表記 *}>
              <div class="c-item-list__price is-soldout">
                SOLD OUT
              </div>
              <{/if}>
              <{* 簡易説明文 *}>
              <{if $productlist[num].s_expl != ""}>
              <div class="c-item-list__expl">
                <{$productlist[num].s_expl}>
              </div>
              <{/if}>
            </div>
          </li>
          <{/section}>
        </ul>
        <{/if}>
        <!-- // 商品リスト -->


2行目の条件分岐 if $smarty.get.sort == "p" && $smarty.get.desc == "1" で、価格降順かそれ以外かを判断しています。
$smarty.getは、URLパラメーター(リクエスト変数)を参照できます。便利です。
詳細は下記マニュアル参照してください。

PHP の予約変数 {$smarty} を使用すると、 環境変数やリクエスト変数にアクセスすることができます。

予約変数 {$smarty} | Smarty


<ul>~</ul>内についてはほぼ同じコードを2回書いています。
ここは商品一覧を表示するコードで価格昇順・価格降順で共通部分です。

唯一、4行目は、step=-1 の有無で、降順・昇順になります。
step=-1は、配列の最後から先頭に向かってループが回ります。
詳細は下記マニュアル参照してください。

stepの値が負の場合は、配列の前方に向かって進みます。

{section},{sectionelse} | Smarty

実装した表示結果

Discoverテンプレートにコードを入れた表示結果です。
価格降順に並んでいるのが見てわかると思います。

表示上の注意点

在庫管理>在庫表示設定の「在庫がある商品を優先して表示する」をチェックしている場合、注意が必要です。

ここをチェックすると、SOLD OUT商品を商品一覧の最後に移動して表示する仕組みですが、降順にすると反対に、先頭に表示されることになります。
この点が不都合であるため、以下のいずれかの設定で利用します。

  • 「在庫がある商品を優先して表示する」をチェックしない
  • 売り切れ時に「商品を表示しない」

おわりに

「在庫がある商品を優先して表示する」をチェックしているショップも多いと思います。
この場合は、今回の価格降順は使えないと考えてよいでしょう。

カラーミーショップの商品一覧と商品検索は、テンプレートの中身が大体同じです。
今回のサンプルコードを参考にすれば、商品検索にも同様に設置できます。

執筆者

えいじ@naeco.jp この記事を書いた人

メーカー系情報システム部門出身の個人事業主。
自作するのが好きですぐに試したくなる、凝り性なWebエンジニア。
カラーミーショップ、モールなどのECについて記事にしています。

ご相談・お問い合わせはこちら