{"id":278012,"date":"2026-02-03T17:16:55","date_gmt":"2026-02-03T17:16:55","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/a1-tools\/"},"modified":"2026-04-01T18:25:34","modified_gmt":"2026-04-01T18:25:34","slug":"a1-tools","status":"publish","type":"plugin","link":"https:\/\/es-gt.wordpress.org\/plugins\/a1-tools\/","author":23444128,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"2.3.0","stable_tag":"2.3.0","tested":"6.9.4","requires":"5.0","requires_php":"7.4","requires_plugins":null,"header_name":"A1 Tools","header_author":"A1 Chimney","header_description":"Connects your WordPress site to the A1 Tools platform for centralized management of contact information, social media links, and business details.","assets_banners_color":"825b2d","last_updated":"2026-04-01 18:25:34","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/tools.a-1chimney.com","header_author_uri":"https:\/\/a-1chimney.com","rating":0,"author_block_rating":0,"active_installs":90,"downloads":3322,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.10.0":{"tag":"1.10.0","author":"a1tools","date":"2026-03-09 15:03:13"},"1.3.2":{"tag":"1.3.2","author":"a1tools","date":"2026-02-03 17:24:12"},"1.4.0":{"tag":"1.4.0","author":"a1tools","date":"2026-02-03 17:25:21"},"1.4.1":{"tag":"1.4.1","author":"a1tools","date":"2026-02-03 17:40:13"},"1.4.10":{"tag":"1.4.10","author":"a1tools","date":"2026-02-10 16:11:21"},"1.4.11":{"tag":"1.4.11","author":"a1tools","date":"2026-02-16 17:37:16"},"1.4.12":{"tag":"1.4.12","author":"a1tools","date":"2026-02-16 20:06:07"},"1.4.13":{"tag":"1.4.13","author":"a1tools","date":"2026-02-20 17:56:41"},"1.4.14":{"tag":"1.4.14","author":"a1tools","date":"2026-02-23 15:51:48"},"1.4.2":{"tag":"1.4.2","author":"a1tools","date":"2026-02-04 15:57:56"},"1.4.3":{"tag":"1.4.3","author":"a1tools","date":"2026-02-04 20:46:16"},"1.4.4":{"tag":"1.4.4","author":"a1tools","date":"2026-02-09 18:00:42"},"1.4.5":{"tag":"1.4.5","author":"a1tools","date":"2026-02-09 18:16:44"},"1.4.6":{"tag":"1.4.6","author":"a1tools","date":"2026-02-10 15:46:54"},"1.4.7":{"tag":"1.4.7","author":"a1tools","date":"2026-02-10 15:49:54"},"1.4.8":{"tag":"1.4.8","author":"a1tools","date":"2026-02-10 16:00:35"},"1.4.9":{"tag":"1.4.9","author":"a1tools","date":"2026-02-10 16:05:44"},"1.5.0":{"tag":"1.5.0","author":"a1tools","date":"2026-02-23 15:52:56"},"1.5.1":{"tag":"1.5.1","author":"a1tools","date":"2026-02-23 17:03:16"},"1.5.2":{"tag":"1.5.2","author":"a1tools","date":"2026-02-24 17:11:54"},"1.5.3":{"tag":"1.5.3","author":"a1tools","date":"2026-02-24 17:52:42"},"1.5.4":{"tag":"1.5.4","author":"a1tools","date":"2026-02-24 17:58:29"},"1.5.5":{"tag":"1.5.5","author":"a1tools","date":"2026-02-27 15:45:15"},"1.5.6":{"tag":"1.5.6","author":"a1tools","date":"2026-02-27 16:03:10"},"1.5.7":{"tag":"1.5.7","author":"a1tools","date":"2026-02-27 16:18:25"},"1.5.8":{"tag":"1.5.8","author":"a1tools","date":"2026-02-27 16:28:37"},"1.5.9":{"tag":"1.5.9","author":"a1tools","date":"2026-02-27 16:39:05"},"1.6.0":{"tag":"1.6.0","author":"a1tools","date":"2026-02-27 16:53:29"},"1.6.1":{"tag":"1.6.1","author":"a1tools","date":"2026-02-27 17:03:50"},"1.6.2":{"tag":"1.6.2","author":"a1tools","date":"2026-02-27 17:24:39"},"1.6.3":{"tag":"1.6.3","author":"a1tools","date":"2026-02-27 17:45:25"},"1.6.4":{"tag":"1.6.4","author":"a1tools","date":"2026-02-27 20:53:11"},"1.6.5":{"tag":"1.6.5","author":"a1tools","date":"2026-03-02 18:48:04"},"1.6.6":{"tag":"1.6.6","author":"a1tools","date":"2026-03-02 19:35:33"},"1.6.7":{"tag":"1.6.7","author":"a1tools","date":"2026-03-02 19:43:09"},"1.6.8":{"tag":"1.6.8","author":"a1tools","date":"2026-03-02 19:47:07"},"1.6.9":{"tag":"1.6.9","author":"a1tools","date":"2026-03-02 19:54:53"},"1.7.0":{"tag":"1.7.0","author":"a1tools","date":"2026-03-03 13:02:35"},"1.7.1":{"tag":"1.7.1","author":"a1tools","date":"2026-03-03 16:20:27"},"1.7.2":{"tag":"1.7.2","author":"a1tools","date":"2026-03-03 16:29:51"},"1.7.3":{"tag":"1.7.3","author":"a1tools","date":"2026-03-03 16:50:49"},"1.7.4":{"tag":"1.7.4","author":"a1tools","date":"2026-03-03 17:06:19"},"1.7.5":{"tag":"1.7.5","author":"a1tools","date":"2026-03-03 19:51:42"},"1.7.6":{"tag":"1.7.6","author":"a1tools","date":"2026-03-03 20:20:51"},"1.7.7":{"tag":"1.7.7","author":"a1tools","date":"2026-03-03 20:42:19"},"1.7.8":{"tag":"1.7.8","author":"a1tools","date":"2026-03-03 20:53:24"},"1.7.9":{"tag":"1.7.9","author":"a1tools","date":"2026-03-04 17:00:58"},"1.8.0":{"tag":"1.8.0","author":"a1tools","date":"2026-03-04 17:04:28"},"1.8.1":{"tag":"1.8.1","author":"a1tools","date":"2026-03-04 18:14:16"},"1.8.2":{"tag":"1.8.2","author":"a1tools","date":"2026-03-04 18:54:01"},"1.8.3":{"tag":"1.8.3","author":"a1tools","date":"2026-03-04 18:58:06"},"1.8.4":{"tag":"1.8.4","author":"a1tools","date":"2026-03-04 19:29:43"},"1.8.5":{"tag":"1.8.5","author":"a1tools","date":"2026-03-04 19:44:22"},"1.8.6":{"tag":"1.8.6","author":"a1tools","date":"2026-03-04 19:57:58"},"1.9.0":{"tag":"1.9.0","author":"a1tools","date":"2026-03-05 14:27:39"},"1.9.1":{"tag":"1.9.1","author":"a1tools","date":"2026-03-05 14:37:58"},"1.9.2":{"tag":"1.9.2","author":"a1tools","date":"2026-03-06 18:48:23"},"1.9.3":{"tag":"1.9.3","author":"a1tools","date":"2026-03-06 20:19:02"},"1.9.4":{"tag":"1.9.4","author":"a1tools","date":"2026-03-09 14:01:25"},"1.9.5":{"tag":"1.9.5","author":"a1tools","date":"2026-03-09 14:02:55"},"1.9.6":{"tag":"1.9.6","author":"a1tools","date":"2026-03-09 14:14:20"},"1.9.7":{"tag":"1.9.7","author":"a1tools","date":"2026-03-09 14:30:38"},"1.9.8":{"tag":"1.9.8","author":"a1tools","date":"2026-03-09 14:47:56"},"1.9.9":{"tag":"1.9.9","author":"a1tools","date":"2026-03-09 14:55:31"},"2.0.0":{"tag":"2.0.0","author":"a1tools","date":"2026-03-09 15:07:11"},"2.0.1":{"tag":"2.0.1","author":"a1tools","date":"2026-03-09 15:17:22"},"2.0.2":{"tag":"2.0.2","author":"a1tools","date":"2026-03-09 17:02:31"},"2.0.4":{"tag":"2.0.4","author":"a1tools","date":"2026-03-10 12:43:56"},"2.0.5":{"tag":"2.0.5","author":"a1tools","date":"2026-03-13 13:33:23"},"2.0.6":{"tag":"2.0.6","author":"a1tools","date":"2026-03-13 15:13:40"},"2.0.7":{"tag":"2.0.7","author":"a1tools","date":"2026-03-13 16:09:56"},"2.1.5":{"tag":"2.1.5","author":"a1tools","date":"2026-03-23 16:50:50"},"2.1.6":{"tag":"2.1.6","author":"a1tools","date":"2026-03-24 13:41:45"},"2.2.0":{"tag":"2.2.0","author":"a1tools","date":"2026-03-24 17:07:35"},"2.3.0":{"tag":"2.3.0","author":"a1tools","date":"2026-04-01 18:25:34"}},"upgrade_notice":{"1.4.0":"<p>Added auto-updates support for WordPress.<\/p>","1.3.2":"<p>Fixed WordPress.org compliance issues with inline styles and added Google Maps documentation.<\/p>","1.3.1":"<p>Fixed Plugin Check errors. Font Awesome is no longer auto-loaded - ensure your theme includes it or install a Font Awesome plugin.<\/p>","1.3.0":"<p><strong>Important:<\/strong> All shortcode names have changed from <code>[a1_*]<\/code> to <code>[a1tools_*]<\/code>. Please update your shortcodes after upgrading. Example: <code>[a1_var]<\/code> is now <code>[a1tools_var]<\/code>.<\/p>","1.2.0":"<p>New Social Icons Widget with full styling customization. Enhanced shortcode with style, shape, size, and hover effect options.<\/p>","1.1.0":"<p>Added 6 new social media platforms: Pinterest, BBB, Nextdoor, Houzz, Angi, Thumbtack.<\/p>","1.0.9":"<p>Added settings page with configurable cache duration and manual cache clear button. Default cache reduced to 5 minutes.<\/p>","1.0.8":"<p>Added city name, state, and Google Maps location fields with new shortcodes.<\/p>","1.0.0":"<p>Initial release of A1 Tools plugin.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3453106,"resolution":"128x128","location":"assets","locale":""},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3453106,"resolution":"256x256","location":"assets","locale":""}},"assets_banners":{"banner-772x250.png":{"filename":"banner-772x250.png","revision":3453106,"resolution":"772x250","location":"assets","locale":""}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.10.0","1.3.2","1.4.0","1.4.1","1.4.10","1.4.11","1.4.12","1.4.13","1.4.14","1.4.2","1.4.3","1.4.4","1.4.5","1.4.6","1.4.7","1.4.8","1.4.9","1.5.0","1.5.1","1.5.2","1.5.3","1.5.4","1.5.5","1.5.6","1.5.7","1.5.8","1.5.9","1.6.0","1.6.1","1.6.2","1.6.3","1.6.4","1.6.5","1.6.6","1.6.7","1.6.8","1.6.9","1.7.0","1.7.1","1.7.2","1.7.3","1.7.4","1.7.5","1.7.6","1.7.7","1.7.8","1.7.9","1.8.0","1.8.1","1.8.2","1.8.3","1.8.4","1.8.5","1.8.6","1.9.0","1.9.1","1.9.2","1.9.3","1.9.4","1.9.5","1.9.6","1.9.7","1.9.8","1.9.9","2.0.0","2.0.1","2.0.2","2.0.4","2.0.5","2.0.6","2.0.7","2.1.5","2.1.6","2.2.0","2.3.0"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Site Variables management in A1 Tools dashboard","2":"Using shortcodes in the WordPress editor","3":"Elementor dynamic tags integration"},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[25998,1092,2686,357,255157],"plugin_category":[43,51],"plugin_contributors":[255158],"plugin_business_model":[],"class_list":["post-278012","plugin","type-plugin","status-publish","hentry","plugin_tags-business-information","plugin_tags-contact-info","plugin_tags-multi-site","plugin_tags-shortcodes","plugin_tags-site-variables","plugin_category-customization","plugin_category-multisite","plugin_contributors-a1tools","plugin_committers-a1tools"],"banners":{"banner":"https:\/\/ps.w.org\/a1-tools\/assets\/banner-772x250.png?rev=3453106","banner_2x":false,"banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/a1-tools\/assets\/icon-128x128.png?rev=3453106","icon_2x":"https:\/\/ps.w.org\/a1-tools\/assets\/icon-256x256.png?rev=3453106","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>A1 Tools connects your WordPress site to the A1 Tools platform, enabling centralized management of business information that can be displayed anywhere on your site using simple shortcodes.<\/p>\n\n<p><strong>Perfect for businesses with multiple websites<\/strong> - update your phone number, address, or social media links once in the A1 Tools dashboard, and all your connected sites update automatically.<\/p>\n\n<h4>Features<\/h4>\n\n<ul>\n<li><strong>Centralized Management<\/strong> - Manage all your site variables from one dashboard<\/li>\n<li><strong>Simple Shortcodes<\/strong> - Display any variable with <code>[a1tools_var key=\"phone_primary\"]<\/code><\/li>\n<li><strong>Address Formatting<\/strong> - Multiple address display formats available<\/li>\n<li><strong>Operating Hours<\/strong> - Display business hours as tables or lists<\/li>\n<li><strong>Social Media Links<\/strong> - Output all social icons with one shortcode or widget<\/li>\n<li><strong>Social Icons Widget<\/strong> - Customizable widget with style, shape, size, and hover effects<\/li>\n<li><strong>Elementor Support<\/strong> - Dynamic tags for Elementor page builder<\/li>\n<li><strong>Performance Optimized<\/strong> - Configurable caching (default 5 minutes)<\/li>\n<li><strong>Developer Friendly<\/strong> - PHP functions available for theme developers<\/li>\n<\/ul>\n\n<h4>Available Variables<\/h4>\n\n<ul>\n<li>Business name, city name, state\/location name, tagline<\/li>\n<li>Google Maps URL for location<\/li>\n<li>Primary and secondary phone numbers<\/li>\n<li>Primary and secondary email addresses<\/li>\n<li>Full address (line 1, line 2, city, state, ZIP, country)<\/li>\n<li>Social media URLs (Facebook, Instagram, YouTube, Twitter, LinkedIn, TikTok, Yelp, Google Business)<\/li>\n<li>Operating hours for each day of the week<\/li>\n<\/ul>\n\n<h4>Shortcode Examples<\/h4>\n\n<pre><code>[a1tools_var key=\"phone_primary\"] - Display primary phone number\n\n[a1tools_var key=\"facebook_url\" link=\"true\"] - Display Facebook URL as clickable link\n\n[a1tools_address format=\"full\"] - Display complete formatted address (multi-line)\n\n[a1tools_full_address] - Display full address in a single line (e.g., \"123 Main St, Suite 101, Miami, FL 30001\")\n\n[a1tools_hours format=\"table\"] - Display operating hours as a table\n\n[a1tools_social_links] - Display all configured social media icons\n\n[a1tools_social_links style=\"default\" shape=\"circle\" size=\"50\"] - Styled social icons\n\n[a1tools_city_name] - Display the city name for geo-targeting\n\n[a1tools_state] - Display the state name for geo-targeting\n\n[a1tools_google_map type=\"link\"] - Display Google Maps link\n\n[a1tools_google_map type=\"embed\" width=\"100%\" height=\"400\"] - Embed Google Maps iframe\n<\/code><\/pre>\n\n<h4>Requirements<\/h4>\n\n<ul>\n<li>Your WordPress site must be registered in the A1 Tools platform<\/li>\n<li>An active A1 Tools account with site variables configured<\/li>\n<li>Font Awesome 6 for social icons (most themes include this; if not, use a Font Awesome plugin)<\/li>\n<\/ul>\n\n<h3>External Services<\/h3>\n\n<p>This plugin relies on a third-party service to retrieve site variables (business information, contact details, social media URLs, etc.) that you configure in the A1 Tools dashboard.<\/p>\n\n<h4>A1 Tools API<\/h4>\n\n<p><strong>What it is:<\/strong> A1 Tools is a business management platform operated by A1 Chimney Service that allows businesses to centrally manage their contact information, addresses, operating hours, and social media links across multiple websites.<\/p>\n\n<p><strong>What data is sent:<\/strong> When this plugin is activated and the site loads (or when a shortcode is used), the plugin sends your WordPress site URL to the A1 Tools API to retrieve the site variables you have configured for that specific site.<\/p>\n\n<p><strong>When data is sent:<\/strong>\n- When a page containing A1 Tools shortcodes is loaded\n- When the plugin's admin settings page is accessed\n- When the cache expires and fresh data is needed (configurable, default 5 minutes)<\/p>\n\n<p><strong>What data is received:<\/strong> The plugin receives only the site variables you have configured in your A1 Tools dashboard, such as business name, phone numbers, email addresses, physical address, operating hours, and social media URLs.<\/p>\n\n<p><strong>Service Provider:<\/strong> A1 Chimney Service\n<strong>API Endpoint:<\/strong> https:\/\/tools.a-1chimney.com\/api\/website_variables.php\n<strong>Terms of Service:<\/strong> https:\/\/a-1chimney.com\/terms-of-service\/\n<strong>Privacy Policy:<\/strong> https:\/\/a-1chimney.com\/privacy-policy\/<\/p>\n\n<h4>Google Maps Embed API<\/h4>\n\n<p><strong>What it is:<\/strong> Google Maps is a web mapping service developed by Google. This plugin can embed Google Maps iframes to display your business location.<\/p>\n\n<p><strong>What data is sent:<\/strong> When using the <code>[a1tools_google_map type=\"embed\"]<\/code> shortcode, your visitor's browser loads an iframe from Google Maps containing your business address or place ID that you configured in the A1 Tools dashboard.<\/p>\n\n<p><strong>When data is sent:<\/strong>\n- Only when a page containing the <code>[a1tools_google_map type=\"embed\"]<\/code> shortcode is loaded\n- The embed is loaded client-side by the visitor's browser directly from Google<\/p>\n\n<p><strong>What data is received:<\/strong> Google Maps returns the embedded map showing your business location. Google may collect visitor data according to their privacy policy.<\/p>\n\n<p><strong>Service Provider:<\/strong> Google LLC\n<strong>Embed URL:<\/strong> https:\/\/www.google.com\/maps\/embed\/v1\/place\n<strong>Terms of Service:<\/strong> https:\/\/www.google.com\/intl\/en_us\/help\/terms_maps\/\n<strong>Privacy Policy:<\/strong> https:\/\/policies.google.com\/privacy<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>a1-tools<\/code> folder to the <code>\/wp-content\/plugins\/<\/code> directory<\/li>\n<li>Activate the plugin through the 'Plugins' menu in WordPress<\/li>\n<li>Ensure your site is registered in your A1 Tools dashboard under Integrations &gt; WordPress Sites<\/li>\n<li>Configure your site variables in A1 Tools under Marketing Tools &gt; Web Management &gt; Site Variables<\/li>\n<li>Use the shortcodes in your pages, posts, or widgets<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"how%20do%20i%20get%20an%20a1%20tools%20account%3F\"><h3>How do I get an A1 Tools account?<\/h3><\/dt>\n<dd><p>A1 Tools is a business management platform. Contact A1 Chimney Service for access information.<\/p><\/dd>\n<dt id=\"why%20are%20my%20variables%20not%20showing%3F\"><h3>Why are my variables not showing?<\/h3><\/dt>\n<dd><ol>\n<li>Verify your site URL in A1 Tools matches your WordPress site URL exactly (including https:\/\/)<\/li>\n<li>Check that you have saved variables for this site in A1 Tools<\/li>\n<li>Go to A1 Tools in your admin menu and click \"Clear Cache Now\" to fetch fresh data<\/li>\n<\/ol><\/dd>\n<dt id=\"how%20often%20do%20variables%20update%3F\"><h3>How often do variables update?<\/h3><\/dt>\n<dd><p>Variables are cached based on your settings (default 5 minutes). You can configure the cache duration or disable caching entirely in the A1 Tools settings page. To force an immediate update, use the \"Clear Cache Now\" button on the settings page.<\/p><\/dd>\n<dt id=\"can%20i%20use%20this%20with%20elementor%3F\"><h3>Can I use this with Elementor?<\/h3><\/dt>\n<dd><p>Yes! The plugin registers dynamic tags that appear under the \"A1 Tools\" group in Elementor. You can also use the Shortcode widget with any of the available shortcodes.<\/p><\/dd>\n<dt id=\"is%20this%20plugin%20free%3F\"><h3>Is this plugin free?<\/h3><\/dt>\n<dd><p>The plugin is free and open source. However, it requires an A1 Tools account to function, as it retrieves data from the A1 Tools platform.<\/p><\/dd>\n<dt id=\"what%20data%20does%20this%20plugin%20send%20to%20external%20services%3F\"><h3>What data does this plugin send to external services?<\/h3><\/dt>\n<dd><p>See the \"External Services\" section above for complete details. In summary, the plugin sends your site URL to the A1 Tools API to retrieve the site variables you have configured. No personal user data from your visitors is collected or transmitted.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.3.0<\/h4>\n\n<ul>\n<li>Added: licence field to site variables<\/li>\n<li>Added: [a1tools_licence] shortcode for displaying licence number<\/li>\n<\/ul>\n\n<h4>2.2.0<\/h4>\n\n<ul>\n<li>New: Blog Sync REST endpoints for cross-site post management<\/li>\n<li>New: \/blog-posts endpoint for listing posts with metadata and Yoast SEO<\/li>\n<li>New: \/blog-posts\/{id} endpoint for full post content with SEO data<\/li>\n<li>New: \/blog-sync\/create endpoint for creating synced posts with categories, tags, featured images, and Yoast SEO<\/li>\n<li>New: \/blog-sync\/update\/{id} endpoint for updating synced posts<\/li>\n<li>New: Image sideloading helper for featured image sync across sites<\/li>\n<\/ul>\n\n<h4>2.1.6<\/h4>\n\n<ul>\n<li>Fixed: SEO location shortcode names in app reference had incorrect <em>seo<\/em> prefix<\/li>\n<li>New: SEO Location Shortcodes section on A1 Tools settings page with sample values and copy buttons<\/li>\n<li>New: Expandable \"View all locations\" table on settings page for multi-location sites<\/li>\n<\/ul>\n\n<h4>2.1.3<\/h4>\n\n<ul>\n<li>Fixed: All Plugin Check errors and warnings resolved<\/li>\n<li>Fixed: Output escaping on social icon HTML<\/li>\n<li>Fixed: Added translators comment for Elementor widget<\/li>\n<li>Fixed: Replaced rename() with WP_Filesystem::move()<\/li>\n<li>Fixed: Added wp_unslash() to all $_POST\/$_SERVER inputs<\/li>\n<li>Fixed: Prefixed global variables in uninstall.php<\/li>\n<\/ul>\n\n<h4>2.1.2<\/h4>\n\n<ul>\n<li>Fixed: Plugin zip packaging for WordPress compatibility<\/li>\n<\/ul>\n\n<h4>2.1.1<\/h4>\n\n<ul>\n<li>Fixed: Syntax error in media management module<\/li>\n<\/ul>\n\n<h4>2.1.0<\/h4>\n\n<ul>\n<li>Security: Full security and standards audit per WordPress Plugin Directory review<\/li>\n<li>Removed: Update URI header (per WordPress.org guidelines)<\/li>\n<li>Fixed: Output escaping in city address inline format<\/li>\n<li>Fixed: REST API permission callback now uses WP_REST_Request instead of getallheaders()<\/li>\n<li>Fixed: All database queries now use $wpdb-&gt;prepare()<\/li>\n<li>Fixed: Replaced @unlink() with wp_delete_file()<\/li>\n<li>Fixed: error_log() calls now wrapped in WP_DEBUG checks<\/li>\n<li>Improved: Uninstall handler now cleans up all plugin options and transients<\/li>\n<li>Updated: Tested up to WordPress 6.9<\/li>\n<\/ul>\n\n<h4>2.0.10<\/h4>\n\n<ul>\n<li>New: City, Full Address, and State fields for SEO location pages<\/li>\n<li>New: [a1tools_location_city], [a1tools_location_address], [a1tools_location_state] shortcodes<\/li>\n<li>Improved: [a1tools_location_web] link text now uses full address, [a1tools_city_web] uses city name, [a1tools_state_web] uses state name<\/li>\n<\/ul>\n\n<h4>2.0.9<\/h4>\n\n<ul>\n<li>New: SEO Locations system \u2014 manage phone, URLs, map address, and Street View embed per SEO City page<\/li>\n<li>New: 7 shortcodes \u2014 [a1tools_location_phone], [a1tools_location_web], [a1tools_city_web], [a1tools_state_web], [a1tools_map_address], [a1tools_viewpoint], [a1tools_location_list]<\/li>\n<li>New: Data fetchers for SEO City author pages (separate from regular City Pages)<\/li>\n<\/ul>\n\n<h4>2.0.8<\/h4>\n\n<ul>\n<li>Refactor: Split monolithic plugin file into logical modules for maintainability<\/li>\n<li>New: Cache invalidation REST endpoint for programmatic cache busting<\/li>\n<li>Improved: Plugin architecture \u2014 shortcodes, data fetching, admin, forms, REST API, Elementor, and Yoast integration now in separate include files<\/li>\n<\/ul>\n\n<h4>2.0.7<\/h4>\n\n<ul>\n<li>New: [a1tools_post_title] shortcode \u2014 outputs the current post\/page title with optional tag, class, before\/after text<\/li>\n<\/ul>\n\n<h4>2.0.6<\/h4>\n\n<ul>\n<li>Improved: CRM leads now capture service requested, appointment date\/time, and state from form submissions<\/li>\n<li>Improved: Leads stored with separate service_need, preferred_date, preferred_time fields<\/li>\n<\/ul>\n\n<h4>2.0.5<\/h4>\n\n<ul>\n<li>Maintenance: Version bump to sync latest plugin updates<\/li>\n<\/ul>\n\n<h4>2.0.2<\/h4>\n\n<ul>\n<li>New: CRM Lead Integration \u2014 form submissions now optionally create CRM leads<\/li>\n<li>New: CRM Company ID and CRM Franchise ID settings for targeting leads to specific CRM locations<\/li>\n<\/ul>\n\n<h4>2.0.1<\/h4>\n\n<ul>\n<li>New: Replace File button \u2014 swap a media file with a new upload while keeping the same attachment ID, URL, and post references<\/li>\n<li>Replaces physical file, regenerates all thumbnails, updates MIME type and metadata automatically<\/li>\n<\/ul>\n\n<h4>2.0.0<\/h4>\n\n<ul>\n<li>Improved: Unified Save button \u2014 renames file (if changed) and saves all meta in one click<\/li>\n<li>New: Delete button to permanently remove media files<\/li>\n<li>Improved: Full-width input fields for better usability<\/li>\n<li>Improved: Update refs checkbox moved to actions row with Save and Delete<\/li>\n<\/ul>\n\n<h4>1.9.9<\/h4>\n\n<ul>\n<li>New: Media Management \u2014 Title, Caption, and Description fields matching WordPress Media editor<\/li>\n<li>Improved: Aligned field labels (File Name, Alt Text, Title, Caption, Description) for clean layout<\/li>\n<li>Improved: Single \"Save Details\" button saves all meta fields at once<\/li>\n<\/ul>\n\n<h4>1.9.8<\/h4>\n\n<ul>\n<li>New: SEO score badges (0-4) per media item \u2014 filename quality, alt text, file size, usage<\/li>\n<li>New: Inline alt text editor \u2014 edit image alt text directly from the media list<\/li>\n<li>New: Smart SEO filters \u2014 Needs Rename, Missing Alt Text, Large Files, Unused Media, SEO Optimized<\/li>\n<li>New: Random filename detection \u2014 automatically flags camera\/screenshot\/gibberish filenames<\/li>\n<li>New: Usage tracking \u2014 shows how many posts reference each media file<\/li>\n<li>New: File size warnings \u2014 badges for oversized files (&gt;500KB)<\/li>\n<li>New: Bulk rename with pattern \u2014 select multiple files, rename with auto-incrementing pattern<\/li>\n<li>New: Bulk alt text \u2014 set alt text for multiple images at once (supports {filename} variable)<\/li>\n<li>New: Undo rename \u2014 revert a rename with one click<\/li>\n<li>New: Duplicate file detection \u2014 finds identical files uploaded multiple times<\/li>\n<li>New: Sort options \u2014 sort by date or filename, ascending or descending<\/li>\n<\/ul>\n\n<h4>1.9.7<\/h4>\n\n<ul>\n<li>Improved: Media Management \u2014 wider rename input field and MIME type filter dropdown<\/li>\n<li>New: Media Management \u2014 click any image thumbnail to preview full-size in a lightbox<\/li>\n<\/ul>\n\n<h4>1.9.4<\/h4>\n\n<ul>\n<li>New: Media Management tool \u2014 browse and rename media files with SEO-friendly names<\/li>\n<li>New: Renames physical files, thumbnails, updates metadata, and optionally updates post references<\/li>\n<li>New: Photo shape option for Team widget \u2014 circle or square (fill card)<\/li>\n<li>Fix: Team widget card background is now transparent by default (customizable in Style tab)<\/li>\n<li>Fix: Elementor editor now live-updates when changing Team widget content settings<\/li>\n<li>Improvement: Columns max increased from 4 to 6<\/li>\n<\/ul>\n\n<h4>1.9.3<\/h4>\n\n<ul>\n<li>Fix: City link and state link shortcodes now correctly receive URL data from API<\/li>\n<li>Fix: API public endpoint now returns city_url and state_url fields<\/li>\n<\/ul>\n\n<h4>1.9.2<\/h4>\n\n<ul>\n<li>New: [a1tools_city_link] shortcode \u2014 outputs city name as a clickable link<\/li>\n<li>New: [a1tools_state_link] shortcode \u2014 outputs state name as a clickable link<\/li>\n<li>New: City Link URL and State Link URL fields in site Information tab<\/li>\n<li>Both shortcodes support text, target, and class attributes<\/li>\n<li>Falls back to plain text when no URL is configured<\/li>\n<\/ul>\n\n<h4>1.9.1<\/h4>\n\n<ul>\n<li>New: Team member categories \u2014 assign members to categories (e.g., Management, Technicians, Office)<\/li>\n<li>New: Team members grouped by category with section headings on the website<\/li>\n<li>New: Category display order control via Elementor widget or shortcode attribute<\/li>\n<li>New: Category Heading style controls in Elementor (typography, color, border color, spacing)<\/li>\n<li>New: [a1tools_team category=\"Management\"] \u2014 filter to a single category<\/li>\n<li>New: [a1tools_team category_order=\"Management, Technicians\"] \u2014 set category display order<\/li>\n<li>Fix: Services tab now correctly discovers WordPress service pages<\/li>\n<\/ul>\n\n<h4>1.9.0<\/h4>\n\n<ul>\n<li>New: A1 Services Elementor widget and [a1tools_services] shortcode \u2014 display site-specific service cards loaded from WordPress pages<\/li>\n<li>New: A1 Reviews Elementor widget and [a1tools_reviews] shortcode \u2014 display customer reviews with star ratings in grid, carousel, or list layout<\/li>\n<li>New: A1 Before\/After Elementor widget and [a1tools_before_after] shortcode \u2014 comparison slider or grid of before\/after project photos<\/li>\n<li>New: A1 Team Elementor widget and [a1tools_team] shortcode \u2014 display team member cards with photo, role, bio, and certifications<\/li>\n<li>New: A1 FAQ Elementor widget and [a1tools_faq] shortcode \u2014 accordion FAQ with Schema.org FAQPage JSON-LD structured data<\/li>\n<li>New: Services tab in site view \u2014 loads WordPress pages by \"Large Service\" author for per-site service management<\/li>\n<li>New: Reviews, Before\/After, Team, and FAQ tabs in group settings view for cross-site content management<\/li>\n<li>Five new API endpoints for full CRUD operations on all new content types<\/li>\n<li>All new shortcodes support layout options (grid\/list\/carousel\/slider), column controls, featured-only filtering, and custom CSS classes<\/li>\n<li>Elementor widgets include full content and style controls with responsive settings<\/li>\n<\/ul>\n\n<h4>1.8.4<\/h4>\n\n<ul>\n<li>New: Accordion\/collapsible groups \u2014 collapse city lists under clickable group headings<\/li>\n<li>New: Accordion settings \u2014 default state (collapsed\/expanded), open behavior (multiple\/single), arrow indicator<\/li>\n<li>New: Search bar \u2014 live-filter search box that filters cities as you type, auto-expands matching accordion groups<\/li>\n<li>New: City count badge \u2014 display number of cities per group in the heading<\/li>\n<li>New: Elementor style controls for accordion (arrow color, size, animation speed), search bar (typography, colors, border, padding), and count badge color<\/li>\n<li>Keyboard accessible accordion (Enter\/Space to toggle)<\/li>\n<\/ul>\n\n<h4>1.8.6<\/h4>\n\n<ul>\n<li>Fix: Mobile\/tablet responsive columns now work correctly in Elementor widget<\/li>\n<li>Fix: Inline column styles no longer override Elementor responsive breakpoint settings<\/li>\n<\/ul>\n\n<h4>1.8.5<\/h4>\n\n<ul>\n<li>Fix: Ungrouped cities now show \"Ungrouped\" heading instead of no heading<\/li>\n<li>Fix: Ungrouped section supports accordion expand\/collapse and city count badge<\/li>\n<\/ul>\n\n<h4>1.8.3<\/h4>\n\n<ul>\n<li>Fix: City List widget now shows ALL city pages, not just ones with saved data<\/li>\n<li>Fix: Exclude \"SEO City\" author pages from city lists (both widget and app)<\/li>\n<li>Fix: Rewrote city page discovery using $wpdb + WP_Query for reliability across all WP versions<\/li>\n<li>Fix: Connection Status now shows all city pages from WP database (not just API-saved ones)<\/li>\n<li>New: WordPress-side city page discovery \u2014 queries local WP database for complete page list<\/li>\n<\/ul>\n\n<h4>1.8.1<\/h4>\n\n<ul>\n<li>New: A1 City List Elementor widget \u2014 displays linked city page lists with optional group headings<\/li>\n<li>New: [a1tools_city_list] shortcode \u2014 renders grouped or flat city lists with permalinks<\/li>\n<li>New: City page grouping \u2014 assign cities to groups (e.g., counties) from the A1 Tools app<\/li>\n<li>Widget supports: single\/multi-column layout, group filtering, type filtering, state suffix<\/li>\n<li>Full Elementor styling: container, group heading, list items (Normal\/Hover), column gap<\/li>\n<li>Group headings support typography, colors, background, padding, border, and spacing controls<\/li>\n<\/ul>\n\n<h4>1.8.0<\/h4>\n\n<ul>\n<li>New: City Pages management \u2014 assign unique phone numbers and addresses to individual city pages<\/li>\n<li>New: [a1tools_city_phone] shortcode \u2014 auto-detects current page and outputs city-specific phone number<\/li>\n<li>New: [a1tools_city_phone link=\"yes\"] \u2014 outputs phone as a clickable tel: link<\/li>\n<li>New: [a1tools_city_address] shortcode \u2014 outputs city-specific address (supports format=\"inline\" and format=\"full\")<\/li>\n<li>New: City Pages section in Connection Status showing all configured cities with their data<\/li>\n<li>City shortcodes fall back to site primary phone and address when no city-specific data is assigned<\/li>\n<\/ul>\n\n<h4>1.7.8<\/h4>\n\n<ul>\n<li>Fix: Icons in A1 Contact Info and A1 Business Hours widgets now align to the top of their content<\/li>\n<li>Hours widget icon aligns to flex-start instead of center to prevent visual gaps<\/li>\n<li>Added more specific CSS selector to prevent theme overrides on icon vertical alignment<\/li>\n<\/ul>\n\n<h4>1.7.7<\/h4>\n\n<ul>\n<li>New: Parent Page selector on Import \u2014 assign all imported pages as children of a specific page<\/li>\n<li>Import now respects the selected parent page for both new inserts and existing page updates<\/li>\n<\/ul>\n\n<h4>1.7.6<\/h4>\n\n<ul>\n<li>New: Interactive store locator powered by Google Maps JavaScript API with custom markers<\/li>\n<li>New: Professional split-panel layout with scrollable store cards (with images) and interactive map<\/li>\n<li>New: Custom marker icon support (set via Plugin Settings or Elementor widget)<\/li>\n<li>New: Google Maps API Key setting in Plugin Settings page<\/li>\n<li>New: Store editor now includes Full Address auto-fill, Google Maps URL field, and auto lat\/lng extraction<\/li>\n<li>New: google_maps_url field added to group_stores database table<\/li>\n<li>Store cards now show images, phone, email, directions link, and website link<\/li>\n<li>Map pans and zooms when clicking store cards; info windows show on marker click<\/li>\n<li>Search filters both card list and map markers simultaneously<\/li>\n<li>Falls back to iframe embeds gracefully when no Google Maps API key is configured<\/li>\n<\/ul>\n\n<h4>1.7.5<\/h4>\n\n<ul>\n<li>Fix: Google Maps embeds now show place info instead of \"Place info couldn't load\"<\/li>\n<li>Maps now use business name + address for embed queries instead of raw coordinates<\/li>\n<li>Franchise and Store Locator maps both fixed for proper place resolution<\/li>\n<li>Maps can now display even without lat\/lng as long as address data is available<\/li>\n<\/ul>\n\n<h4>1.7.4<\/h4>\n\n<ul>\n<li>New: Show\/Hide Title toggle for franchise widget and shortcode (<code>show_title<\/code> attribute)<\/li>\n<li>New: Alignment controls for Address, Phone, and Directions Button sections<\/li>\n<li>All text elements in the franchise widget can now be independently aligned (left\/center\/right)<\/li>\n<\/ul>\n\n<h4>1.7.3<\/h4>\n\n<ul>\n<li>Enhanced: A1 Franchise Location widget \u2014 full styling controls: border, border hover, box shadow, hover shadow, typography groups, button normal\/hover tabs, spacing, alignment<\/li>\n<li>Enhanced: A1 Store Locator widget \u2014 full styling controls: border, border hover, box shadow, hover shadow, typography groups, link hover colors, card spacing, search\/filter styling<\/li>\n<li>Both widgets now match the styling depth of the Info Box and CTA widgets<\/li>\n<\/ul>\n\n<h4>1.7.2<\/h4>\n\n<ul>\n<li>Fix: Franchise locations not loading on frontend (fixed site_id column resolution in API)<\/li>\n<li>New: Franchise Locations table in admin Connection Status page<\/li>\n<li>New: Store Locator table in admin Connection Status page<\/li>\n<li>Franchise and Store shortcode references with copy buttons on settings page<\/li>\n<\/ul>\n\n<h4>1.7.1<\/h4>\n\n<ul>\n<li>Updated: [a1tools_franchise] shortcode now supports multiple franchise locations per site<\/li>\n<li>New: <code>columns<\/code> attribute (1-3) for grid layout of franchise cards<\/li>\n<li>New: <code>id<\/code> attribute to display a specific franchise by ID<\/li>\n<li>New: <code>show_address<\/code> attribute to toggle address display<\/li>\n<li>New: Dedicated site_franchises API for per-site franchise CRUD<\/li>\n<li>Updated: A1 Franchise Location Elementor widget with Columns and Franchise ID controls<\/li>\n<li>Updated: Franchise data now cached separately with its own transient<\/li>\n<li>Franchise locations include full address (line1, line2, city, state, zip, country)<\/li>\n<\/ul>\n\n<h4>1.7.0<\/h4>\n\n<ul>\n<li>New: Store Locator Elementor widget (A1 Store Locator) \u2014 displays searchable store locations with map embeds<\/li>\n<li>New: Franchise Location Elementor widget (A1 Franchise Location) \u2014 displays site-specific location card with name, phone, and map<\/li>\n<li>New: [a1tools_store_locator] shortcode with search, state filter, and Google Maps embeds<\/li>\n<li>New: [a1tools_franchise] shortcode with phone link and map embed<\/li>\n<li>New: Latitude and Longitude dynamic tags for Elementor<\/li>\n<li>New: Group stores data fetch with transient caching<\/li>\n<li>Added latitude\/longitude fields to site variables for map embeds<\/li>\n<\/ul>\n\n<h4>1.6.9<\/h4>\n\n<ul>\n<li>Added author selection dropdown to Import section \u2014 choose which author imported pages are assigned to<\/li>\n<\/ul>\n\n<h4>1.6.8<\/h4>\n\n<ul>\n<li>Fixed author filter AJAX \u2014 class now initializes on plugin load so AJAX endpoints are registered during admin-ajax.php requests<\/li>\n<\/ul>\n\n<h4>1.6.7<\/h4>\n\n<ul>\n<li>Fixed Import\/Export page list loading \u2014 pages now render instantly on page load (server-side)<\/li>\n<li>Added animated spinner for author filter changes<\/li>\n<li>Added progress bar with indeterminate animation for export and import operations<\/li>\n<li>Improved error handling and user feedback throughout<\/li>\n<\/ul>\n\n<h4>1.6.6<\/h4>\n\n<ul>\n<li>Added Import\/Export functionality for WordPress pages with full Elementor data preservation<\/li>\n<li>New submenu page: A1 Tools &gt; Import \/ Export<\/li>\n<li>Export pages as JSON or WordPress XML (WXR) format<\/li>\n<li>Import pages from JSON or WXR files with duplicate handling (Skip, Create New, Update Existing)<\/li>\n<li>Author-based filtering for page exports with Select All \/ Deselect All<\/li>\n<li>Preserves all Elementor builder data, page settings, and template types during import<\/li>\n<\/ul>\n\n<h4>1.6.4<\/h4>\n\n<ul>\n<li>Fixed icon padding inconsistency between Elementor editor and live frontend \u2014 added explicit margin, padding, and sizing resets to icon elements ( and ) inside info-box and hours widgets<\/li>\n<\/ul>\n\n<h4>1.6.3<\/h4>\n\n<ul>\n<li>Fixed icon disappearing when button animations are active \u2014 replaced <code>transition: all<\/code> with explicit property transitions to prevent conflict with animation transforms<\/li>\n<\/ul>\n\n<h4>1.6.2<\/h4>\n\n<ul>\n<li>A1 CTA widget now supports three actions: Call Phone, Send Email, or Custom URL<\/li>\n<li>Custom URL action includes full Elementor URL control (link, new tab, nofollow)<\/li>\n<li>Button displays the phone number, email, or URL by default \u2014 custom text overrides the display<\/li>\n<\/ul>\n\n<h4>1.6.1<\/h4>\n\n<ul>\n<li>Added Glow Color picker for the Glow animation on A1 CTA widget<\/li>\n<\/ul>\n\n<h4>1.6.0<\/h4>\n\n<ul>\n<li>Added 10 button animations to A1 CTA widget: Pulse, Heartbeat, Bounce, Shake, Glow, Wiggle, Flash, Swing, Rubber Band, Tada<\/li>\n<li>Animation speed control (Slow \/ Normal \/ Fast)<\/li>\n<li>\"Only on Hover\" option \u2014 animation plays continuously or only when hovered<\/li>\n<\/ul>\n\n<h4>1.5.9<\/h4>\n\n<ul>\n<li>Added A1 CTA Elementor widget \u2014 click-to-call button with icon, custom text option, and full styling<\/li>\n<li>Supports icon position (before\/after text), full-width mode, alignment, Normal\/Hover color tabs<\/li>\n<li>Button always links to the primary phone number; custom text replaces the display while keeping the call function<\/li>\n<\/ul>\n\n<h4>1.5.8<\/h4>\n\n<ul>\n<li>Added border hover color control to Box Style section for Phone, Email, Location, and Contact Info widgets<\/li>\n<li>Smooth border color transition on hover<\/li>\n<\/ul>\n\n<h4>1.5.7<\/h4>\n\n<ul>\n<li>Added vertical alignment control (Top \/ Middle \/ Bottom) for info-box widgets (Phone, Email, Location, Contact Info)<\/li>\n<li>Allows centering text content relative to the icon<\/li>\n<\/ul>\n\n<h4>1.5.6<\/h4>\n\n<ul>\n<li>Added icon border controls (type, color, width) to Phone, Email, Location, Business Hours, and Contact Info widgets<\/li>\n<li>Added background color, padding, border radius controls to Business Hours and Contact Info icon sections (parity with info-box widgets)<\/li>\n<li>Changed icon padding to dimensions control (top\/right\/bottom\/left) for all icon widgets<\/li>\n<\/ul>\n\n<h4>1.5.4<\/h4>\n\n<ul>\n<li>Added link wrapper to info-box widgets \u2014 entire box (icon + title + value) is now clickable<\/li>\n<li>Added underline control (None \/ Always \/ On Hover) for linked info-box widgets<\/li>\n<li>Added hover color controls for icon, title, and value on linked info-box widgets<\/li>\n<li>Applied link wrapper and hover controls to combined A1 Contact Info widget<\/li>\n<li>Smooth color transitions on hover for all linked elements<\/li>\n<\/ul>\n\n<h4>1.5.3<\/h4>\n\n<ul>\n<li>Added A1 Phone Elementor widget with icon picker, click-to-call link, and full styling<\/li>\n<li>Added A1 Email Elementor widget with icon picker, mailto link, and full styling<\/li>\n<li>Added A1 Location Elementor widget with icon picker, Google Maps link, and full styling<\/li>\n<li>Added A1 Contact Info Elementor widget (combined Phone + Email + Location + Hours)<\/li>\n<li>All info-box widgets support icon background, border radius, typography, and box styling<\/li>\n<\/ul>\n\n<h4>1.5.2<\/h4>\n\n<ul>\n<li>Added A1 Business Hours Elementor widget with full styling controls<\/li>\n<li>Supports list, table, and inline layouts<\/li>\n<li>Customizable icon, colors, typography, dividers, box styling, and alignment<\/li>\n<li>Option to hide closed days and customize closed text<\/li>\n<\/ul>\n\n<h4>1.5.1<\/h4>\n\n<ul>\n<li>Deferred form submission API call to PHP shutdown to avoid interfering with Elementor form actions (MailChimp, email, etc.)<\/li>\n<li>Form forwarding now only active when enabled in settings (prevents unintended interference)<\/li>\n<li>Changed form hook priority to 99 so other actions run first<\/li>\n<\/ul>\n\n<h4>1.5.0<\/h4>\n\n<ul>\n<li>Added [a1tools_website_url] shortcode to display the site URL<\/li>\n<li>Added form submission integration settings for Sunday board<\/li>\n<li>Supports link=\"true\" for clickable links and text=\"\" for custom link text<\/li>\n<\/ul>\n\n<h4>1.4.13<\/h4>\n\n<ul>\n<li>Fixed shortcodes not resolving inside link href attributes (e.g., tel:[a1tools_var key=\"phone_primary\"])<\/li>\n<li>Added content filter to process A1 Tools shortcodes in href values before rendering<\/li>\n<\/ul>\n\n<h4>1.4.12<\/h4>\n\n<ul>\n<li>Added standalone Full Address field (full_address) for [a1tools_full_address] shortcode<\/li>\n<li>[a1tools_full_address] now uses stored value if set, falls back to assembled parts<\/li>\n<li>Fixed Connection Status table showing \"(not set)\" for Full Address (single line)<\/li>\n<\/ul>\n\n<h4>1.4.11<\/h4>\n\n<ul>\n<li>Fixed X (Twitter) icon not displaying (fa-x-twitter is Font Awesome 6 only)<\/li>\n<li>Added inline SVG support for icons not available in Font Awesome 5<\/li>\n<li>X icon now renders as proper SVG that scales with icon size settings<\/li>\n<\/ul>\n\n<h4>1.4.10<\/h4>\n\n<ul>\n<li>Fixed icons being pushed upwards in header containers<\/li>\n<li>Changed container from font-size:0 hack to proper flexbox layout<\/li>\n<li>Spacing now uses CSS gap instead of margin (eliminates unwanted bottom margin)<\/li>\n<li>Alignment now uses justify-content for proper flex positioning<\/li>\n<\/ul>\n\n<h4>1.4.9<\/h4>\n\n<ul>\n<li>Fixed icons being pushed upwards in their container<\/li>\n<li>Moved base CSS to properly enqueued stylesheet (loads once, works in editor and frontend)<\/li>\n<li>Removed inline style block from widget render for cleaner output<\/li>\n<li>Added style-class approach for non-custom style presets<\/li>\n<\/ul>\n\n<h4>1.4.8<\/h4>\n\n<ul>\n<li>Rewrote Elementor widget to use Elementor's selectors system for all color controls<\/li>\n<li>Fixed Elementor global colors not applying (colors were empty when using global color picker)<\/li>\n<li>Fixed alignment control not working in editor or frontend<\/li>\n<li>Fixed icons shifting position when widget is not selected in editor<\/li>\n<li>Hover effects now use CSS class-based approach (prefix_class) for reliability in both editor and frontend<\/li>\n<li>Size, spacing, shape, and icon size controls now use Elementor selectors for instant preview updates<\/li>\n<\/ul>\n\n<h4>1.4.7<\/h4>\n\n<ul>\n<li>Fixed hover effects (scale, lift, rotate, pulse) not showing in Elementor editor preview<\/li>\n<li>Fixed custom hover colors not applying in Elementor editor preview<\/li>\n<li>Editor preview now matches frontend hover behavior<\/li>\n<\/ul>\n\n<h4>1.4.6<\/h4>\n\n<ul>\n<li>Fixed icon color not applying on frontend (was same color as background)<\/li>\n<li>Fixed Elementor global colors not working with Custom Colors style<\/li>\n<li>Fixed icons being pushed upwards on live site<\/li>\n<li>Improved CSS specificity to ensure custom styles override theme styles<\/li>\n<\/ul>\n\n<h4>1.4.5<\/h4>\n\n<ul>\n<li>Rewrote Elementor Social Icons widget to render CSS directly for proper styling<\/li>\n<li>Editor preview now shows actual configured social platforms instead of hardcoded samples<\/li>\n<li>Added \"Available platforms\" info panel in Elementor widget settings<\/li>\n<li>Fixed CSS not applying on frontend when using Elementor widget<\/li>\n<\/ul>\n\n<h4>1.4.4<\/h4>\n\n<ul>\n<li>Fixed Elementor Social Icons widget not displaying on frontend<\/li>\n<li>Ensured CSS styles are properly registered and enqueued when shortcode runs<\/li>\n<\/ul>\n\n<h4>1.4.3<\/h4>\n\n<ul>\n<li>Added HomeAdvisor social platform support<\/li>\n<\/ul>\n\n<h4>1.4.2<\/h4>\n\n<ul>\n<li>Stability improvements<\/li>\n<\/ul>\n\n<h4>1.4.1<\/h4>\n\n<ul>\n<li>Maintenance release for WordPress.org auto-updates compatibility<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>Added Update URI header for WordPress auto-updates support<\/li>\n<\/ul>\n\n<h4>1.3.2<\/h4>\n\n<ul>\n<li>Fixed inline style output to use wp_add_inline_style() for WordPress.org compliance<\/li>\n<li>Added Google Maps Embed API to External Services documentation<\/li>\n<li>Widget styles now properly enqueued through WordPress enqueue system<\/li>\n<\/ul>\n\n<h4>1.3.1<\/h4>\n\n<ul>\n<li>Fixed output escaping issues in Social Icons Widget for WordPress.org compliance<\/li>\n<li>Removed external CDN dependency for Font Awesome (now requires theme or plugin to provide)<\/li>\n<li>Added PHPCS ignore comments for legitimate unescaped outputs<\/li>\n<li>Fixed non-prefixed hook warning for Yoast SEO integration<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>Updated all function, class, and constant prefixes to use <code>a1tools_<\/code> (4+ characters) for WordPress.org compliance<\/li>\n<li>Added External Services documentation for third-party API usage disclosure<\/li>\n<li>Updated all shortcode names to use <code>a1tools_<\/code> prefix (e.g., <code>[a1tools_var]<\/code>, <code>[a1tools_address]<\/code>)<\/li>\n<li>Fixed uninstall.php to properly clean up all plugin options and transients<\/li>\n<li>Added missing variables to Elementor dynamic tags<\/li>\n<li>Improved Font Awesome loading to prevent duplicate enqueuing<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Added Social Icons Widget with full styling customization<\/li>\n<li>Widget options: Style (Official Colors, Outline, Minimal, Light, Dark)<\/li>\n<li>Widget options: Shape (Rounded, Circle, Square)<\/li>\n<li>Widget options: Size, Icon Size, Spacing, Alignment<\/li>\n<li>Widget options: Hover Effects (Scale, Lift, Rotate, Pulse)<\/li>\n<li>Widget options: Custom Color override<\/li>\n<li>Enhanced social links shortcode with styling parameters<\/li>\n<li>Automatic Font Awesome 6 loading for social icons<\/li>\n<li>Added full address shortcode for single-line address display<\/li>\n<li>Added A1 Social Icons Elementor widget<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Added 6 new social media platforms: Pinterest, BBB, Nextdoor, Houzz, Angi, Thumbtack<\/li>\n<li>Settings page now shows all available fields with their shortcodes<\/li>\n<li>Updated social links shortcode to include all platforms<\/li>\n<\/ul>\n\n<h4>1.0.9<\/h4>\n\n<ul>\n<li>Added admin settings page under A1 Tools menu<\/li>\n<li>Configurable cache duration (No caching, 1 min, 5 min, 10 min, 30 min, 1 hour, 24 hours)<\/li>\n<li>Manual \"Clear Cache Now\" button for instant updates<\/li>\n<li>Connection status display showing current values from A1 Tools<\/li>\n<li>Changed default cache from 1 hour to 5 minutes<\/li>\n<\/ul>\n\n<h4>1.0.8<\/h4>\n\n<ul>\n<li>Added new geo-targeting fields: City Name and State<\/li>\n<li>Added Google Maps URL field for location linking\/embedding<\/li>\n<li>New shortcodes: city name, state, google map<\/li>\n<li>Google Maps shortcode supports both link and embed modes<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<li>Site variables shortcodes<\/li>\n<li>Elementor dynamic tags integration<\/li>\n<li>REST API endpoints for variable retrieval<\/li>\n<li>Caching for performance<\/li>\n<li>Yoast SEO meta field integration via REST API<\/li>\n<\/ul>","raw_excerpt":"Centrally manage contact information, social media links, and business details across your WordPress sites from the A1 Tools platform.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/es-gt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/278012","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/es-gt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/es-gt.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/es-gt.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=278012"}],"author":[{"embeddable":true,"href":"https:\/\/es-gt.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/a1tools"}],"wp:attachment":[{"href":"https:\/\/es-gt.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=278012"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/es-gt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=278012"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/es-gt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=278012"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/es-gt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=278012"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/es-gt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=278012"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/es-gt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=278012"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}