Personalización del campo de Estado para el Reino Unido en el Esquema de Direcciones Internacional

¿Te gustaría personalizar el comportamiento del campo Estado/Provincia/Región cuando un usuario selecciona el Reino Unido en tu campo de Dirección? Al usar el esquema Internacional, WPForms oculta el campo Estado/Provincia/Región por defecto para el Reino Unido, ya que el Reino Unido no utiliza estados en el sentido tradicional. Si deseas recopilar un valor como el país (Inglaterra, Escocia, Gales o Irlanda del Norte) o el condado en su lugar, puedes hacerlo con un fragmento de código personalizado.

Este tutorial te mostrará cómo volver a habilitar el campo Estado/Provincia/Región para el Reino Unido, cambiar su etiqueta y reemplazar el campo de texto con un menú desplegable de países del Reino Unido.


Creación del fragmento

Antes de empezar, asegúrate de consultar nuestro tutorial sobre cómo añadir fragmentos de código personalizados a tu sitio.

Este fragmento hace dos cosas. Primero, elimina el Reino Unido de la lista de países que ocultan el campo Estado/Provincia/Región. Segundo, añade un pequeño fragmento de JavaScript al frontend que actualiza la etiqueta del campo y reemplaza el campo de texto con un menú desplegable cada vez que el usuario selecciona el Reino Unido.

Añade el siguiente fragmento a tu sitio.

/**
 * 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
}

Personalización del fragmento

El fragmento está diseñado para ser ajustado a tu caso de uso. Aquí tienes las tres variables cerca de la parte superior del bloque de JavaScript que quizás quieras editar.

  • countryLabel: La etiqueta que se muestra encima del campo cuando se selecciona el Reino Unido. Por defecto, está establecida como País . Si prefieres Condado o cualquier otra etiqueta, cambia este valor.
  • countryPlaceholder: El marcador de posición que se muestra como la primera opción en el menú desplegable. Actualiza esto para que coincida con tu nueva etiqueta.
  • gbCountries: La lista de opciones que se muestran en el menú desplegable. Por defecto, contiene Inglaterra, Escocia, Gales e Irlanda del Norte. Puedes añadir, eliminar o renombrar entradas según sea necesario. Por ejemplo, si deseas recopilar condados del Reino Unido en su lugar, reemplaza la lista con tus condados preferidos.

Cuando el usuario selecciona un país que no es el Reino Unido, el fragmento restaura automáticamente el campo de texto Estado/Provincia/Región original y su etiqueta.

¡Eso es todo! Has personalizado con éxito el campo de Dirección para el esquema Internacional cuando se selecciona el Reino Unido. ¿Te gustaría explorar más formas de personalizar tus campos de formulario? Echa un vistazo a nuestro tutorial sobre cómo elegir el formato de campo de dirección correcto.