Resumen de la IA
¿Te gustaría personalizar el comportamiento del campo «Estado/Provincia/Región» cuando un usuario selecciona «Reino Unido» en el campo «Dirección»? Al utilizar el esquema internacional, WPForms oculta por defecto el campo «Estado/Provincia/Región» para el Reino Unido, ya que este país no utiliza estados en el sentido tradicional. Si prefieres recopilar un valor como el país (Inglaterra, Escocia, Gales o Irlanda del Norte) o el condado, puedes hacerlo con un fragmento de código personalizado.
En este tutorial te enseñaremos cómo volver a habilitar el campo «Estado/Provincia/Región» para el Reino Unido, cambiar su etiqueta y sustituir el campo de texto por un menú desplegable con los países del Reino Unido.
Creación del fragmento
Antes de empezar, no te olvides de echar un vistazo a nuestro tutorial sobre cómo añadir fragmentos de código personalizados a tu sitio web.
Este fragmento de código hace dos cosas. En primer lugar, elimina el Reino Unido de la lista de países que ocultan el campo «Estado/Provincia/Región». En segundo lugar, añade un pequeño fragmento de JavaScript a la interfaz de usuario que actualiza la etiqueta del campo y sustituye el campo de texto por un menú desplegable cada vez que el usuario selecciona el Reino Unido.
No lo dudes y añade el siguiente fragmento de código a tu sitio web.
/**
* 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 de código está diseñado para que puedas adaptarlo a tus necesidades. A continuación te indicamos las tres variables que se encuentran en la parte superior del bloque de JavaScript y que quizá quieras modificar.
countryLabel: La etiqueta que aparece encima del campo cuando se selecciona el Reino Unido. Está configurada comoCountrypor defecto. Si prefieresCountyo cualquier otra etiqueta, cambia este valor.countryPlaceholder: El texto provisional que aparece como primera opción en el menú desplegable. Actualízalo para que coincida con tu nueva etiqueta.gbCountries: La lista de opciones que aparece en el menú desplegable. De forma predeterminada, incluye Inglaterra, Escocia, Gales e Irlanda del Norte. Puedes añadir, eliminar o renombrar entradas según sea necesario. Por ejemplo, si prefieres recopilar los condados del Reino Unido, sustituye la lista por los condados que desees.
Cuando el usuario selecciona un país distinto del Reino Unido, el fragmento de código restablece automáticamente el campo de texto «Estado/Provincia/Región» y su etiqueta.
¡Ya está! Has personalizado correctamente el campo «Dirección» para el esquema internacional cuando se selecciona el Reino Unido. ¿Te gustaría descubrir más formas de personalizar los campos de tu formulario? Echa un vistazo a nuestro tutorial sobre cómo elegir el formato adecuado para el campo «Dirección».