welcartの必須項目のカスタマイズ

今回取り上げるのはwelcartの必須項目のカスタマイズについてです。

「送付先の郵便番号だけ必須項目から外したい」
こういう案件の依頼があったので調べてみました。

今回フィルターフックのみで処理しています。

welcartの必須項目の設定

welcartの必須項目はグローバル変数$usces_essential_markで設定されている。

中身は

name1:”<em>*</em>”
name2:””
name3:””
〜省略〜
zipcode:”<em>*</em>”
〜省略〜

こんな感じの連想配列

<em>*</em>が入っているのが必須項目で、空なのはそうではないもの。

フォームから次への流れ

フォームに入力して「次へ」ボタン操作でバリデーション処理スタート。

classes/usceshop.class.phpの
delivery_check関数

が呼ばれる。

その関数内で呼ばれるのが

functions/function.phpの
usces_is_required_field関数

この中でグローバル変数$usces_essential_markをチェックしている。

usces_is_required_field(‘zipcode’)
こんな感じで引数がついて、$usces_essential_markの中の’zipcode’を調べる。

<em>*</em>が設定されていれば、それは必須項目。

こういう流れでバリデーション処理されている。

$usces_essential_markの一時的変更

このusces_is_required_field関数内には
usces_filter_essential_markというフィルターが用意されている。
その引数は$usces_essential_mark。

つまり$usces_essential_markをここで一時的に加工する事が出来る。

あくまで一時的に加工で、グローバル変数$usces_essential_mark自体は変えられない。

このusces_filter_essential_markフィルターで$usces_essential_markを取ってきて、

その中の$usces_essential_mark[‘zipcode’]の中身を空にして$usces_essential_markを返してやる。

usces_is_required_field関数で返ってきた$usces_essential_markを処理すると、
$usces_essential_mark[‘zipcode’]は空なので「必須項目ではない」という判定がされる。

これで「郵便番号が空白」でもエラーにならない。

デリバリー(送付先)の郵便番号だけ必須項目から外す

郵便番号だけ必須項目から外すのは出来たがこれではカスタマーの郵便番号も必須から外れてしまう。

さあどうするか?

ページIDか、スラッグで判断する?

それは出来ない。
カート内のページはどれも同じURLでコンテンツだけ必要なものが読み込まれる仕様だからだ。

デリバリーページのバリデーションが呼ばれる時に特有な何かがないか探してみた。

デリバリーページの「次へ」ボタンでバリデーション処理が呼ばれるのだが、

その時だけ、$_POST[‘confirm’]が存在するのが確認出来た。

その中身は文字列”「次へ」”だった。

これを条件にしてその時だけ$usces_essential_mark[‘zipcode’]の中身を空にする仕様にした。

うまくいった。

カスタマーページの郵便番号は必須のままで、デリバリーページの郵便版番号の必須は外す事が出来た。

必須項目である「*」マークの削除

あとは必須項目である「*」マークの削除だけ。

これは適当にcssで取るとかjsで取るとかすればいい。

今回使ったのは$usces_essential_markを使う手。

デリバリーページの冒頭で、

global $usces_essential_mark;
$usces_essential_mark[‘zipcode’]=”;

として一時的に$usces_essential_mark[‘zipcode’]を空にする。
global変数 $usces_essential_mark自体を変更していないので、
usces_is_required_field関数には影響しない。

だが、フォームパーツを出力するところではこの一時的な$usces_essential_markを参照していた。

なので$usces_essential_mark[‘zipcode’]は空なので「*」マークはつかない。

これで完成だ。

変更したファイル

今回はフィルター処理をテーマのfunctions.phpに書いて,

テーマ内のwc_template内のcart/wc_delivery_page.phpをちょこっとだけ変更した。

プラグインのコアファイルはいじってないのでプラグインアップデートをしても大丈夫だ。

コアファイルはいじってないからプラブイン自体壊れる事はないが、参考にする方はあくまでも自己責任でお願いします。

プラグインのカスタイズの依頼は「お問い合わせ」からお願いします。