$attributes Block attributes. * @since 0.0.2 */ public function __construct( $attributes ) { $this->set_properties( $attributes ); $this->set_input_label( __( 'Phone', 'sureforms' ) ); $this->set_error_msg( $attributes, 'srfm_phone_block_required_text' ); $this->set_duplicate_msg( $attributes, 'srfm_phone_block_unique_text' ); $this->slug = 'phone'; $this->auto_country = $attributes['autoCountry'] ?? ''; $this->default_country = $attributes['defaultCountry'] ?? ''; $this->enable_country_filter = $attributes['enableCountryFilter'] ?? false; $this->country_filter_type = $attributes['countryFilterType'] ?? 'include'; $this->include_countries = $attributes['includeCountries'] ?? []; $this->exclude_countries = $attributes['excludeCountries'] ?? []; // When auto country is enabled, detect the visitor's country via server-side // IP geolocation (ipapi.co) instead of a client-side fetch. // // Why not get_locale()? // WordPress get_locale() returns the *site's* configured language (e.g. 'en_US'), // not the visitor's physical location. A site set to English would show 'US' for // every visitor worldwide — defeating the purpose of auto-country detection. // // Why server-side instead of client-side? // The previous client-side fetch('https://ipapi.co/json') caused CORS failures, // 429 rate limits on high-traffic sites, and exposed visitor IPs to a third party // directly from the browser. Moving it server-side eliminates all three issues. // // Performance: The API is called only once per visitor IP and cached in a transient // for 24 hours — subsequent page loads for the same IP resolve instantly from cache. if ( $this->auto_country ) { $this->default_country = $this->get_geo_country(); } $this->set_unique_slug(); $this->set_field_name( $this->unique_slug ); $this->set_markup_properties( $this->input_label, true ); $this->set_aria_described_by(); $this->set_label_as_placeholder( $this->input_label ); } /** * Render the sureforms phone classic styling * * @since 0.0.2 * @return string|bool */ public function markup() { ob_start(); ?>