namespace WPForms\Forms\Fields\Address;
use WPForms\Forms\Fields\Traits\ProField as ProFieldTrait;
class Field extends WPForms_Field {
* Address schemes: 'us' or 'international' by default.
* Primary class constructor.
// Define field type information.
$this->name = esc_html__( 'Address', 'wpforms-lite' );
$this->icon = 'fa-map-marker';
// Allow for additional or customizing address schemes.
'label' => esc_html__( 'US', 'wpforms-lite' ),
'address1_label' => esc_html__( 'Address Line 1', 'wpforms-lite' ),
'address2_label' => esc_html__( 'Address Line 2', 'wpforms-lite' ),
'city_label' => esc_html__( 'City', 'wpforms-lite' ),
'postal_label' => esc_html__( 'Zip Code', 'wpforms-lite' ),
'state_label' => esc_html__( 'State', 'wpforms-lite' ),
'states' => wpforms_us_states(),
'label' => esc_html__( 'International', 'wpforms-lite' ),
'address1_label' => esc_html__( 'Address Line 1', 'wpforms-lite' ),
'address2_label' => esc_html__( 'Address Line 2', 'wpforms-lite' ),
'city_label' => esc_html__( 'City', 'wpforms-lite' ),
'postal_label' => esc_html__( 'Postal Code', 'wpforms-lite' ),
'state_label' => esc_html__( 'State / Province / Region', 'wpforms-lite' ),
'country_label' => esc_html__( 'Country', 'wpforms-lite' ),
'countries' => wpforms_countries(),
* Allow modifying address schemes.
* @param array $schemes Address schemes.
$this->schemes = apply_filters( 'wpforms_address_schemes', $default_schemes ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName
protected function hooks() {
* Field options panel inside the builder.
* @param array $field Field data.
public function field_options( $field ) { // phpcs:ignore Generic.Metrics.CyclomaticComplexity.TooHigh
'after_title' => $this->get_field_options_notice(),
$this->field_option( 'label', $field );
// Address Scheme - was "format" key prior to 1.2.7.
$scheme = ! empty( $field['scheme'] ) ? esc_attr( $field['scheme'] ) : 'us';
if ( empty( $scheme ) && ! empty( $field['format'] ) ) {
$scheme = esc_attr( $field['format'] );
$tooltip = esc_html__( 'Select scheme format for the address field.', 'wpforms-lite' );
$output = $this->field_element(
'value' => esc_html__( 'Scheme', 'wpforms-lite' ),
$output .= $this->field_element(
$this->field_option( 'description', $field );
$this->field_option( 'required', $field );
* Advanced field options.
$this->field_option( 'size', $field );
$address1_placeholder = ! empty( $field['address1_placeholder'] ) ? esc_attr( $field['address1_placeholder'] ) : '';
$address1_default = ! empty( $field['address1_default'] ) ? esc_attr( $field['address1_default'] ) : '';
'<div class="wpforms-clear wpforms-field-option-row wpforms-field-option-row-address1"
id="wpforms-field-option-row-%1$d-address1"
data-subfield="address-1"
wpforms_validate_field_id( $field['id'] ) // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
'slug' => 'address1_placeholder',
'value' => esc_html__( 'Address Line 1', 'wpforms-lite' ),
// phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped
echo '<div class="wpforms-field-options-columns-2 wpforms-field-options-columns">';
echo '<div class="placeholder wpforms-field-options-column">';
printf( '<input type="text" class="placeholder" id="wpforms-field-option-%1$s-address1_placeholder" name="fields[%1$s][address1_placeholder]" value="%2$s">', wpforms_validate_field_id( $field['id'] ), esc_attr( $address1_placeholder ) );
printf( '<label for="wpforms-field-option-%s-address1_placeholder" class="sub-label">%s</label>', wpforms_validate_field_id( $field['id'] ), esc_html__( 'Placeholder', 'wpforms-lite' ) );
echo '<div class="default wpforms-field-options-column">';
printf( '<input type="text" class="default" id="wpforms-field-option-%1$d-address1_default" name="fields[%1$s][address1_default]" value="%2$s">', wpforms_validate_field_id( $field['id'] ), esc_attr( $address1_default ) );
printf( '<label for="wpforms-field-option-%s-address1_default" class="sub-label">%s</label>', wpforms_validate_field_id( $field['id'] ), esc_html__( 'Default Value', 'wpforms-lite' ) );
// phpcs:enable WordPress.Security.EscapeOutput.OutputNotEscaped
$address2_placeholder = ! empty( $field['address2_placeholder'] ) ? esc_attr( $field['address2_placeholder'] ) : '';
$address2_default = ! empty( $field['address2_default'] ) ? esc_attr( $field['address2_default'] ) : '';
$address2_hide = ! empty( $field['address2_hide'] );
'<div class="wpforms-clear wpforms-field-option-row wpforms-field-option-row-address2"
id="wpforms-field-option-row-%1$d-address2"
data-subfield="address-2"
wpforms_validate_field_id( $field['id'] ) // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
echo '<div class="wpforms-field-header">';
'slug' => 'address2_placeholder',
'value' => esc_html__( 'Address Line 2', 'wpforms-lite' ),
'slug' => 'address2_hide',
'value' => $address2_hide,
'desc' => esc_html__( 'Hide', 'wpforms-lite' ),
'title' => esc_html__( 'Turn On if you want to hide this sub field.', 'wpforms-lite' ),
'control-class' => 'wpforms-field-option-in-label-right',
'class' => 'wpforms-subfield-hide',
// phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped
echo '<div class="wpforms-field-options-columns-2 wpforms-field-options-columns">';
echo '<div class="placeholder wpforms-field-options-column">';
printf( '<input type="text" class="placeholder" id="wpforms-field-option-%1$d-address2_placeholder" name="fields[%1$s][address2_placeholder]" value="%2$s">', wpforms_validate_field_id( $field['id'] ), esc_attr( $address2_placeholder ) );
printf( '<label for="wpforms-field-option-%s-address2_placeholder" class="sub-label">%s</label>', wpforms_validate_field_id( $field['id'] ), esc_html__( 'Placeholder', 'wpforms-lite' ) );
echo '<div class="default wpforms-field-options-column">';
printf( '<input type="text" class="default" id="wpforms-field-option-%1$d-address2_default" name="fields[%1$s][address2_default]" value="%2$s">', wpforms_validate_field_id( $field['id'] ), esc_attr( $address2_default ) );
printf( '<label for="wpforms-field-option-%s-address2_default" class="sub-label">%s</label>', wpforms_validate_field_id( $field['id'] ), esc_html__( 'Default Value', 'wpforms-lite' ) );
// phpcs:enable WordPress.Security.EscapeOutput.OutputNotEscaped
$city_placeholder = ! empty( $field['city_placeholder'] ) ? esc_attr( $field['city_placeholder'] ) : '';
$city_default = ! empty( $field['city_default'] ) ? esc_attr( $field['city_default'] ) : '';
'<div class="wpforms-clear wpforms-field-option-row wpforms-field-option-row-city"
id="wpforms-field-option-row-%1$s-city"
wpforms_validate_field_id( $field['id'] ) // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
'slug' => 'city_placeholder',
'value' => esc_html__( 'City', 'wpforms-lite' ),
// phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped
echo '<div class="wpforms-field-options-columns-2 wpforms-field-options-columns">';
echo '<div class="placeholder wpforms-field-options-column">';
printf( '<input type="text" class="placeholder" id="wpforms-field-option-%1$s-city_placeholder" name="fields[%1$s][city_placeholder]" value="%2$s">', wpforms_validate_field_id( $field['id'] ), esc_attr( $city_placeholder ) );
printf( '<label for="wpforms-field-option-%s-city_placeholder" class="sub-label">%s</label>', wpforms_validate_field_id( $field['id'] ), esc_html__( 'Placeholder', 'wpforms-lite' ) );
echo '<div class="default wpforms-field-options-column">';
printf( '<input type="text" class="default" id="wpforms-field-option-%1$s-city_default" name="fields[%1$s][city_default]" value="%2$s">', wpforms_validate_field_id( $field['id'] ), esc_attr( $city_default ) );
printf( '<label for="wpforms-field-option-%s-city_default" class="sub-label">%s</label>', wpforms_validate_field_id( $field['id'] ), esc_html__( 'Default Value', 'wpforms-lite' ) );
// phpcs:enable WordPress.Security.EscapeOutput.OutputNotEscaped
$state_placeholder = ! empty( $field['state_placeholder'] ) ? $field['state_placeholder'] : '';
'<div class="wpforms-clear wpforms-field-option-row wpforms-field-option-row-state"
id="wpforms-field-option-row-%1$s-state"
wpforms_validate_field_id( $field['id'] ) // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
'slug' => 'state_placeholder',
'value' => esc_html__( 'State / Province / Region', 'wpforms-lite' ),
// phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped
echo '<div class="wpforms-field-options-columns-2 wpforms-field-options-columns">';
echo '<div class="placeholder wpforms-field-options-column">';
printf( '<input type="text" class="placeholder" id="wpforms-field-option-%1$s-state_placeholder" name="fields[%1$s][state_placeholder]" value="%2$s">', wpforms_validate_field_id( $field['id'] ), esc_attr( $state_placeholder ) );
printf( '<label for="wpforms-field-option-%s-state_placeholder" class="sub-label">%s</label>', wpforms_validate_field_id( $field['id'] ), esc_html__( 'Placeholder', 'wpforms-lite' ) );
echo '<div class="default wpforms-field-options-column">';
$this->subfield_default( $field, 'state', 'states' );
printf( '<label for="wpforms-field-option-%s-state_default" class="sub-label">%s</label>', wpforms_validate_field_id( $field['id'] ), esc_html__( 'Default Value', 'wpforms-lite' ) );
// phpcs:enable WordPress.Security.EscapeOutput.OutputNotEscaped
$postal_placeholder = ! empty( $field['postal_placeholder'] ) ? esc_attr( $field['postal_placeholder'] ) : '';
$postal_default = ! empty( $field['postal_default'] ) ? esc_attr( $field['postal_default'] ) : '';
$postal_hide = ! empty( $field['postal_hide'] );
$postal_visibility = ! isset( $this->schemes[ $scheme ]['postal_label'] ) ? 'wpforms-hidden' : '';
'<div class="wpforms-clear wpforms-field-option-row wpforms-field-option-row-postal %1$s"
id="wpforms-field-option-row-%2$s-postal"
sanitize_html_class( $postal_visibility ),
wpforms_validate_field_id( $field['id'] ) // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
echo '<div class="wpforms-field-header">';
'slug' => 'postal_placeholder',
'value' => esc_html__( 'ZIP / Postal', 'wpforms-lite' ),
'desc' => esc_html__( 'Hide', 'wpforms-lite' ),
'title' => esc_html__( 'Turn On if you want to hide this sub field.', 'wpforms-lite' ),
'control-class' => 'wpforms-field-option-in-label-right',
'class' => 'wpforms-subfield-hide',
// phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped
echo '<div class="wpforms-field-options-columns-2 wpforms-field-options-columns">';
echo '<div class="placeholder wpforms-field-options-column">';
printf( '<input type="text" class="placeholder" id="wpforms-field-option-%1$s-postal_placeholder" name="fields[%1$s][postal_placeholder]" value="%2$s">', wpforms_validate_field_id( $field['id'] ), esc_attr( $postal_placeholder ) );
printf( '<label for="wpforms-field-option-%s-postal_placeholder" class="sub-label">%s</label>', wpforms_validate_field_id( $field['id'] ), esc_html__( 'Placeholder', 'wpforms-lite' ) );
echo '<div class="default wpforms-field-options-column">';
printf( '<input type="text" class="default" id="wpforms-field-option-%1$s-postal_default" name="fields[%1$s][postal_default]" value="%2$s">', wpforms_validate_field_id( $field['id'] ), esc_attr( $postal_default ) );
printf( '<label for="wpforms-field-option-%s-postal_default" class="sub-label">%s</label>', wpforms_validate_field_id( $field['id'] ), esc_html__( 'Default Value', 'wpforms-lite' ) );
// phpcs:enable WordPress.Security.EscapeOutput.OutputNotEscaped
$country_placeholder = ! empty( $field['country_placeholder'] ) ? $field['country_placeholder'] : '';
$country_hide = ! empty( $field['country_hide'] );
$country_visibility = ! isset( $this->schemes[ $scheme ]['countries'] ) ? 'wpforms-hidden' : '';
'<div class="wpforms-clear wpforms-field-option-row wpforms-field-option-row-country %1$s"
id="wpforms-field-option-row-%2$s-country"
sanitize_html_class( $country_visibility ),
wpforms_validate_field_id( $field['id'] ) // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
echo '<div class="wpforms-field-header">';
'slug' => 'country_placeholder',
'value' => esc_html__( 'Country', 'wpforms-lite' ),
'slug' => 'country_hide',
'value' => $country_hide,
'desc' => esc_html__( 'Hide', 'wpforms-lite' ),
'title' => esc_html__( 'Turn On if you want to hide this sub field.', 'wpforms-lite' ),
'control-class' => 'wpforms-field-option-in-label-right',
'class' => 'wpforms-subfield-hide',
// phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped
echo '<div class="wpforms-field-options-columns-2 wpforms-field-options-columns">';
echo '<div class="placeholder wpforms-field-options-column">';
printf( '<input type="text" class="placeholder" id="wpforms-field-option-%1$s-country_placeholder" name="fields[%1$s][country_placeholder]" value="%2$s">', wpforms_validate_field_id( $field['id'] ), esc_attr( $country_placeholder ) );
printf( '<label for="wpforms-field-option-%s-country_placeholder" class="sub-label">%s</label>', wpforms_validate_field_id( $field['id'] ), esc_html__( 'Placeholder', 'wpforms-lite' ) );
echo '<div class="default wpforms-field-options-column">';
$this->subfield_default( $field, 'country', 'countries' );
printf( '<label for="wpforms-field-option-%s-country_default" class="sub-label">%s</label>', wpforms_validate_field_id( $field['id'] ), esc_html__( 'Default Value', 'wpforms-lite' ) );
// phpcs:enable WordPress.Security.EscapeOutput.OutputNotEscaped
$this->field_option( 'css', $field );
$this->field_option( 'label_hide', $field );
$this->field_option( 'sublabel_hide', $field );
* Field preview inside the builder.
* @param array $field Field data.
public function field_preview( $field ) { // phpcs:ignore Generic.Metrics.CyclomaticComplexity.MaxExceeded
$address1_placeholder = ! empty( $field['address1_placeholder'] ) ? $field['address1_placeholder'] : '';
$address1_default = ! empty( $field['address1_default'] ) ? $field['address1_default'] : '';
$address2_placeholder = ! empty( $field['address2_placeholder'] ) ? $field['address2_placeholder'] : '';
$address2_default = ! empty( $field['address2_default'] ) ? $field['address2_default'] : '';
$address2_hide = ! empty( $field['address2_hide'] ) ? 'wpforms-hide' : '';
$city_placeholder = ! empty( $field['city_placeholder'] ) ? $field['city_placeholder'] : '';
$city_default = ! empty( $field['city_default'] ) ? $field['city_default'] : '';