{"id":303624,"date":"2026-04-30T07:24:38","date_gmt":"2026-04-30T07:24:38","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/contact-button-for-wa\/"},"modified":"2026-04-30T07:24:25","modified_gmt":"2026-04-30T07:24:25","slug":"sourcecodees-floating-contact-widget","status":"publish","type":"plugin","link":"https:\/\/mya.wordpress.org\/plugins\/sourcecodees-floating-contact-widget\/","author":20403002,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.0.5","stable_tag":"1.0.5","tested":"6.9.4","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"SourceCodeEs Floating Contact Widget","header_author":"sourcecodeplugins","header_description":"Add a configurable contact button\/widget to your website. Control position, display rules, schedule, style and more from a simple admin panel.","assets_banners_color":"08484e","last_updated":"2026-04-30 07:24:25","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/sourcecode.es","rating":0,"author_block_rating":0,"active_installs":0,"downloads":58,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.5":{"tag":"1.0.5","author":"sourcecodeplugins","date":"2026-04-30 07:24:25"}},"upgrade_notice":{"1.0.5":"<p>Hardening pass for WordPress.org review: programmatic CSS via wp_add_inline_style(), late escaping at every output point, and aligned asset filenames. No setting changes required.<\/p>","1.0.4":"<p>The Custom CSS field has been removed to comply with WordPress.org plugin guidelines. If you used it, copy your CSS into Appearance \u2192 Customize \u2192 Additional CSS before updating.<\/p>","1.0.3":"<p>Plugin renamed to SourceCodeEs Floating Contact Widget to meet WordPress.org naming guidelines. Settings are preserved.<\/p>","1.0.2":"<p>Removes the server-side click counter. GA event tracking continues to work normally.<\/p>","1.0.1":"<p>Fixes a scheduling bug where unchecked days could still display the button. Update recommended for all users using the working hours feature.<\/p>","1.0.0":"<p>Initial release. No upgrade steps required.<\/p>"},"ratings":[],"assets_icons":{"icon-256x256.png":{"filename":"icon-256x256.png","revision":3519335,"resolution":"256x256","location":"assets","locale":""}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3519335,"resolution":"1544x500","location":"assets","locale":""},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3519335,"resolution":"772x250","location":"assets","locale":""}},"assets_blueprints":{},"all_blocks":{"sourcecodees-floating-contact-widget\/button":{"name":"sourcecodees-floating-contact-widget\/button","title":"SourceCodeEs Floating Contact Widget"}},"tagged_versions":["1.0.5"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Admin settings page \u2013 General tab","2":"Admin settings page \u2013 Style tab with preview","3":"Admin settings page \u2013 Schedule (working hours)","4":"Floating button on the frontend (green, bottom right)","5":"Chat box popup variant","6":"Gutenberg block in the editor with inspector controls","7":"Per-post meta box"},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[14160,60390,2734,30237,3160],"plugin_category":[],"plugin_contributors":[236037],"plugin_business_model":[],"class_list":["post-303624","plugin","type-plugin","status-publish","hentry","plugin_tags-chat-widget","plugin_tags-click-to-chat","plugin_tags-contact-button","plugin_tags-floating-button","plugin_tags-whatsapp","plugin_contributors-sourcecodeplugins","plugin_committers-sourcecodeplugins"],"banners":{"banner":"https:\/\/ps.w.org\/sourcecodees-floating-contact-widget\/assets\/banner-772x250.png?rev=3519335","banner_2x":"https:\/\/ps.w.org\/sourcecodees-floating-contact-widget\/assets\/banner-1544x500.png?rev=3519335","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/sourcecodees-floating-contact-widget\/assets\/icon-256x256.png?rev=3519335","icon_2x":"https:\/\/ps.w.org\/sourcecodees-floating-contact-widget\/assets\/icon-256x256.png?rev=3519335","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p><strong>SourceCodeEs Floating Contact Widget<\/strong> lets you add a professional floating contact button to your WordPress site in minutes. Configure everything from the admin panel \u2014 no coding required.<\/p>\n\n<h4>Core features<\/h4>\n\n<p><strong>General<\/strong>\n* Enable \/ disable with a single toggle\n* International phone number with full sanitisation\n* Custom pre-filled message\n* Open chat in same tab or new tab<\/p>\n\n<p><strong>Display rules<\/strong>\n* Show on the entire site, homepage only, posts, pages, selected post types, or specific IDs\n* Hide on specific pages \/ posts\n* Device visibility: desktop only, mobile only, or both\n* Per-post \/ per-page custom message and hide override via meta box<\/p>\n\n<p><strong>Trigger timing<\/strong>\n* Show immediately\n* Show after N seconds\n* Show after the visitor scrolls a configurable percentage of the page\n* Exit-intent trigger (desktop)<\/p>\n\n<p><strong>Working hours \/ schedule<\/strong>\n* Optionally restrict visibility to configured days and time windows\n* Independent timezone setting (defaults to your WordPress site timezone)<\/p>\n\n<p><strong>Style &amp; customisation<\/strong>\n* Floating button or floating button + chat-box popup\n* Icon only or icon + label text\n* Four colour presets (green, dark green, teal, blue) + custom hex colour picker\n* Button size 30\u2013120 px\n* Circle or square \/ rounded-corner shape\n* Custom tooltip text<\/p>\n\n<p><strong>Content placement<\/strong>\n* Shortcode: <code>[scefcw_button]<\/code> with optional attribute overrides\n* Gutenberg block with inspector panel for per-placement overrides\n* Supports both block themes and classic themes<\/p>\n\n<p><strong>Analytics &amp; advanced<\/strong>\n* Optional GA4 \/ Universal Analytics event on every click\n* Configurable GA event name\n* Optional GA4 \/ GTM \/ Universal Analytics event on every click\n* Hide button for the current browser session after the visitor clicks\n* Import \/ Export settings as JSON\n* Reset to defaults button\n* Full uninstall cleanup via uninstall.php<\/p>\n\n<h4>Shortcode usage<\/h4>\n\n<p>Place <code>[scefcw_button]<\/code> anywhere in a post or page. Optional attribute overrides:<\/p>\n\n<pre><code>[scefcw_button phone=\"447911123456\" message=\"Hello, I have a question\" label=\"Chat now\" tooltip=\"Open chat\"]\n<\/code><\/pre>\n\n<h4>Gutenberg block<\/h4>\n\n<p>Search for <strong>SourceCodeEs Floating Contact Widget<\/strong> in the block inserter. Use the inspector panel to override phone, message, label and tooltip on a per-block basis.<\/p>\n\n<h4>Per-page overrides<\/h4>\n\n<p>Each post and page has a <strong>SourceCodeEs Floating Contact Widget<\/strong> meta box in the editor sidebar where you can:\n* Override the pre-filled message for that specific page\n* Force-hide the button on that page regardless of global settings<\/p>\n\n<h4>Compatibility<\/h4>\n\n<ul>\n<li>Works with any WordPress theme<\/li>\n<li>No jQuery dependency on the frontend<\/li>\n<li>Compatible with popular caching plugins (Varnish, WP Rocket, W3 Total Cache, LiteSpeed Cache)<\/li>\n<li>Tested with WordPress Multisite<\/li>\n<li>WPML \/ Polylang ready (all strings use translation functions)<\/li>\n<\/ul>\n\n<h4>Privacy<\/h4>\n\n<p>This plugin does not collect, transmit, or store any visitor data. The optional GA event tracking uses your own GA property and is subject to your site's own privacy policy.<\/p>\n\n<!--section=installation-->\n<p><strong>From the WordPress plugin directory (recommended)<\/strong><\/p>\n\n<ol>\n<li>Go to <strong>Plugins \u2192 Add New<\/strong> in your WordPress admin.<\/li>\n<li>Search for <strong>SourceCodeEs Floating Contact Widget<\/strong>.<\/li>\n<li>Click <strong>Install Now<\/strong>, then <strong>Activate<\/strong>.<\/li>\n<li>Go to <strong>Settings \u2192 SourceCodeEs Floating Contact Widget<\/strong> and enter your phone number.<\/li>\n<\/ol>\n\n<p><strong>Manual installation<\/strong><\/p>\n\n<ol>\n<li>Download the plugin zip file.<\/li>\n<li>Go to <strong>Plugins \u2192 Add New \u2192 Upload Plugin<\/strong>.<\/li>\n<li>Upload the zip, install and activate.<\/li>\n<li>Go to <strong>Settings \u2192 SourceCodeEs Floating Contact Widget<\/strong>.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"what%20format%20should%20i%20use%20for%20the%20phone%20number%3F\"><h3>What format should I use for the phone number?<\/h3><\/dt>\n<dd><p>Enter the full international number including country code, <strong>digits only<\/strong> \u2014 no spaces, dashes, brackets or leading <code>+<\/code>. For example, a UK number <code>+44 7911 123456<\/code> should be entered as <code>447911123456<\/code>.<\/p><\/dd>\n<dt id=\"why%20is%20the%20button%20not%20showing%20on%20my%20site%3F\"><h3>Why is the button not showing on my site?<\/h3><\/dt>\n<dd><p>Check these in order: (1) the plugin is enabled on the General tab; (2) a phone number has been entered; (3) the Display rules allow the current page; (4) if working hours are enabled, check that the current time falls within a configured window; (5) check that your caching plugin is not serving a stale page.<\/p><\/dd>\n<dt id=\"does%20the%20button%20work%20without%20javascript%3F\"><h3>Does the button work without JavaScript?<\/h3><\/dt>\n<dd><p>The floating button requires JavaScript to handle trigger timing and the chat-box popup. However, the HTML anchor is rendered in the page so it can be displayed with a simple CSS fallback if you add <code>.scefcw-wrapper { opacity:1; visibility:visible; }<\/code> to your custom CSS.<\/p>\n\n<p>Shortcode and block placements are always visible because they render inline with no trigger delay.<\/p><\/dd>\n<dt id=\"can%20i%20place%20more%20than%20one%20button%3F\"><h3>Can I place more than one button?<\/h3><\/dt>\n<dd><p>The floating button is a singleton. For multiple placements in content, use the shortcode or Gutenberg block as many times as you like \u2014 each can have its own message, label and phone number override.<\/p><\/dd>\n<dt id=\"does%20this%20plugin%20support%20multisite%3F\"><h3>Does this plugin support Multisite?<\/h3><\/dt>\n<dd><p>Yes. Settings are stored per-site. On uninstall, all site options are removed across the network.<\/p><\/dd>\n<dt id=\"can%20i%20translate%20this%20plugin%3F\"><h3>Can I translate this plugin?<\/h3><\/dt>\n<dd><p>Yes. All user-facing strings use WordPress i18n functions with the text domain <code>sourcecodees-floating-contact-widget<\/code>. A <code>.pot<\/code> file is included in the <code>languages\/<\/code> directory.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.5<\/h4>\n\n<ul>\n<li>Replaced inline button\/wrapper <code>style=\"...\"<\/code> attributes with <code>wp_add_inline_style()<\/code>, generated programmatically from sanitised settings only.<\/li>\n<li>Wrapped every dynamic output point in <code>wp_kses()<\/code> with a precise per-tag\/per-attribute allowlist so the inline SVG icon and rendered button HTML are escaped at output.<\/li>\n<li>JSON settings export now uses <code>wp_send_json()<\/code> (the WPCS-whitelisted output sink) instead of a manual <code>echo wp_json_encode()<\/code>.<\/li>\n<li>Settings page conditional rows hidden via a CSS class (<code>scefcw-hidden<\/code>) instead of inline <code>style=\"display:none;\"<\/code> snippets, with the toggle JS updated to <code>toggleClass()<\/code>.<\/li>\n<li>All admin asset filenames realigned to the <code>scefcw-<\/code> prefix so the registered handles resolve correctly (<code>assets\/css\/scefcw-public.css<\/code>, <code>assets\/js\/scefcw-public.js<\/code>, etc.).<\/li>\n<li>Removed all <code>phpcs:ignore WordPress.Security.EscapeOutput<\/code> comments. The two remaining ignores (<code>NonceVerification<\/code> for the read-only <code>?tab=<\/code> parameter and the <code>?settings-updated=true<\/code> flag, and <code>ValidatedSanitizedInput<\/code> for the JSON import payload that is parsed and then run through <code>SCEFCW_Settings::sanitize()<\/code>) are documented inline.<\/li>\n<\/ul>\n\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>Removed the Custom CSS field from settings, per WordPress.org plugin guidelines that disallow plugins from accepting arbitrary code (CSS\/JS\/PHP). Use the WordPress Customizer's \"Additional CSS\" panel to override widget styles instead.<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Renamed plugin to <strong>SourceCodeEs Floating Contact Widget<\/strong> (slug: <code>sourcecodees-floating-contact-widget<\/code>) to comply with WordPress.org plugin naming guidelines requiring the distinctive brand term at the beginning.<\/li>\n<li>Updated text domain, block name, settings page slug, and language file accordingly.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Removed server-side click counter (Statistics tab) \u2014 GA event tracking is unaffected.<\/li>\n<li>Fixed admin settings tabs not loading CSS\/JS due to stale page hook slug after plugin rename.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Fixed scheduling bug: unchecked days now correctly hide the button when working hours are enabled.<\/li>\n<li>Fixed timezone fallback: <code>timezone_name_from_abbr()<\/code> now uses <code>is_dst = -1<\/code> for reliable offset matching.<\/li>\n<li>Hardened <code>is_working_hours()<\/code>: missing or malformed start\/end times now default to hidden instead of visible.<\/li>\n<li>Added defensive array guards in <code>get_all()<\/code> to prevent empty <code>working_hours<\/code> from bypassing day checks.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Add a configurable contact button to your website. Control position, display rules, schedule, style and analytics tracking from a simple admin panel.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/mya.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/303624","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mya.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/mya.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/mya.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=303624"}],"author":[{"embeddable":true,"href":"https:\/\/mya.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/sourcecodeplugins"}],"wp:attachment":[{"href":"https:\/\/mya.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=303624"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/mya.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=303624"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/mya.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=303624"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/mya.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=303624"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/mya.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=303624"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/mya.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=303624"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}