MTS Simple Bookingは、WordPressで予約システムを構築できる便利なプラグインです。しかし、標準機能では予約受付締切を「◯日前」という日単位でしか設定できず、「前日の18時まで」といった時間単位での細かい制御ができません。

今回は、実際のクライアント案件で「前日18時を過ぎたら翌日の予約を受け付けない」という要望に対応したカスタマイズ方法をご紹介します。

問題の背景

MTS Simple Bookingの標準機能では:

  • 予約受付開始の設定は「◯日前」という日単位のみ
  • 「1日前」を選択すると、実際は「前日の0時」から受付開始
  • つまり、前日の0時を過ぎれば、何時でも翌日の予約が可能

カスタマイズの実装

1. カスタマイズファイルの作成

以下の内容で mtssb-booking-custom-accepting.php を作成します:

<?php
/**
 * MTS Simple Booking カスタマイズ - 前日18時締切対応
 * 
 * このファイルをテーマのfunctions.phpか、
 * カスタムプラグインとして読み込んでください。
 */

// 設定画面に「前日18時」の選択肢を追加
add_filter('mtssb_settings_get_booking_margin', 'custom_booking_margin_options');
function custom_booking_margin_options($options) {
    // 既存の選択肢の先頭に「前日18時まで」を追加
    // -1を使用して特別な値として識別
    $custom_options = array(
        '-1' => '前日18時まで',
    );
    return array_merge($custom_options, $options);
}

// プラグイン本体のstart_time計算を直接フックで上書き
add_action('plugins_loaded', 'override_booking_form_calculation', 20);
function override_booking_form_calculation() {
    // 予約フォームのインスタンス化時にstart_timeを調整
    add_action('init', function() {
        $controls = get_option('mts_simple_booking_controls');
        
        // -1(前日18時)が選択されている場合の特別処理
        if (isset($controls['start_accepting']) && $controls['start_accepting'] == '-1') {
            // フィルターを使ってstart_time計算を上書き
            add_filter('option_mts_simple_booking_controls', 
                      'modify_booking_controls_for_18pm_deadline');
        }
    }, 5);
}

/**
 * コントロール値を動的に修正して18時締切を実現
 */
function modify_booking_controls_for_18pm_deadline($controls) {
    if (isset($controls['start_accepting']) && $controls['start_accepting'] == '-1') {
        $current_time = current_time('timestamp');
        $today_18 = mktime(18, 0, 0, date('n'), date('j'), date('Y'));
        
        // 現在時刻に応じて動的に分数を計算
        if ($current_time >= $today_18) {
            // 18時過ぎ:明後日から予約可能(2日 = 2880分)
            $controls['start_accepting'] = 2880;
        } else {
            // 18時前:明日から予約可能(1日 = 1440分)
            $controls['start_accepting'] = 1440;
        }
    }
    
    return $controls;
}

/**
 * 管理画面での表示調整
 */
add_action('admin_footer', 'custom_booking_admin_script');
function custom_booking_admin_script() {
    $screen = get_current_screen();
    if ($screen && $screen->id === 'simple-booking_page_simple-booking-settings') {
?>
    <script>
        jQuery(document).ready(function($) {
            // start_accepting の選択肢が変更されたときの処理
            $('#start_accepting').on('change', function() {
                if ($(this).val() === '-1') {
                    // 説明文を追加
                    if (!$('#previous_18_notice').length) {
                        $(this).after('<p id="previous_18_notice" style="color: #0073aa; margin-top: 5px;">※ 前日の18時を過ぎると翌日の予約ができなくなります。</p>');
                    }
                } else {
                    $('#previous_18_notice').remove();
                }
            }).trigger('change');
        });
    </script>
<?php
    }
}

2. ファイルの設置と読み込み

方法A: プラグインディレクトリに配置

/wp-content/plugins/mts-simple-booking-c/mtssb-booking-custom-accepting.php

方法B: テーマのfunctions.phpで読み込み

// 予約受付締切を「前日18時」までにする
$root_path = $_SERVER['DOCUMENT_ROOT'];
require_once($root_path . "/サイトパス/wp-content/plugins/mts-simple-booking-c/mtssb-booking-custom-accepting.php");

3. 管理画面での設定

  1. WordPress管理画面にログイン
  2. 「MTS予約システム」→「各種設定」→「予約パラメータ」
  3. 「予約受付開始」で「前日18時まで」を選択
  4. 「変更を保存」をクリック

動作の仕組み

タイムラインでの動作例

【17:59の場合】
- 翌日の予約:○ 受付可能
- 翌々日の予約:○ 受付可能

【18:01の場合】
- 翌日の予約:× 受付不可
- 翌々日の予約:○ 受付可能

技術的なポイント

  1. 数値型の値を使用

    • プラグインが数値を期待するため、-1という特殊な数値を使用
    • 文字列を使うと保存時に不具合が発生
  2. 動的な値の変換

    • -1が選択された場合、現在時刻に応じて自動的に適切な分数に変換
    • 18時前:1440分(1日)
    • 18時以降:2880分(2日)
  3. フィルターフックの活用

    • option_mts_simple_booking_controlsフィルターで値を動的に調整
    • プラグイン本体のコードを直接修正せずに実装

カスタマイズの応用

締切時間を変更する場合

17時締切にしたい場合:

$today_18 = mktime(17, 0, 0, date('n'), date('j'), date('Y'));

19時締切にしたい場合:

$today_18 = mktime(19, 0, 0, date('n'), date('j'), date('Y'));

複数の締切時間オプションを追加

function custom_booking_margin_options($options) {
    $custom_options = array(
        '-1' => '前日18時まで',
        '-2' => '前日17時まで',
        '-3' => '前日19時まで',
    );
    return array_merge($custom_options, $options);
}

トラブルシューティング

よくあるエラーと対処法

  1. ファイルが読み込めない場合

    Failed opening required '/path/to/file'
    
    • 絶対パスを使用して読み込む
    • ファイルのパーミッションを確認(644または読み取り可能)
  2. 選択肢が保存されない場合

    • キャッシュプラグインを一時的に無効化
    • データベースのmts_simple_booking_controlsオプションを確認
  3. 時間がずれる場合

    • WordPressのタイムゾーン設定を確認
    • current_time('timestamp')を使用してWordPressのタイムゾーンに合わせる

まとめ

MTS Simple Bookingの標準機能では実現できない「前日◯時締切」という細かい制御を、プラグインのフィルターフックを活用することで実装できました。

このカスタマイズにより:

  • 予約受付の締切時間を時間単位で制御可能
  • プラグイン本体を改変せずに機能追加
  • 管理画面から簡単に設定変更可能

同様の要望がある場合は、このコードをベースにカスタマイズしていただければ幸いです。

注意事項

  • プラグインのアップデート時は動作確認を行ってください
  • 本番環境に適用する前に、必ずテスト環境で動作確認を行ってください
  • カスタマイズによる不具合については、自己責任でお願いします