<html lang="ja-jp" dir="ltr"><head></head><body>### [フォームに郵便番号フィールドの検証を追加する方法](https://wpforms.com/developers/how-to-add-zip-code-field-validation-on-your-forms/)

**公開日:** 2023年6月26日
**著者:** Umair Majeed

**抜粋:** このチュートリアルでは、PHPスニペットを使用してWPFormsに郵便番号フィールドの検証を追加する方法を説明します。

**コンテンツ:**

WPFormsに郵便番号フィールドの検証を追加したいですか？デフォルトでは、**住所**フィールドを使用する場合、住所と一緒に郵便番号を入力する場所しかありません。しかし、このチュートリアルでは、サービス対象の郵便番号を検索し、郵便番号が希望するサービスエリアにない場合はフォームの送信に失敗するフィールドを作成する方法を紹介します。

## フォームの作成

新しいフォームを作成し、必要なすべてのフィールドを追加することから始めます。

![新しいフォームを作成し、フィールドを追加することから始めます。郵便番号フィールドの検証のために、少なくとも1つの単一行テキストフィールドを含めるようにしてください](https://wpforms.com/wp-content/uploads/2023/06/wpforms-validate-zipcode-create-form.jpg)郵便番号フィールドの検証として機能する入力マスクを持つ**単一行テキスト**フォームフィールドを追加します。これにより、フォームが送信されたときに、スニペットがこのフィールドに入力された値を取得し、サービスエリアにある郵便番号のリストと比較します。失敗した場合、ユーザーは当社のサービスエリアではないというメッセージが表示されます。

フォームの作成にヘルプが必要な場合は、[こちらの便利なガイドをご覧ください](https://wpforms.com/docs/creating-first-form/ "最初のフォームの作成")。

## 入力マスクの使用

標準の郵便番号フィールドのように表示したいので、このフィールドに入力マスクを追加します。これを実現するには、フィールドをクリックして**高度な設定**タブに移動します。**入力マスク**フィールドに **99999** と入力します。これは、この特定のフィールドが5桁の数字のみを受け入れることを意味します。

WPFormsの入力マスクの詳細については、[こちらのチュートリアルでその他の例をご覧ください](https://wpforms.com/docs/how-to-use-custom-input-masks/ "カスタム入力マスクの使用")。

![単一行テキストフォームフィールドで、高度な設定タブをクリックし、99999と入力して郵便番号フィールドの形式を作成します。この入力マスクは5桁の数字のみを受け入れます。](https://wpforms.com/wp-content/uploads/2023/06/wpforms-validate-zipcode-add-input-mask.jpg)## 郵便番号検証の適用（単一フォームのみ）

&gt; さて、スニペットを追加する時間です。この最初の例では、特定の1つのフォームに郵便番号検証を追加します。スニペットの追加方法と場所について支援が必要な場合は、[こちらのドキュメントをご覧ください](https://wpforms.com/developers/how-to-add-custom-php-or-javascript-for-wpforms/ "WPForms用のカスタムPHPまたはJavaScriptの追加方法")。

```php

/**
* 郵便番号フィールドの検証を追加します。
*
* @link https://wpforms.com/developers/how-to-add-zip-code-field-validation-on-your-forms/
*/
 
function wpf_dev_validate_zip_code( $fields, $entry, $form_data ) {
 
    // オプションで、特定のフォームに限定することができます。以下では、
    // フォーム #3382 への出力を制限しています。
 
    if ( absint( $form_data[ 'id' ] ) !== 3382 ) {
        return $fields;
    }
 
    // ユーザーが入力した郵便番号フィールドの値を取得します。
    // 郵便番号フィールドのフィールドIDは '6' です。
    $zip_code = $fields[6][ 'value' ];
 
    // 郵便番号配列。各郵便番号はカンマで区切られます。
    $zip_code_list = array(
    '85224',
    '85225',
    '85226',
    '85233',
    '85234',
    '85244',
    '85246',
    '85248',
    '85249',
    '85286',
    '85295',
    '85296',
    '85297',
    '85298',
    '85299'
    );
 
    if (!in_array($zip_code, $zip_code_list)) {
 
        // フィールドID 75 をチェックし、フォームの上部と特定のフィールドの下にエラーメッセージを表示します。
        wpforms()-&gt;process-&gt;errors[ $form_data[ 'id' ] ]['6'] = esc_html__( 'ご不便をおかけいたしますが、現在、お客様の地域はサービス対象外です。後日、再度ご確認ください。', 'plugin-domain' );
    }
     
}
add_action( 'wpforms_process', 'wpf_dev_validate_zip_code', 10, 3 );
```

**注意:** この例では、スニペットは単一のフォームに限定されています。スニペットが実行される前にフォームIDをチェックし、そのフォームでのみ郵便番号を検証します。スニペットを複製せずに同じ検証を多くのフォームに適用したい場合は、ページの下部にある代替例を使用できます。

このスニペットを分解して各部分を説明しましょう。スニペットの最初のセクションは、スニペットが確認しているフォームIDが、スニペットで指定したフォームIDと一致するかどうかを確認しています。この例では、このスニペットはフォームID **3382** でのみ実行されます。

次の行のスニペットは、フィールドID **6** を検索し、フォームに入力された値を取得します。この値を取得したら、その入力された値を、**$zip\_code\_list** 配列に入力した郵便番号のリストと比較します。フォームID、フィールドIDを更新し、この配列に表示されている郵便番号を自身の郵便番号に合わせて更新する必要があります。

フォームIDとフィールドIDの検索に支援が必要な場合は、[フォームIDとフィールドIDの検索方法](https://wpforms.com/developers/how-to-locate-form-id-and-field-id/)に関するチュートリアルをご覧ください。

スニペットの調整が完了したら、入力された郵便番号が**$zip\_code\_list** 配列リストに見つからない場合、フォームはフォーム送信を処理しないことに注意してください。

![郵便番号フィールドの検証に失敗した場合、フォームは送信されません](https://wpforms.com/wp-content/uploads/2023/06/wpforms-validate-zipcode-failed-submit.jpg)## 郵便番号検証の適用（複数フォーム）

場合によっては、フォームごとに個別のスニペットを作成せずに、同じ郵便番号検証を複数の異なるフォームに適用したい場合があります。特定のフォームIDとフィールドIDをチェックする代わりに、郵便番号ラベルのリストと一致するラベルを持つフィールドを送信されたフォームで検索し、そのフィールドを検証する代替スニペットを使用できます。

```php

/**
 * フィールドIDに関係なく、すべてのフォームで郵便番号フィールドの検証を追加します。
 *
 * @link https://wpforms.com/developers/how-to-add-zip-code-field-validation-on-your-forms/
 */
function wpf_dev_validate_zip_code_all_forms( $fields, $entry, $form_data ) {

    // 郵便番号フィールドの受け入れ可能なラベルを定義します。
    $zip_labels = array( 'zip', 'zip code', 'postal code' );

    // ラベルでフィールドIDを検索します。
    $zip_field_id = false;
    foreach ( $form_data['fields'] as $field_id =&gt; $field ) {
        if ( isset( $field['label'] ) &amp;&amp; in_array( strtolower( trim( $field['label'] ) ), $zip_labels, true ) ) {
            $zip_field_id = $field_id;
            break;
        }
    }

    // 一致するフィールドが見つからない場合は、検証をスキップします。
    if ( ! $zip_field_id || empty( $fields[ $zip_field_id ]['value'] ) ) {
        return $fields;
    }

    // ユーザーが入力した値を取得します。
    $zip_code = trim( $fields[ $zip_field_id ]['value'] );

    // 許可される郵便番号。
    $zip_code_list = array(
        '85224',
        '85225',
        '85226',
        '85233',
        '85234',
        '85244',
        '85246',
        '85248',
        '85249',
        '85286',
        '85295',
        '85296',
        '85297',
        '85298',
        '85299'
    );

    // 入力された郵便番号を検証します。
    if ( ! in_array( $zip_code, $zip_code_list, true ) ) {
        wpforms()-&gt;process-&gt;errors[ $form_data['id'] ][ $zip_field_id ] = esc_html__(
            'ご不便をおかけいたしますが、現在、お客様の地域はサービス対象外です。後日、再度ご確認ください。',
            'plugin-domain'
        );
    }

    return $fields;
}
add_action( 'wpforms_process', 'wpf_dev_validate_zip_code_all_forms', 10, 3 );
```

この代替スニペットは、固定のフィールドIDに依存しません。フォームのフィールドをループし、各フィールドのラベルを確認し、`$zip_labels` 配列の値（例: `zip`、`zip code`、`postal code`）のいずれかに一致するラベルを探します。一致が見つかると、そのフィールドを郵便番号フィールドとして扱い、その値を許可される郵便番号の同じリストと比較します。

このスニペットはラベルを使用するため、フォームの郵便番号フィールドが`$zip_labels`の値のいずれかに一致するラベルを使用することが重要です。フォームで異なる用語を使用している場合は、スニペットの`$zip_labels`配列を編集して独自のラベルテキストを追加することで、コードが期待どおりのフィールドでのみ実行されるようにできます。

このスニペットでフォームIDまたはフィールドIDを変更する必要はありません。`$zip_labels`の値のいずれかに一致するラベルを持つフォームであれば、自動的に正しいフィールドを見つけます。

これで、**単一行テキスト**フィールドに郵便番号フィールドの検証を正常に追加するために必要なすべてが揃いました。**住所**フィールドと自動入力を使用する際に表示される国を制限したいですか？[特定の国に住所の自動入力を制限する方法](https://wpforms.com/developers/how-to-restrict-address-autocomplete-to-a-specific-country/ "特定の国に住所の自動入力を制限する方法")に関するチュートリアルをご覧ください。

## 関連

アクションリファレンス: [wpforms\_process](https://wpforms.com/developers/wpforms_process/ "wpforms_processアクションの使用")

**カテゴリ:** チュートリアル

**タグ:** PHP, 検証

---</body></html>