1. HOME
  2. WordPress
  3. 【MW WP Form】大量のフォームでも安心!エラーメッセージを共通化して管理を劇的に楽にする方法
WordPress - 2023-05-23

【MW WP Form】大量のフォームでも安心!エラーメッセージを共通化して管理を劇的に楽にする方法

Webサイト制作で頻繁に利用されるWordPressのフォームプラグイン「MW WP Form」。
非常に高機能で便利な一方、多数のフォームを運用する場面で、ある課題に直面することがあります。

それは、エラーメッセージの管理です。

例えば、イベントごとに参加申し込みフォームを複製して使ったり、複数のサービスごとにお問い合わせフォームを用意したりする場合、フォームごとに同じ内容のエラーメッセージを設定するのは非常に手間がかかります。
さらに、後からメッセージの文言を修正したくなった場合、全てのフォームを一つひとつ修正しなければならず、設定漏れのリスクも高まります。

この記事では、そんな悩みを解決するために、データベース(DB)からMW WP Formで作成された全てのフォーム情報を取得し、共通のエラーメッセージを動的に設定するという、スマートな方法を詳しく解説します。

なぜエラーメッセージの共通化が難しいのか?

通常、MW WP Formで特定フォームのエラーメッセージをカスタマイズするには、functions.phpに以下のようなフィルターフックを記述します。

// 'mw-wp-form-123'の部分がフォームのキー
add_filter('mwform_error_message_mw-wp-form-123', 'my_error_message_function', 10, 3);

このmw-wp-form-123というformkeyは、フォームの投稿IDに依存しています。つまり、フォームを複製すると新しい投稿IDが割り当てられ、formkeymw-wp-form-456のように変わってしまいます。

そのため、フォームが増えるたびに新しいadd_filterを追記する必要があり、コードが冗長になり、メンテナンス性が著しく低下してしまうのです。

解決策:DBから全フォームキーを取得して一括設定する

この問題を解決するのが、今回ご紹介するコードです。
このコードは、以下の2つの関数で構成されています。

  1. get_all_form_key(): WordPressのデータベースを検索し、MW WP Formで作成された全てのフォームのIDを取得して、それぞれにエラーメッセージ用のフィルターフックを自動で追加する関数。
  2. form_error_message(): 実際に表示されるエラーメッセージの内容を定義する関数。

この仕組みにより、一度コードを設置すれば、今後いくつフォームを複製しても、自動的に共通のエラーメッセージが適用されるようになります。

実装コードと詳細解説

使用しているテーマのfunctions.phpに、以下のコードを追記してください。

/**
 * MW WP Form のエラーメッセージをカスタマイズする
 *
 * @param string $error デフォルトのエラーメッセージ
 * @param string $key   name属性の値
 * @param string $rule  バリデーションルール
 * @return string カスタマイズしたエラーメッセージ
 */
function form_error_message( $error, $key, $rule ) {
  // --- 必須選択項目(ラジオボタン、チェックボックスなど)---
  // 'required'ルールが適用される項目名を配列で指定
  $required_items = [
    'お問い合わせ種別',
    'ご希望の連絡方法',
  ];
  foreach ( $required_items as $value ) {
    if ( $key === $value && $rule === 'required' ) {
      return $value . 'を選択してください';
    }
  }

  // --- 必須入力項目(テキストフィールドなど)---
  // 'noempty'ルールが適用される項目名を配列で指定
  $noempty_items = [
    'お名前',
    'フリガナ',
    '郵便番号',
    '市区町村',
    '丁目番地',
    '電話番号',
    'メールアドレス',
    'メールアドレス(確認用)',
    'お問い合わせ内容',
  ];
  foreach ( $noempty_items as $value ) {
    if ( $key === $value && $rule === 'noempty' ) {
      return $value . 'は必須項目です';
    }
  }

  // --- カタカナ入力項目 ---
  $katakana_items = [
    'フリガナ',
  ];
  foreach ( $katakana_items as $value ) {
    if ( $key === $value && $rule === 'katakana' ) {
      return $value . 'はカタカナで入力してください';
    }
  }

  // --- 特定の項目に対する個別のルール ---
  if ( $key === 'メールアドレス' && $rule === 'mail' ) {
    return '正しいメールアドレスの形式で入力してください。';
  }
  if ( $key === 'メールアドレス(確認用)' && $rule === 'eq' ) {
    return 'メールアドレスが一致しません。';
  }

  // 上記のどの条件にも当てはまらない場合は、デフォルトのエラーメッセージを返す
  return $error;
}

/**
 * MW WP Form で作成された全てのフォームキーを取得し、
 * 共通のエラーメッセージ用フィルターフックを適用する
 */
function get_all_form_key() {
  global $wpdb; // WordPressのDB操作用グローバル変数

  // postmetaテーブルから、meta_keyが 'mw-wp-form' のレコードを全て取得
  $rows = $wpdb->get_results( "
    SELECT post_id
    FROM $wpdb->postmeta
    WHERE `meta_key` = 'mw-wp-form'
  " );

  // 取得した各フォーム情報に対してループ処理
  foreach ( $rows as $row ) {
    // 'mwform_error_message_mw-wp-form-{投稿ID}' というフック名を作成し、フィルターを追加
    add_filter( 'mwform_error_message_mw-wp-form-' . $row->post_id, 'form_error_message', 10, 3 );
  }
}

// 関数を実行
get_all_form_key();

コードのポイント解説

  • get_all_form_key()関数:
    • global $wpdb;: WordPressのデータベースを操作するための必須のおまじないです。
    • $wpdb->get_results(...): postmetaテーブルを検索しています。MW WP Formは、作成したフォームの情報をこのテーブルにmeta_key = 'mw-wp-form'として保存しています。
    • SELECT post_id: フォームの投稿IDのみを取得しています。
    • foreach ($rows as $row): 見つかった全てのフォームに対して処理を繰り返します。
    • add_filter(...): mwform_error_message_mw-wp-form-に取得した$row->post_idを連結し、動的にフック名を作り出しています。これにより、全てのフォームにform_error_message関数が適用されます。
  • form_error_message()関数:
    • 引数の$keyにはフォーム項目のname属性の値が、$ruleには設定したバリデーションルール(required, noemptyなど)が入ります。
    • $required_items$noempty_itemsのように、ルールごとに項目名を配列で管理することで、コードの見通しが良くなり、後からの追加や修正が容易になります。
    • 例えば、「お名前」欄が空欄だった場合、$keyは「お名前」、$ruleは「noempty」となるため、if ( $key === $value && $rule === 'noempty' )の条件に一致し、「お名前は必須項目です」というメッセージが返されます。

カスタマイズして使ってみよう

新しい項目を追加する
$noempty_itemsの配列に、新しく必須項目にしたいフォーム項目のname属性の値(例: 会社名)を追加するだけです。

$noempty_items = [
  'お名前',
  'フリガナ',
  '会社名', // ←追加
  // ...
];

エラーメッセージの文言を変更する
returnされている文字列を自由に変更してください。

// 変更前
return $value . 'は必須項目です';
// 変更後
return '【入力必須】' . $value . 'をご入力ください';

新しいルールを追加する
例えば、電話番号(tel)用のバリデーションルールを追加したい場合は、以下のように追記します。

 // ...
    if ( $key === '電話番号' && $rule === 'tel' ) {
      return '正しい電話番号の形式(ハイフンなし)で入力してください。';
    }
    if ( $key === 'メールアドレス' && $rule === 'mail' ) {
    // ...

まとめ

今回は、MW WP Formで大量のフォームを効率的に管理するため、エラーメッセージを共通化するテクニックをご紹介しました。

この方法のメリットは以下の通りです。

  • メンテナンス性の向上: エラーメッセージの修正や追加が1ヶ所で完了します。
  • コードのDRY(Don’t Repeat Yourself)原則: 同じコードを繰り返し書く必要がなくなります。
  • ヒューマンエラーの防止: フォームごとの設定漏れや、メッセージの不統一がなくなります。

多くのフォームを運用するサイトや、今後フォームが増える可能性のあるプロジェクトでは、非常に効果的な手法です。ぜひ、あなたの開発現場でも活用してみてください。