{"id":292710,"date":"2026-04-23T11:47:43","date_gmt":"2026-04-23T11:47:43","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/yelocate\/"},"modified":"2026-04-23T11:46:44","modified_gmt":"2026-04-23T11:46:44","slug":"yelocate","status":"publish","type":"plugin","link":"https:\/\/lv.wordpress.org\/plugins\/yelocate\/","author":23461504,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"0.3.0","stable_tag":"trunk","tested":"6.9.4","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Yelocate","header_author":"Yelo Software","header_description":"Validates checkout address, email, and phone via external API and shows informational banners.","assets_banners_color":"","last_updated":"2026-04-23 11:46:44","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":153,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"vladmihut","date":"2026-04-23 11:47:08"}},"upgrade_notice":[],"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Plugin settings page \u2014 shared API credentials","2":"Plugin settings page \u2014 address validation configuration","3":"Plugin settings page \u2014 email and phone verification configuration","4":"Address validation banner on checkout","5":"Email verification banner on checkout","6":"Phone verification banner on checkout"},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[2183,3148,2182,226304,286],"plugin_category":[45],"plugin_contributors":[],"plugin_business_model":[],"class_list":["post-292710","plugin","type-plugin","status-publish","hentry","plugin_tags-address-validation","plugin_tags-checkout","plugin_tags-email-validation","plugin_tags-phone-validation","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_committers-vladmihut"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/yelocate.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p><strong>Yelocate<\/strong> improves WooCommerce checkout by validating customer addresses, email addresses, and phone numbers in real time using an external validation API.<\/p>\n\n<p>The plugin works by collecting checkout field values in the browser and sending them to a server-side AJAX handler in WordPress. The handler securely calls the configured validation API and returns a normalised response displayed to the customer as an inline banner near the relevant field.<\/p>\n\n<p>Each validation type (address, email, phone) can be enabled or disabled independently and configured with its own CSS selectors, so the plugin adapts to any checkout layout \u2014 classic WooCommerce or block-based.<\/p>\n\n<h3>External Services<\/h3>\n\n<p>This plugin connects to the Yelocate API (https:\/\/yelocate.com) to perform\nreal-time validation of addresses, email addresses, and phone numbers at\nWooCommerce checkout.<\/p>\n\n<p><strong>What data is sent and when:<\/strong><\/p>\n\n<ul>\n<li><strong>Address validation<\/strong> \u2014 billing address fields (address line 1, address\nline 2, city, state\/province, postcode, country) are sent to the API when\nthe customer fills in their billing address at checkout. Only triggered for\nthe 40 supported countries listed below; all other countries are silently\nskipped.<\/li>\n<li><strong>Email verification<\/strong> \u2014 the email address entered in the billing email\nfield is sent to the API as the customer types.<\/li>\n<li><strong>Phone verification<\/strong> \u2014 the phone number entered in the billing phone\nfield, along with the billing country code, is sent to the API when the\ncustomer leaves the field (on blur), provided at least 7 digits are present.<\/li>\n<\/ul>\n\n<p>Each validation type can be independently disabled. No API calls are made for\ndisabled validation types. The API key is stored server-side and is never\nexposed to the browser.<\/p>\n\n<p>This service is provided by Yelosoftware:\n* Terms of Service: https:\/\/yelocate.com\/terms\n* Privacy Policy: https:\/\/yelocate.com\/privacy<\/p>\n\n<h3>Features<\/h3>\n\n<ul>\n<li><strong>Address validation<\/strong> \u2014 verifies billing address in real time; detects missing components, suggests field-level corrections, and silently skips unsupported countries<\/li>\n<li><strong>Email verification<\/strong> \u2014 validates deliverability and detects disposable or malformed addresses as the customer types<\/li>\n<li><strong>Phone verification<\/strong> \u2014 validates phone numbers on blur once at least 7 digits are present; passes the billing country as the region code for accurate international validation<\/li>\n<li>Server-side API calls \u2014 the API key is never exposed to the browser<\/li>\n<li>Works with both classic and block-based WooCommerce checkout<\/li>\n<li>Each validation type has its own configurable CSS selectors and banner mount point<\/li>\n<li>Per-type enable\/disable toggles \u2014 only enabled validations trigger API calls<\/li>\n<li>Intelligent address diffing \u2014 for suggested addresses, the plugin compares entered vs. suggested values field by field; if the only differences are formatting or language conventions, the address is treated as valid<\/li>\n<li>Graceful handling of incomplete addresses and unsupported countries<\/li>\n<li>Fully configurable via WordPress Admin \u2192 Settings \u2192 Yelocate Validation<\/li>\n<\/ul>\n\n<h3>Supported Countries (Address Validation)<\/h3>\n\n<p>Address validation is only triggered for the following countries. For all other countries the plugin stays silent and no API call is made.<\/p>\n\n<p>Argentina (AR), Austria (AT), Australia (AU), Belgium (BE), Bulgaria (BG), Brazil (BR), Canada (CA), Switzerland (CH), Chile (CL), Colombia (CO), Czechia (CZ), Germany (DE), Denmark (DK), Estonia (EE), Spain (ES), Finland (FI), France (FR), United Kingdom (GB), Croatia (HR), Hungary (HU), Ireland (IE), India (IN), Italy (IT), Japan (JP), Lithuania (LT), Luxembourg (LU), Latvia (LV), Mexico (MX), Malaysia (MY), Netherlands (NL), Norway (NO), New Zealand (NZ), Poland (PL), Puerto Rico (PR), Portugal (PT), Sweden (SE), Singapore (SG), Slovenia (SI), Slovakia (SK), United States (US)<\/p>\n\n<h3>Configuration<\/h3>\n\n<h3>Shared<\/h3>\n\n<ul>\n<li><strong>API Key<\/strong> \u2014 authentication key generated in your Yelocate dashboard (https:\/\/yelocate.com). Sign up, purchase validation credits, and generate a key before configuring the plugin.  The key is stored server-side and never sent to the browser.<\/li>\n<li><strong>Strictness<\/strong> \u2014 controls address validation strictness (<code>normal<\/code> or <code>strict<\/code>)<\/li>\n<\/ul>\n\n<h3>Address Validation<\/h3>\n\n<ul>\n<li><strong>Enable address validation<\/strong> \u2014 tick to activate; untick to disable completely<\/li>\n<li><strong>API URL<\/strong> \u2014 address validation endpoint<\/li>\n<li><strong>Banner mount selector<\/strong> \u2014 CSS selector for the element above which the address banner is inserted<\/li>\n<li><strong>Address line 1 selector<\/strong><\/li>\n<li><strong>Address line 2 selector<\/strong> (optional)<\/li>\n<li><strong>City selector<\/strong><\/li>\n<li><strong>State \/ province selector<\/strong> (optional)<\/li>\n<li><strong>Postcode selector<\/strong><\/li>\n<li><strong>Country selector<\/strong><\/li>\n<\/ul>\n\n<p>Typical WooCommerce (classic) selectors:<\/p>\n\n<p>Address line 1: <code>#billing_address_1<\/code>\n  Address line 2: <code>#billing_address_2<\/code>\n  City:           <code>#billing_city<\/code>\n  State:          <code>#billing_state<\/code>\n  Postcode:       <code>#billing_postcode<\/code>\n  Country:        <code>#billing_country<\/code>\n  Banner mount:   <code>#billing_address_1_field<\/code><\/p>\n\n<h3>Email Verification<\/h3>\n\n<ul>\n<li><strong>Enable email verification<\/strong> \u2014 tick to activate<\/li>\n<li><strong>API URL<\/strong> \u2014 email verification endpoint<\/li>\n<li><strong>Banner mount selector<\/strong> \u2014 CSS selector for the element above which the email banner is inserted<\/li>\n<li><strong>Email input selector<\/strong> \u2014 CSS selector for the email input field<\/li>\n<\/ul>\n\n<p>Typical WooCommerce (classic) selectors:<\/p>\n\n<p>Email input:  <code>#billing_email<\/code>\n  Banner mount: <code>#billing_email_field<\/code><\/p>\n\n<h3>Phone Verification<\/h3>\n\n<ul>\n<li><strong>Enable phone verification<\/strong> \u2014 tick to activate<\/li>\n<li><strong>API URL<\/strong> \u2014 phone verification endpoint<\/li>\n<li><strong>Banner mount selector<\/strong> \u2014 CSS selector for the element above which the phone banner is inserted<\/li>\n<li><strong>Phone input selector<\/strong> \u2014 CSS selector for the phone input field<\/li>\n<\/ul>\n\n<p>Validation fires when the customer leaves the phone field, provided at least 7 digits are present. The billing country is automatically passed as the region code.<\/p>\n\n<p>Typical WooCommerce (classic) selectors:<\/p>\n\n<p>Phone input:  <code>#billing_phone<\/code>\n  Banner mount: <code>#billing_phone_field<\/code><\/p>\n\n<h3>License<\/h3>\n\n<p>This plugin is licensed under the GPLv2 or later.<\/p>\n\n<p>https:\/\/www.gnu.org\/licenses\/gpl-2.0.html<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/<\/code><\/li>\n<li>Activate the plugin via <strong>Plugins \u2192 Installed Plugins<\/strong><\/li>\n<li>Go to <strong>Settings \u2192 Yelocate Validation<\/strong><\/li>\n<li>Configure the shared API key, then enable and configure each validation type as needed<\/li>\n<li>Visit your WooCommerce checkout page and test the validation banners<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"how%20do%20i%20get%20an%20api%20key%3F\"><h3>How do I get an API key?<\/h3><\/dt>\n<dd><p>Create an account at https:\/\/yelocate.com, purchase validation credits, and generate an API key in your dashboard. Paste this key into the <strong>API Key<\/strong> field in WordPress under <strong>Settings \u2192 Yelocate Validation<\/strong>.<\/p><\/dd>\n<dt id=\"does%20this%20plugin%20expose%20the%20api%20key%20to%20the%20browser%3F\"><h3>Does this plugin expose the API key to the browser?<\/h3><\/dt>\n<dd><p>No. The API key is stored in WordPress options and used only in server-side AJAX requests. It is never included in the JavaScript configuration passed to the browser.<\/p><\/dd>\n<dt id=\"does%20this%20plugin%20block%20checkout%20if%20validation%20fails%3F\"><h3>Does this plugin block checkout if validation fails?<\/h3><\/dt>\n<dd><p>No. The plugin provides informational feedback but does not prevent the customer from completing checkout. You may extend this behaviour if desired.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20custom%20or%20block-based%20checkout%20layouts%3F\"><h3>Does it work with custom or block-based checkout layouts?<\/h3><\/dt>\n<dd><p>Yes. All field selectors and banner mount points are fully configurable, so the plugin supports custom and block-based checkout implementations as long as the correct CSS selectors are provided.<\/p><\/dd>\n<dt id=\"why%20is%20address%20validation%20not%20triggering%20for%20some%20countries%3F\"><h3>Why is address validation not triggering for some countries?<\/h3><\/dt>\n<dd><p>Address validation is silently skipped for countries not covered by the underlying API. See the \"Supported Countries\" section above for the full list. Email and phone validation are not restricted by country.<\/p><\/dd>\n<dt id=\"why%20does%20phone%20validation%20only%20fire%20when%20i%20leave%20the%20field%3F\"><h3>Why does phone validation only fire when I leave the field?<\/h3><\/dt>\n<dd><p>Phone numbers are validated on blur (when the field loses focus) rather than on every keystroke, to avoid unnecessary API calls while the customer is still typing. Validation is also skipped if fewer than 7 digits are present, which prevents calls on partially entered numbers.<\/p><\/dd>\n<dt id=\"the%20suggested%20address%20banner%20appeared%20but%20the%20address%20looks%20correct%20%E2%80%94%20why%3F\"><h3>The suggested address banner appeared but the address looks correct \u2014 why?<\/h3><\/dt>\n<dd><p>The plugin compares the entered and suggested address field by field (street, city, postcode, state). If the API returns a suggestion but the actual data values are identical \u2014 for example when the only difference is formatting or language \u2014 the plugin treats the address as valid and shows a success message instead.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.3.0<\/h4>\n\n<ul>\n<li>Added email verification with configurable field selector and banner mount<\/li>\n<li>Added phone verification with configurable field selector and banner mount; fires on blur with a minimum of 7 digits<\/li>\n<li>Each validation type can be independently enabled or disabled<\/li>\n<li>Address validation now silently skips countries not covered by the API (40 supported countries hardcoded)<\/li>\n<li>Replaced message-string matching with field-by-field comparison of entered vs. suggested postal address components (street, city, postcode, state); formatting-only differences are treated as valid<\/li>\n<li>Passed billing country as region code in phone validation requests<\/li>\n<li>Added hidden input alongside each checkbox to ensure unchecked state is correctly persisted in WordPress options<\/li>\n<li>Settings page renamed to \"Yelocate Validation\" and restructured into sections: API Credentials, Address Validation, Email Verification, Phone Verification<\/li>\n<\/ul>\n\n<h4>0.2.0<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<li>Address validation via external API<\/li>\n<li>Configurable checkout selectors<\/li>\n<li>AJAX validation endpoint<\/li>\n<\/ul>","raw_excerpt":"Real-time address, email, and phone validation for WooCommerce checkout \u2014 powered by the Yelocate API.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/lv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/292710","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/lv.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/lv.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=292710"}],"author":[{"embeddable":true,"href":"https:\/\/lv.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/vladmihut"}],"wp:attachment":[{"href":"https:\/\/lv.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=292710"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/lv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=292710"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/lv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=292710"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/lv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=292710"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/lv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=292710"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/lv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=292710"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}