予約の入力フォーム画面で、追加したオプション項目に対して利用者が入力した結果により、PayPalボタンか予約ボタンのどちらか一方を表示するようにしたい、あるいはオプション項目で入力されたデータを独自にチェックしたい場合があります。

Ver.1.13では、予約入力フォームのプログラムに新たなメッセージフィルターを追加して 、サイト提供者が独自のチェックや表示ができるようになりました。

具体的な例を見ながら使い方を説明します。

クーポンを使った予約受付と予約ボタンの表示切替

オプション項目

クーポンは新規お客様やリピーターを獲得するため、いろいろな形で利用されています。ここではメールでクーポンコード「12345」を知らせ、予約時にクーポンコードを入力すると200円のディスカウントを特典として提供する予約フォームを用意します。

ボタン表示

また支払いがPayPalか銀行振込かにより、予約ボタンの表示をどちらか一方のみ表示するようにします。

 オプション項目の入力チェックを独自に用意する

オプション項目の入力チェックは、本システムでは必須入力チェックしか用意されておりません。

今回の例ではメールで送信したクーポンコードを、オプション項目の「テキスト」タイプで受け取って確認するようにします。が、コンピュータで入力データを比較する場合、困ったことに同じ数字でも半角と全角では異なるものとして判定されてしまいます。

そこで入力データとして半角数字以外はエラーメッセージ「半角数字で入力して下さい。」を表示し、予約確認画面へ遷移しないようにします。

オプション項目のエラー表示

メッセージフィルター名は「mtssb_option_validate_項目のキー名」

メッセージフィルター関数を用意する場合、フィルター名は「mtssb_option_validate_」の後ろにオプション項目を登録した際入力した「項目のキー名」を付加します。

今回は3項目が登録されています。

オプション項目リスト

 

チェックする入力項目はクーポンコードで、項目のキー名は「code」です。ですのでフィルター名は「mtssb_option_validate_code」となります。

メッセージフィルター関数に渡される引数は2つあり、1番目はデフォルトのチェック結果で次の配列データになります。

array(
    'result' => true,
    'message' => ''
);

2番目は当該オプション項目の入力値と予約品目のIDの配列データになります。

array(
    'value' => xxx,
    'aid' => yyy
);

入力チェックはこの「xxx」の値をチェックするようにします。

サンプルプログラムは本記事の最後に、テーマの「functions.php」に追加する全プログラムをまとめましたのでご覧下さい。

オプション入力値の確認とメッセージ表示、オプション入力値の変更

今回、考え方が一番複雑になります。プログラム処理の流れに沿って用意されたメッセージフィルター機能を利用します。

処理の流れとメッセージフィルター

予約確認ボタンが押されて次の画面が表示されるまで、以下のように順番に処理が実行されます。

  1. 入力項目のチェック
  2. 確認画面の表示
    ・予約日時、予約人数の表示出力
    ・オプション項目の表示出力
    ・料金リストの表示出力
    ・同意事項の表示出力
    ・ボタンメッセージの表示出力
    ・予約ボタンの表示出力

オプション項目の入力チェックは、1の処理中にメッセージフィルターが呼び出されます。

確認画面の表示では、出力項目に対して次のようなメッセージフィルターが用意されています。

確認画面のメッセージフィルター

オプション入力値の書き換え

ところで、クーポンを利用することでディスカウント料金を計算することはできますが、クーポンコードが誤っているならディスカウントを適用したくない場合はどうすればいいのでしょうか?

その場合の確認画面として次のように、クーポンを「使用しない」に書き換え、その理由を予約ボタンの前に表示できるようになっています。

予約入力確認画面

クーポンが使用されないように入力値を書き換えたことにより、料金リストにディスカウント項目が掲載されなくなりました。

このオプション項目の入力値の書き換えは、処理の流れ2で、最初に実行されるメッセージフィルター「mtssb_confirm_option_manage」機能を利用して実現するようになります。

このメッセージフィルターには2つの引数があります。1番目はnull、2番目は入力されたオプション項目値の配列とこの予約品目のIDです。

2番目のパラメータは次のような配列になってます。

array(
    'aid' => rrr,
    'options' => array(
        'coupon' => xxx,
        'code' => yyy,
        'payment' => zzz
    )
);

options配列は、それぞれのオプション設定により内容が変わります。

またオプション値の書き換えは、オプション項目のキー名と値の配列で返して下さい。例えば、今回の「クーポンを使用しない」場合は次のような配列を返します。

return array(
    'coupon' => ''
);

メッセージフィルターは通常出力表示される内容を書き換えるものですが、このメッセージフィルターはオプション項目と入力値の配列が返されるとそれに書き換えるもので、特殊なメッセージフィルターとなります。

セットされる値によりエラーが発生する等、動作に影響を与えることがありますので、作業者はPHPプログラムを理解して使用する必要がありますのでご留意下さい。

 処理について

各メッセージフィルターでの処理内容を示します。

  1. mtssb_confirm_option_manageフィルター
    ・code項目に入力された値とクーポンコード「12345」を比較する。
    ・不一致であればcoupon項目に入力された「use」をクリアする。
    ・予約ボタンの前に表示するメッセージを用意する。
  2. mtssb_confirm_button_messageフィルター
    1で用意したメッセージを返す。
  3. mtssb_paypal_button_outフィルター
    payment項目の値が「by_paypal」ならtrueを返す。
  4. mtssb_booking_button_outフィルター
    payment項目の値が「by_bank」ならtrueを返す。

オプション項目の入力値について

入力タイプが数値入力やテキスト入力は、キー入力された値になります。が、チェックボックスやラジオボタンやセレクトボックスはどうでしょうか?

以下は、クーポン使用のチェックボックスと支払い方法選択のセレクトボックス項目の設定画面です。

クーポン使用チェックボックス

クーポン使用のチェックボックスの設定

支払い方法セレクトボックス設定

支払い方法セレクトボックスの設定画面

ラジオボタンやセレクトボックスは、選択肢を1つにするため、キー名で設定した値が入力値として設定されます。

チェックボックスの場合は複数選択が可能なため、選択されたキー名が「カンマ区切り」で設定されます。が、今回は1つしかないため、チェックされなかった場合は「空」が設定されることになります。

 functions.phpに追加するプログラム

// クーポン入力チェック
add_filter('mtssb_option_validate_code', 'validate_code', 10, 2);
function validate_code($check, $param)
{
    if (!empty($param['value']) && !preg_match('/^[0-9]+$/', $param['value'])) {
        $check['result'] = false;
        $check['message'] = '半角数字で入力して下さい。';
    }

    return $check;
}

// クーポン判定
$button_message = '';
add_filter('mtssb_confirm_option_manage', 'option_manage', 10, 2);
function option_manage($options, $param)
{
    global $button_message;

    if (isset($param['options']['code']) && $param['options']['code'] != '12345') {
        $options['coupon'] = '';
        $button_message = 'クーポンコードが無効のため割引をご利用いただけません。';
    }

    return $options;
}

// 予約ボタン表示前のメッセージ
add_filter('mtssb_confirm_button_message', 'button_message', 10, 2);
function button_message($message, $param)
{
    global $button_message;

    if (!empty($button_message)) {
        return $button_message;
    }
    return $message;
}

// 予約ボタン表示切り替え
add_filter('mtssb_paypal_button_out', 'paypal_button', 10, 2);
function paypal_button($bool, $param)
{
    if (isset($param['options']['payment']) && $param['options']['payment'] != 'by_paypal') {
        return false;
    }

    return $bool;
}

add_filter('mtssb_booking_button_out', 'booking_button', 10, 2);
function booking_button($bool, $param)
{
    if (isset($param['options']['payment']) && $param['options']['payment'] != 'by_bank') {
        return false;
    }

    return $bool;
}

クーポン入力値の判定により独自メッセージを表示するため、一旦グローバル変数「$button_message」にメッセージをセットし、mtssb_confirm_button_messageフィルターでそれを表示するようにしました。プログラムの作り方は1つだけではありませんので適宜変更して下さい。

上記リストのメッセージフィルターに渡される2番目のパラメータは、全て「オプション入力値の書き換え」で説明した予約品目IDとオプション項目入力値がセットされた配列となります。