国際住所スキームにおける英国のステータスフィールドのカスタマイズ

住所フィールドでユーザーがイギリスを選択した際の、都道府県・地方フィールドの動作をカスタマイズしますか? 国際スキームを使用する場合、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: ドロップダウンに表示されるオプションのリスト。デフォルトでは、イングランド、スコットランド、ウェールズ、北アイルランドが含まれています。必要に応じてエントリを追加、削除、または名前を変更できます。たとえば、代わりにイギリスの郡を収集したい場合は、リストをお好みの郡に置き換えてください。

ユーザーがイギリス以外の国を選択すると、スニペットは元の都道府県・地方テキスト入力とそのラベルを自動的に復元します。

これで完了です!WPFormsの国際スキームでイギリスが選択された場合の住所フィールドを正常にカスタマイズしました。フォームフィールドをカスタマイズする他の方法を検討しますか?適切な住所フィールド形式を選択する方法に関するチュートリアルをご覧ください。