MW WP Formで独自のバリエーションルールを設計

WordPressにて運用しているサイトのフォームで入力確認画面を出したいケースがあり、MW WP Formを再度研究してみました。以前トライした時は上手く確認画面が表示されなかったのですが、最近WordPressプラグインを書いたことで以前よりもWordPressの理解が深まっていたので、入力画面〜確認画面〜完了画面まで無事表示させることができるようになりました。

そこで、今サイトにあるフォームをMW WP Formに置き換えるための練習をしてみました。具体的には姓・名を入力するテキストフィールドと学年を選択するセレクトボックスを配置したフィールドです。姓・名を分けなくてもよいのでは?という話も出そうですが、姓と名を確実に入力してほしい・姓と名の区切りを間違いなく認識したい等、学校の事情があります。姓・名はともかく、学年までひとまとめにしないで、fieldset, legend, label, input, selectを正しく組み合わせて使えという話か…。(ただ、引き継いで運用しているサイトで新規構築・リニューアルではないので今HTML/CSSまで大きく手を入れるのがちょっと大変。)

そして、姓・名が確実に入力されているかをチェックしたいのですが、フィルターフック「mwform_validation_mw-wp-form-xxx」の公式解説と「MW WP Form 複数のエラーメッセージを1つにまとめる方法 | Recooord」を参考に書いてみました。その際、姓・名のチェックがこのサイトでは何度も出てきそうなので再利用しやすくすること、そしてclassを定義して関数名がぶつかることを気にしなくても良いように工夫してみました。

<?php
namespace Sample_Web;

if ( ! defined( 'ABSPATH' ) ) {
    die( 'Invalid request.' );
}

class MWWPForm_Validations {
    public function __construct() {
        $hostname = gethostname();
        if ( 'sv161.xbiz.ne.jp' === $hostname ) {
            // 本番環境
            // TODO: 後で設定する
            $contact_form = null;  
        } else {
            // 開発環境
            $contact_form = 1001;
        }

        // お問い合わせフォームのバリデーション
        add_filter( "mwform_validation_mw-wp-form-{$contact_form}", array( &$this, 'contact_validation' ), 10, 2 );
    }

    /**
     * 姓・名のバリデーション
     * @param object &$validation
     * @param array $data
     * @param string $message エラーメッセージ
     * @param string $field_basename name属性値の共通部分
     */
    private function set_name_rule( &$validation, $data, $message, $field_basename ) {
        if ( empty( $data[ "{$field_basename}_sei" ] ) ) {
            $validation->set_rule(
                "{$field_basename}_sei",
                'noempty',
                array( 'message' => $message )
            );
        } elseif ( empty( $data[ "{$field_basename}_mei" ] ) ) {
            $validation->set_rule(
                "{$field_basename}_mei",
                'noempty',
                array( 'message' => $message )
            );
        }
    }

    /**
     * お問い合わせフォームのバリデーション設定
     * @param object &$validation
     * @param array $data
     * @param string $message エラーメッセージ
     * @param string $field_basename name属性値の共通部分
     */
    public function contact_validation( $validation, $data ) {
        $message = '姓・名を正しく入力してください。';
        $this->set_name_rule( $validation, $data, $message, 'name' );
        return $validation;
    }
}

new MWWPForm_Validations();

おそらく開発環境と本番環境でフォームのIDに差が生じるので、ホストネームを利用して別々に記述できるようにしました。また、姓・名のテキストフィールドのname属性値はfoo_seifoo_meibar_seibar_meiのように前半部分(basename)が同一、その後ろに姓なら_sei、名なら_meiと付けるように定義しました。そうすれば、$this->set_name_rule( $validation, $data, $message, 'foo' );とか$this->set_name_rule( $validation, $data, $message, 'bar' );のように簡単にバリデーションの追加が実現できます。

エラーメッセージの表示箇所をひとまとめにしていてメッセージも同じであれば、2回もset_ruleしなくても良いかも。まだまだ工夫の余地はあるかもしれません。