【Calculated Fields Form】WordPressのフォーム上で計算をさせよう!

みなさん、こんにちは。
いしかわつかさです。

今回はWordpressのフォーム上で計算を自動でやる方法を紹介したいと思います。

仕事であったらいいなと思った事が発端で、シンプルで導入しやすいという理由から
「Calculated Fields Form」を選択しました。

複雑な計算も出来そうなので、Excelに似た使い勝手です。全て英語なのでそこはちょっと慣れが必要ですが。

テスト用に作ったのは左図です。
サイズをドロップダウンで選択し、数を入力したら、結果に金額が表示されるというシンプルなモノです。

目次

Calculated Fields Form インストール

まずはCalculated Fields Form をインストールしましょう。WordPressのダッシュボードから、プラグイン → 新規追加 → 右上の検索窓で「Calculated Fields Form」と検索します。
インストールした後、有効化します。

「Calculated Fields Form」の設定

①の設定画面から、②で新規作成をおこないます。
③に追加されますので、④で設定を行っていきます。
⑤はショートコードとなっており、完成後ここをコピーして使用します。

インストール時点では、サンプルフォームが5つ用意されていますのでそれで動作確認を行い、
理解するのもいいと思います。

フォーム編集画面

新規作成して「Settings」をクリックすると「Add a Field」画面が開きます。
これから①~⑤の手順で簡単なテストデータを作成していきます。

Field Settings フォームコントロールの編集

①のタイトルを編集してみます
ここでは、From Name を「テスト用 計算式」と入力し、
Description は空白にしました。

Field を編集する

②のfieldを編集していきます。
ここは、数字の入力フィールドになります。
この fieldname2 というのは、計算時に必要な情報になります。
Field Label ですが、変更しなくても良いのですが、
テストなので「数」に変更します。

Separaorを編集する

③のセパレーターを編集します。
②と同じようにField Settingで編集します。
点線のセパレーターの下に文字が入っていますが、今回は不要なのでそこをさくじょします。

Dropdown を追加する

Add a Field に移動し Dropdown をクリックして追加します。
Fieldname3 が追加されるので、それをドラッグして Fieldname2 の上に移動させます。

Dropdown を編集する

④Dropdown を編集します。ラベルは「サイズ」とします。

その下の方にあるChoicesで情報を追加編集します。
Text はリスト上に表示される名称になり、
Valueは実際の計算に使う数値となります。

特別数字に意味はないですが、左図のように登録しました。

計算をさせる

⑤Field Labelを「結果」に変更します。
そして、「Set Equation」に計算式を入力します。今回はシンプルに掛け算です。
「fieldname2 * fieldname3」

最後に Preview のボタンが設定画面下と右上にあるので挙動を確認しましょう。

計算結果に任意の文字を表示したい場合は、「Symbol to display at the end of calculated field」を編集して下さい。
今回の場合「円」にしています。

バグ??計算結果がおかしい。

設定が終わって動作確認をしていると、何やら様子がおかしい。
今回試した数式は非常に簡単。だがしかし、ありえない結果が出た。

計算式 0.6×6

3.5999999999999996

になりました。なぜ??
と思いながらも、深く考えずに小数点第3位を四捨五入して切り上げる事で解決する事にしました。

具体的には関数で prec を使用しました。
これは指定した小数部分の位になるように四捨五入してくれます。

計算式 prec (0.6×6 , 2)

3.60

結果としては解決しました。

が、納得できなかったので、色々調べた結果、
どうやらJavaScriptの仕様のようです。 ← 間違っていたら教えて下さい。

JavaScriptでは、小数を四則演算すると微妙な誤差が生じるようで、結果的には解決しませんでした。
正確には解決方法はあります。decimal.js をなんやするようで、現段階ではそんな難しい計算はさせないので良しとしました。avaScriptの数値型はIEEE754 倍精度浮動小数点数(double)の1種類のみで、どうしても誤差が出るようです。浮動小数点数の仕様であり、コンピューターで小数を表そうとする限り避けようのない問題みたいです。

問題は、小数で計算をさせない事なので、試しに、

計算式 (60 x 6 ) / 100

3.60

上記のように、正しく計算がされました。

もっといろいろな計算をするタイミングが来るとともうので、来るかな?その時にこの問題も解決したいと思います。

Calculated Fields Formで使える関数と条件式

複雑な計算をさせるつもりなので、その時の為にまとめておきます。

よく使いそうな関数

sum (x, y, z, ….)パラメータによって渡された値の
合計を返します
sum (3, 10, 11) は
24 を返します
average (x, y, z,….)パラメータによって渡された値の
平均を返します
average (3,10,11) は
8 を返します
concatenate (x, y, z, ….)すべてのパラメータが連結された
テキストを返します
concatenate (1, 2, 3) は
123 を返します
prec (x, y)x を y で指定した小数点以下の
桁数になるように四捨五入して
返します
prec (10.3365, 2) は
10.34 を返します
prec(10,2) は
10.00 を返します
floor (x)xを返し、最も近い整数に
切り捨てられます
fieldname1の値が1.6の場合
floor (fieldname1) の結果は1
floor (2.6、0.5 ) =2.5 になります
remainder (x, y)余りを返します
余りは、ある整数を別の整数で除算して
整数商を生成した後に残った整数です
remainder(7,2)は
1 を返します
abs (x)xの絶対値を返しますfieldname1の値が-7.25の場合
abs (fieldname1) の結果は
7.25 になります
ceil (x)最も近い整数に切り上げられた
xを返します
fieldname1の値が1.4の場合
ceil (fieldname1) の結果は2
ceil (2.3, 0.5) = 2.5 になります
max (x, y, z, … n)値が最も大きい数値を返しますfieldname1の値が5で
fieldname2が10の場合
max (fieldname1, fieldname2) の
結果は 10 になります
min (x, y, z, … n)最小値の数値を返しますfieldname1の値が5で
fieldname2が10の場合
min (fieldname1, fieldname2) の
結果は 5 になります
random ()0 から 1 の間の乱数を返します
round (x)xを最も近い整数に丸めます。ieldname1の値が2.5の場合
round (fieldname1) の結果は3
round (2.3, 0.5) = 2.5になります
cdate (x, y)日付のようにフォーマットされた
数値xを返します
2番目のパラメーターは
出力日付のフォーマット
( ‘mm / dd / yyyy’ , ‘dd / mm / yyyy’ )を
定義します
数字は1970年1月1日からの
日数を表します
fieldname1が日付フィールドであり
その値が2013年11月3日の場合
cdate (fieldname1 + 10) は
2013年11月13日になります

他の記号を知りたい方はこちら(英語)
※Equations and operations – Mathematical operations

使用出来る条件式

IF (条件, trueの場合は値, falseの場合は値) 条件が満たされているかどうかを確認し、trueの場合は1つの値を返し、falseの場合は別の値を返します。
IF( logical_test, value_if_true, value_if_false)
fieldname1の値が10で、fieldname2の値が20の場合、結果は次のようになります。
IF (fieldname1 <fieldname2、fieldname1, fieldname2)
は10になります
AND (x, y, z, ….)すべての引数がtrueであるかどうかを確認し、すべての値がtrueの場合はtrueを返し、別の方法ではfalseを返します。 AND (logical1, logical2, …)fieldname1、fieldname2、fieldname3の3つのフィールドがあり、それぞれ値が10, 20, 30であるとします。
AND (fieldname1 <100, fieldname2 <100, fieldname3 <100)
はtrueになります
しかし
AND (fieldname1 <100, fieldname2 <100, fieldname3 <25)
は falseです。これは, fieldname3が25より大きいためです。
OR (x, y, z, ….)引数のいずれかがtrueであるかどうかを確認し、いずれかの値がtrueの場合はtrueを返し、すべての値がfalseの場合はfalseを返します。 OR (logical1, logical2, …)fieldname1, fieldname2, fieldname3の3つのフィールドがあり、それぞれ値が10、20、30であるとします。
OR (fieldname1 <100, fieldname2 <100, fieldname3 <25)
はtrueです。これは、3番目の条件が失敗した場合を含め、少なくとも2つの初期条件がtrueであるためです。
しかし
OR (fieldname1 <5, fieldname2 <5, fieldname3 <25)
は、3つの条件が失敗するため、falseです。
NOT (x)falseをtrueに、またはtrueをfalseに変更します。NOT (論理)NOT (true) falseを
返す
NOT (false) true
を 返します
IN (x, [x, y, z, ….])用語が2番目の引数に含まれているかどうかを確認します。2番目の引数は文字列または文字列配列の場合があります。 IN (用語、文字列/配列)IN (10, [10,20,30,40]) true
を 返す
IN (‘world’, ‘hello world’) true
を 返す

まとめ

Excelの延長戦上にあるような計算式の記述の仕方なので、これはみんなが使いやすいと感じた。
こんな簡単にプラグインで実装出来るので、ほんまに便利。こういうことって本来もっと難しいはず。
主に仕事での利用になると思いますが、色々使っていきたいです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次