31
OCTOBER
ウェブTUESDAY 2017 / 10 / 31
酒類販売時、Welcartが発行する納品書に注意書きを記載したい場合
Text by Hiroyuki Matsumoto
※このコードでは動作しなくなっていました @ Welcart 2.5.3
コード中に $is_output_pdf というグローバル変数がなくなっています。
インターネットで酒類を販売する際には色々条件があり、そのひとつに税務署からの販売業免許が必要というものがあります。
すでに公開済みのサイトにて Welcart(通販用プラグイン) の納品書を標準のまま出力していたところ税務署から
という指導が入ったそうです。
というわけで、お酒を購入した場合のみ注意書きを加えるということなのですが、
納品書も わりにスペースが詰まっており、ページ下部に挿入したら一部プリンタでは印字できないんじゃないかなぁということで、
酒類のみ商品名の後ろに注意書きを追加する形にしてみました。
下記が実際に出力してみたものになります。
これをどうやって実現しているか?、というと、フィルターフックだけの処理で何とかなりました。
実際のコード
functions.php に下記のように記述しています。
function add_caution_to_sake($cartItemName, $args){ $addtion = ''; $itemdata = $args['cart_row']; // 現在の商品情報 foreach($itemdata['options'] as $key=>$option){ if($key==='年齢確認'){ $addition = "\r\n ※法律で未成年者の飲酒は禁止されています"; break; } } return $cartItemName . $addition; } add_filter('usces_filter_cart_item_name_nl', 'add_caution_to_sake', 10, 2);
usces_filter_cart_item_name_nl というフィルターフックを利用していますが、これは納品書やメールに掲載する商品名を変更するためのフィルターフックです。引数には下記のような値が入っています。
- $cartItemName: 印刷する商品名が入っている変数
- $args: さまざまな変数をまとめた連想配列。
- $args[‘cart’]: その買い物時のすべての商品情報
- $args[‘cart_row’]: 現在印刷しようとしている商品情報
- $args[‘post_id’]: 現在印刷しようとしている商品の投稿ID
- $args[‘sku’]: 現在印刷しようとしている商品のSKU
商品がお酒かどうか判定する方法について
このサイトでは酒類の商品のみ、購入時に「私は20歳以上です」というチェックボックスをONにしないと購入できないようにしてあります(これも税務署の指導)。
これは Welcart の商品のオプションの仕組みで対応しています。
商品の編集画面にこんなふうに設定しています
この商品オプションは酒類のみにしか設定していないため、今回はこれを使って酒類判定するようにしました。
このコードでは、$args[‘cart_row’] にある情報から商品オプションを取得して、オプション名が “年齢確認” かどうかを調べることでお酒かどうか判定しています。
もしもカテゴリで判定するように作っているのであれば、$args[‘post_id’] で商品の投稿IDが取得できますので、そこからget_the_category関数などを用いて判定すればよいです。
副作用について
注文確認メールにも同様の記述がついてしまう副作用があります。
もしこの症状を回避したいのであれば、もうすこしコードを改造する必要があります。
メール問題を回避するコード
/* 納品書で酒類のみ注意書きを追加する処理 */ function add_caution_to_sake($cartItemName, $args){ global $is_output_pdf; $addtion = ''; if($is_output_pdf){ $itemdata = $args['cart_row']; // 現在の商品情報 foreach($itemdata['options'] as $key=>$option){ if($key==='年齢確認'){ $addition = "\r\n ※法律で未成年者の飲酒は禁止されています"; break; } } } return $cartItemName . $addition; } add_filter('usces_filter_cart_item_name_nl', 'add_caution_to_sake', 10, 2); /* 現在が印刷処理中かどうか判断してグローバル変数に状態保存する */ function is_pdf_out_process($fontsizes, $args, $data ){ global $is_output_pdf; $is_output_pdf = true; return $fontsizes; } add_filter('useces_filter_order_pdfbody_fontsize', 'is_pdf_out_process', 10, 3);
useces_filter_order_pdfbody_fontsize のアクションフィルターはメール送信時には実行されない処理です。(PDFファイル内のフォントサイズを指定する処理)
そこでグローバル変数に状態を保存し、PDF生成処理時のみ注意書きを追加するようにしています。
というわけで、意外と少ないコード量で対応することができました。
TEXT by
松本 博之(まつもとひろゆき)
1978年、鳥取県米子市生まれ。
株式会社マジックワード WEBシステムの開発・運用を担当。
WordPressの実績多数。表面的な使用方法を把握するだけでなく、WordPressのソースコードを読み解いて対応できます。
国家資格の応用情報処理技術者をなんとなくとりました。