読者です 読者をやめる 読者になる 読者になる

Life is Really Short, Have Your Life!!

ござ先輩の主に技術的なメモ

Welcartで特定のSKUに限りオプションが必要な場合の対処法

洋服の注文を請けるネットショップで、既成品の場合はサイズ指定してもらえればいいけれどもオーダーメイドの別注品を請けたいという要望があった。

要はS/M/L・・・では足りない場合で、それ以上のサイズを求めている場合は別注で請けることも許可するという変わった要望を先方から依頼があった。

商品に共通オプションを登録しておいて、該当のSKUの場合に限りそれを表示するような設定にすればイケることがわかりました。以下簡単な手順です。

1. 基本設定よりオプションを登録する

オプションを登録しておかないと商品のメンテ画面で選ぶことが出来ませんのでご注意を。

2. 商品詳細ページのテンプレをカスタマイズする。

wc_templates/wc_item_single.phpをカスタマイズします。雰囲気をつかんで下さい。だいたい105行目ぐらいです。

<?php if (usces_is_options()) : ?>		
            <!-- ここで条件分岐-->
	    <?php if(preg_match('/TEST/i',usces_the_itemSku('return'))):?>
               <div>
            <?php else:?>
               <div style="display:none;">
	    <?php endif;?>
	    <table class='item_option'>
         	<caption><?php _e('Please appoint an option.', 'usces'); ?></caption>
	        <?php while (usces_have_options()) : ?>
           	<tr>
	          	<th><?php usces_the_itemOptName(); ?></th>
		        <td><?php usces_the_itemOption(usces_getItemOptName(),''); ?></td>
           	</tr>
	        <?php endwhile; ?>
	    </table>
            </div>
<?php endif; ?>

複数SKUと単一SKUでループロジックが大きくIFで分岐されているので気をつけて下さい。まずはそこを探します。

で、usces_is_options()といういかにもオプションの存在チェックをしている関数がありますので、その中で今回はSKUコードによって分岐しました。TESTというSKUコードが含まれる場合にのみ、オプション表示するという対処法を取りました。

divによるcss表示切り替えを行っている理由は、welcartのカート管理の仕様でオプションを表示する場合は全てのSKUにHTMLソースとしてレンダリングしないと、カートの注文内容配列の順序が狂うらしく、カートの更新や削除に不具合が生じるためです。

SKUコードを取得するusces_the_itemSku()という関数ですが、引数に'return'という文字列を設定しないとHTMLエスケープされた文字がそのままechoされるので、永遠にpreg_matchがfalseになります。引数の文字列'return'を入れないと戻り値がありませんので、気をつけて下さい。Welcartプラグイン自体のコードuse-e-shop/functions/template_func.phpにオリジナルコードがありますのでご参照下さい。

というか、この設計をするぐらいなら初めからhtmlエスケープされたコードを返すだけにして、echoするかしないかをtrue/falseで引数に与えるほうがマシだと思う。