国際住所体系における英国の「州」フィールドのカスタマイズ

住所入力欄でユーザーが「イギリス」を選択した際、「州/県/地域」フィールドの動作をカスタマイズしたいですか?国際形式を使用する場合、イギリスでは従来の意味での「州」という概念がないため、WPFormsではデフォルトで「州/県/地域」フィールドが非表示になります。 代わりに、国(イングランド、スコットランド、ウェールズ、または北アイルランド)や郡などの値を収集したい場合は、カスタムコードスニペットを使用して設定できます。

このチュートリアルでは、英国の「州/県/地域」フィールドを再度有効にし、そのラベルを変更し、テキスト入力欄を英国の各国のドロップダウンリストに置き換える方法について説明します。


スニペットの作成

始める前に、サイトにカスタムコードスニペットを追加する方法についてのチュートリアルをぜひご覧ください。

このコードスニペットには2つの機能があります。まず、州/県/地域フィールドを非表示にする国のリストから「イギリス」を除外します。次に、ユーザーが「イギリス」を選択した際に、フィールドのラベルを更新し、テキスト入力欄をドロップダウンメニューに置き換えるよう、フロントエンドに小さなJavaScriptを追加します。

ぜひ、以下のコードスニペットをサイトに追加してください。

/**
 * Customize the Address field State/Province/Region input when
 * the United Kingdom is selected in the International scheme.
 *
 * @link https://wpforms.com/developers/customizing-the-state-field-for-the-united-kingdom-in-the-international-address-scheme
 */

add_filter( 'wpforms_forms_fields_address_frontend_strings_list_countries_without_states', 'wpf_forms_fields_address_frontend_strings_list_countries_without_states' );

function wpf_forms_fields_address_frontend_strings_list_countries_without_states( $countries ) {

	return array_diff( $countries, [ 'GB' ] );
}

add_action( 'wpforms_frontend_js', 'wpf_forms_fields_address_frontend_great_britain_countries_list' );
function wpf_forms_fields_address_frontend_great_britain_countries_list( $forms) {
	$load = false;

	foreach ( $forms as $form ) {
		if ( wpforms_has_field_type( 'address', $form ) ) {
			$load = true;

			break;
		}
	}

	if ( ! $load ) {
		return;
	}

	?>
	<script>
		jQuery( document ).ready( function ( $ ) {
			const countryLabel = 'Country'; // TODO: Change it if needed.
			const countryPlaceholder = '--- Country ---'; // TODO: Change it if needed.
			const gbCountries = [ // TODO: Update it if needed.
				{ value: 'England', label: 'England' },
				{ value: 'Scotland', label: 'Scotland' },
				{ value: 'Wales', label: 'Wales' },
				{ value: 'Northern Ireland', label: 'Northern Ireland' }
			];

			const originalFields = {};

			$( '.wpforms-field-address-state' ).each( function () {
				const $field = $( this ),
					$label = $field.closest( '.wpforms-field-row-block' ).find( 'label' ),
					fieldId = $field.attr( 'id' );

				originalFields[ fieldId ] = {
					label: $label.length ? $label.text() : '',
					placeholder: $field.attr( 'placeholder' ) || '',
					value: $field.val(),
				};
			} );

			$( document )
				.on( 'change', '.wpforms-field-address-country', function () {
					const $countryField = $( this ),
						$field = $( this ).closest( '.wpforms-field' ),
						$stateField = $field.find( '.wpforms-field-address-state' ),
						$stateLabel = $stateField.closest( '.wpforms-field-row-block' ).find( 'label' ),
						stateFieldId = $stateField.attr( 'id' ),
						stateFieldName = $stateField.attr( 'name' );

					if ( $countryField.val() === 'GB' ) {
						$stateLabel.text( countryLabel );

						let selectHTML = `<select class="wpforms-field-address-state" id="${ stateFieldId }" name="${ stateFieldName }">`;

						selectHTML += `<option value="">${ countryPlaceholder }</option>`;

						$.each( gbCountries, function ( index, country ) {
							selectHTML += `<option value="${ country.value }">${ country.label }</option>`;
						} );

						selectHTML += '</select>';

						$stateField.replaceWith( selectHTML );

						return;
					}

					// Replace the select field back to input text
					if ( $stateField.is( 'select' ) ) {
						$stateField.replaceWith( `<input type="text" class="wpforms-field-address-state" id="${ stateFieldId }" name="${ $stateField.attr( 'name' ) }" placeholder="${ originalFields[ stateFieldId ].placeholder }" value="${ originalFields[ stateFieldId ].value }">` );
					}

					// Replace label back.
					if ( originalFields[ stateFieldId ] ) {
						$stateLabel.text( originalFields[ stateFieldId ].label );
					}
				} );
		} );
	</script>
	<?php
}

スニペットのカスタマイズ

このスニペットは、ご利用の用途に合わせて調整できるよう設計されています。JavaScript ブロックの先頭付近にある、編集が必要になる可能性のある 3 つの変数を以下に示します。

  • countryLabel: 英国が選択された際にフィールドの上に表示されるラベルです。これは Country デフォルトでは。もしご希望であれば County またはその他のラベルの場合は、この値を変更してください。
  • countryPlaceholder: ドロップダウンメニューの最初の選択肢として表示されるプレースホルダーです。新しいラベルに合わせて更新してください。
  • gbCountries: ドロップダウンに表示されるオプションの一覧です。デフォルトでは、イングランド、スコットランド、ウェールズ、北アイルランドが含まれています。必要に応じて、項目を追加、削除、または名前を変更できます。たとえば、代わりに英国の各州を収集したい場合は、この一覧を任意の州名に置き換えてください。

ユーザーが英国以外の国を選択すると、スニペットは元の「州/県/地域」のテキスト入力欄とそのラベルを自動的に復元します。

これで完了です!イギリスが選択された際の「国際」スキームにおける住所フィールドのカスタマイズが正常に完了しました。フォームフィールドのカスタマイズ方法について、さらに詳しく知りたいですか?適切な住所フィールド形式の選び方に関するチュートリアルをご覧ください。