SOY Shopを利用しているやまどうぐレンタル屋さんから下記のような質問があった。


商品一覧ページで、


yamarent_item_list_sort

フルサポート12点セット(女性用) - 富士登山・登山用品レンタルなら専門で安心「やまどうぐレンタル屋」


標準設定として、

並び順を価格の昇順(価格が安いものから順に表示)にしたいけれども、


yamarent_item_list_sort_tent

テント・ツェルト - 富士登山・登山用品レンタルなら専門で安心「やまどうぐレンタル屋」


テントの商品一覧ページの場合は使用人数の降順(使用人数が多いものから順)


yamarent_item_list_sort_schlaf

シュラフ - 富士登山・登山用品レンタルなら専門で安心「やまどうぐレンタル屋」


シュラフの商品一覧ページの場合は使用温度の昇順(使用温度が低いものから順に表示)

のようにカテゴリ毎に並び順を変えることは可能か?

というものがありました。


各々毎に商品一覧ページを設け、

商品一覧設定でソートの設定を分けるといった対応であれば可能であるが、


この場合、

例えば一番上の標準パターンのURLがhttps://example.com/shop/item/list/fullだった場合、

テントやシュラフはhttps://example.com/shop/item/list2/tent

のように最後のエイリアスの違い以外でもURLを変えなければならない。


これだとSEO上も何かと困るだろうから、

カスタムフィールドとsoyshop.item.list拡張ポイントを組み合わせて回避することにした。




最初の問題になるのが、

テントやシュラフにある並び替えの条件を使用人数や使用温度といった商品用のデータベース(実際はテーブル)にないカラムを使うことだ。


この問題はカスタムフィールドにある機能で解決出来る。

テントに焦点を絞って説明を続けると、


sort_tent


項目名を最大使用人数【テント用】、項目IDをsort_tent、項目種別を一行テキストにして項目を作成する。

作成後に高度な設定を開き、


sort_tent1


ソートに使用するにチェックを入れて更新する。


この処理によって、

商品用のデータベース(soyshop_itemテーブル)にcustom_sort_tentというカラムが追加される。

今回は並び順を数字にしたいので、


CLI等でデータベースを直接開き、

use "SOY Shopで使用しているデータベース名";
ALTER TABLE soyshop_item MODIFY COLUMN custom_sort_tent INTEGER;

を実行して、型を数字にしておく。


これでデータベース側の並び順の変更は終了。




続いて、

同一のページでカテゴリによって異なる並び順の設定にする方法に移る。

表示しているカテゴリによって並び順設定を出し分ける為に、

soyshop.item.list拡張ポイントを利用する。


話を進める前に拡張ポイントについてわからないということであれば、

下記の記事を先に読んでおくことをおすすめします。

SOY Shopプラグインの拡張ポイントについて


拡張ポイントを使う為には新規でプラグインを開発しなければなりません。

今回は変則的なソートという意味でanomalous_sortというプラグインを開発します。


下記はanomalous_sortのファイル構成になる。

soyshop
└── webapp
    └── src
        └── module
            ├── features
            │   └── anomalous_sort
            │       └── module.ini
            └── plugins
                └── anomalous_sort
                    └── soyshop.item.list.php

ファイル構成が決まったので、各ファイルを見ていく。

はじめにmodule.iniはプラグインの設定ファイルになるので、

下記のように用意しておく


module.ini

[anomalous_sort]
name="変則的な並び順プラグイン"
type="list"
description="変則的な並び順を実現します"
version="0.1"
link=""
label=""

続いて、

本題となる拡張ポイントsoyshop.item.list.phpは下記のようになる。

soyshop.item.list.php

<?php
class AnomalousSortItemList extends SOYShopItemListBase{

	function getSort(){
		$pathinfo = $_SERVER["PATH_INFO"];

		//テントの商品一覧ページを開いている時
		if(strpos($pathinfo, "/tent") > 0){
			return array("sort" => "custom", "csort" => "sort_tent", "suffix" => " desc");
		
		//シュラフの商品一覧ページを開いている時
		}else if(strpos($pathinfo, "/schlaf") > 0){
			return array("sort" => "custom", "csort" => "sort_schlaf", "suffix" => "");
		}

		//変則的な条件が無い場合はnullを返す
		return null;
	}
}

SOYShopPlugin::extension("soyshop.item.list", "anomalous_sort", "AnomalousSortItemList");

soyshop.item.list拡張ポイントにあるgetSortは商品一覧ページのソートの設定を変則的に決めることが出来るメソッドで

array("sort" => "", "csort" => "", "suffix" => "")の形で返すか、

設定をいじらなければnullを返せば良い。


返り値の第一引数のsortはnameやpriceといった商品用テーブル(soyshop.item)のカラムを指定すれば良い。

もしカスタムフィールドのカラムを並び順に指定したい場合は、

sortの値をcustomにして、csortの方で作成したカスタムフィールドの項目名を指定する。


最後のsuffixは昇順か降順のどちらか?を指定することになっていて、

「 desc」であれば降順で空文字であれば昇順となる。


実は今回のような開発者にとって都合の良い隠しの拡張ポイントというものが沢山あります。

もし自身のサイトで変則的な何かを行いたいという場合は、

とりあえず可能であるかを把握するためにご連絡下さい。

※出来ればフォーラムへの投稿の方がありがたいです。