メインコンテンツまでスキップ

バリデーションフックリファレンス (PHP)

Form Plant のサーバーサイドバリデーションは、WordPress のフィルターフックを通じて自由にカスタマイズできます。エラーメッセージの差し替えからフィールド単位の独自検証、外部 API 連携まで、PHP のフィルターを追加するだけで実装できます。

クライアント側のカスタマイズと使い分け

ブラウザでの即時フィードバック (UX 改善) は JavaScript カスタマイズ、確実な検証 (セキュリティ) は本ページの PHP フックを使ってください。クライアント検証は DevTools などで容易にバイパスできるため、入力検証は必ずサーバー側でも実行する必要があります。

フック一覧

fplant_before_validation

バリデーション開始前のデータ加工。電話番号の正規化や全角→半角変換などに使えます。

パラメータ説明
$dataarray送信データ
$fieldsarrayフィールド設定
$form_idintフォーム ID

戻り値: array — 加工後の送信データ


fplant_validation_required_message

必須フィールドのエラーメッセージをカスタマイズします。

パラメータ説明
$messagestringデフォルトのエラーメッセージ
$fieldarrayフィールド設定
$valuemixed入力値
$dataarray送信データ全体

戻り値: string — カスタマイズ後のエラーメッセージ


fplant_validate_field_{$field_name}

特定フィールドのバリデーションを完全に上書きします。フィールド名 (例: email) をフック名に組み込みます。

パラメータ説明
$errornull初期値
$fieldarrayフィールド設定
$valuemixed入力値
$dataarray送信データ全体
$form_idintフォーム ID

戻り値:

  • null — 標準バリデーションを実行
  • false — エラーなし (標準バリデーションをスキップ)
  • string — エラーメッセージ (標準バリデーションをスキップ)
警告

null 以外を返すと標準バリデーションがスキップされます。標準チェックも併用したい場合は null を返してください。


fplant_validation_message_email

メールアドレスフィールドのエラーメッセージをカスタマイズします。

パラメータ説明
$messagestringデフォルトのエラーメッセージ
$fieldarrayフィールド設定
$valuestring入力値
$contextarrayコンテキスト情報 (type: 'format')

戻り値: string


fplant_validation_message_url

URL フィールドのエラーメッセージをカスタマイズします。パラメータは fplant_validation_message_email と同じです。


fplant_validation_message_tel

電話番号フィールドのエラーメッセージをカスタマイズします。パラメータは fplant_validation_message_email と同じです。


fplant_validation_message_number

数値フィールドのエラーメッセージをカスタマイズします。

パラメータ説明
$messagestringデフォルトのエラーメッセージ
$fieldarrayフィールド設定
$valuestring入力値
$contextarraytype: 'format' / 'min' / 'max'minmax

戻り値: string


fplant_validate_field_type_{$field_type}

フィールドタイプ別 (emailtelnumber など) の追加バリデーション。標準バリデーションに実行されます。

パラメータ説明
$errorfalse / string標準バリデーションの結果
$fieldarrayフィールド設定
$valuemixed入力値

戻り値: false (エラーなし) または string (エラーメッセージ)


fplant_validation_message_min_length

最小文字数エラーメッセージのカスタマイズ。

パラメータ説明
$messagestringデフォルトのエラーメッセージ
$fieldarrayフィールド設定
$valuestring入力値
$validationarrayバリデーション設定

戻り値: string


fplant_validation_message_max_length

最大文字数エラーメッセージのカスタマイズ。パラメータは fplant_validation_message_min_length と同じです。


fplant_validation_message_pattern

正規表現パターンエラーメッセージのカスタマイズ。パラメータは fplant_validation_message_min_length と同じです。


fplant_validate_custom_rules

カスタムバリデーションルールを追加します。フィールド設定の validation 配列に独自キーを定義し、このフックで判定処理を書くことで、新しいルールを実装できます。

パラメータ説明
$errorfalse / string既存のエラー判定結果
$fieldarrayフィールド設定
$valuestring入力値
$validationarrayバリデーション設定

戻り値: false (エラーなし) または string (エラーメッセージ)


fplant_validation_message_file

ファイルアップロードエラーメッセージのカスタマイズ。

パラメータ説明
$messagestringデフォルトのエラーメッセージ
$fieldarrayフィールド設定
$filearray$_FILES の配列
$contextarraytype: 'upload_error' / 'size' / 'extension'max_sizeallowed_types

戻り値: string


fplant_validation_errors

すべてのフィールドの検証が終わった後、エラー配列全体を最終調整するためのフックです。

パラメータ説明
$errorsarrayエラー配列
$fieldsarrayフィールド設定
$dataarray送信データ

戻り値: array


フックの実行順序

fplant_before_validation

[フィールドループ]
├─ 必須チェック → fplant_validation_required_message
├─ fplant_validate_field_{$field_name}
│ └─ null を返した場合のみ標準バリデーションを実行:
│ ├─ fplant_validation_message_email / url / tel / number / file
│ └─ fplant_validate_field_type_{$field_type}
└─ カスタムルール:
├─ fplant_validation_message_min_length / max_length / pattern
└─ fplant_validate_custom_rules

fplant_validation_errors

使用例

例 1: 必須エラーメッセージの多言語化

add_filter( 'fplant_validation_required_message', function( $message, $field ) {
if ( get_locale() === 'en_US' ) {
return sprintf( '%s is required', $field['label'] );
}
return $message;
}, 10, 2 );

例 2: 会社メールドメインに限定したバリデーション

add_filter( 'fplant_validate_field_company_email', function( $error, $field, $value, $data, $form_id ) {
$allowed_domains = array( 'example.com', 'company.co.jp' );

if ( ! empty( $value ) && is_email( $value ) ) {
$domain = substr( strrchr( $value, '@' ), 1 );

if ( ! in_array( $domain, $allowed_domains, true ) ) {
return '会社のメールアドレス (@example.com または @company.co.jp) を入力してください';
}
}

// null を返すと標準バリデーションも実行される
return $error;
}, 10, 5 );

例 3: 電話番号タイプにフリーダイヤル禁止ルールを追加

add_filter( 'fplant_validate_field_type_tel', function( $error, $field, $value ) {
// 既にエラーがある場合はそれを返す
if ( $error !== false ) {
return $error;
}

$cleaned_tel = preg_replace( '/[^0-9]/', '', $value );
if ( strpos( $cleaned_tel, '0120' ) === 0 || strpos( $cleaned_tel, '0800' ) === 0 ) {
return sprintf( '%sにフリーダイヤルは使用できません', $field['label'] );
}

return false;
}, 10, 3 );

例 4: 独自カスタムルール「年齢制限」を追加

add_filter( 'fplant_validate_custom_rules', function( $error, $field, $value, $validation ) {
if ( isset( $validation['age_restriction'] ) && ! empty( $value ) ) {
$min_age = intval( $validation['age_restriction'] );
$input_age = intval( $value );

if ( $input_age < $min_age ) {
return isset( $validation['age_restriction_message'] )
? $validation['age_restriction_message']
: sprintf( '%s 歳以上の方のみご利用いただけます', $min_age );
}
}

return $error;
}, 10, 4 );

例 5: 外部 API で郵便番号を実在チェック (Transient でキャッシュ)

add_filter( 'fplant_validate_field_postal_code', function( $error, $field, $value, $data, $form_id ) {
if ( empty( $value ) ) {
return $error;
}

$cache_key = 'postal_code_' . md5( $value );
$cached = get_transient( $cache_key );

if ( false !== $cached ) {
return $cached === 'valid' ? false : $cached;
}

$response = wp_remote_get(
'https://api.zipaddress.net/?zipcode=' . urlencode( $value ),
array( 'timeout' => 5 )
);

if ( is_wp_error( $response ) ) {
return '郵便番号の確認に失敗しました。しばらくしてから再度お試しください。';
}

$body = wp_remote_retrieve_body( $response );
$result = json_decode( $body, true );

if ( empty( $result['data'] ) ) {
$message = '有効な郵便番号を入力してください';
set_transient( $cache_key, $message, HOUR_IN_SECONDS );
return $message;
}

set_transient( $cache_key, 'valid', HOUR_IN_SECONDS );
return false;
}, 10, 5 );

例 6: 送信データの正規化 (ハイフン除去・全角→半角)

add_filter( 'fplant_before_validation', function( $data, $fields, $form_id ) {
foreach ( $fields as $field ) {
if ( ! isset( $data[ $field['name'] ] ) ) {
continue;
}

// 電話番号からハイフン等を除去
if ( $field['type'] === 'tel' ) {
$data[ $field['name'] ] = preg_replace( '/[^0-9]/', '', $data[ $field['name'] ] );
}

// 数値フィールドの全角→半角
if ( $field['type'] === 'number' ) {
$data[ $field['name'] ] = mb_convert_kana( $data[ $field['name'] ], 'n' );
}
}

return $data;
}, 10, 3 );

例 7: ファイルサイズエラーメッセージのカスタマイズ

add_filter( 'fplant_validation_message_file', function( $message, $field, $file, $context ) {
if ( $context['type'] === 'size' ) {
return sprintf(
'%sのファイルが大きすぎます。%sMB 以下のファイルを選択してください (現在: %sMB)',
$field['label'],
$context['max_size'],
round( $file['size'] / 1024 / 1024, 2 )
);
}

return $message;
}, 10, 4 );

ベストプラクティス

エラーの返し方

// ✅ エラーがある場合は文字列を返す
return 'エラーメッセージ';

// ✅ エラーがない場合は false を返す
return false;

// ❌ null や true を返さない (fplant_validate_field_{$field_name} を除く)

パフォーマンスへの配慮

外部 API を呼ぶバリデーターは、必ず Transient API などでキャッシュしてください。フォーム送信のたびに API を叩くと、表示遅延や API 制限の原因になります。

セキュリティへの配慮

  • 入力値は必ず sanitize_text_field() 等でサニタイズ
  • 外部 API リクエストには timeout を設定
  • エラーメッセージに入力値を含める場合は esc_html() でエスケープ

まとめ

PHP フィルターフックを使うことで、以下のようなカスタマイズがすべてサーバー側で完結します。

  • エラーメッセージの多言語化・文言変更
  • フィールドタイプ別のバリデーション拡張
  • 特定フィールドへの独自バリデーション
  • 外部 API 連携バリデーション
  • カスタムバリデーションルールの追加
  • バリデーション前のデータ正規化