id ) { return; } // Admin preview shows site-global values — opt out of the page-context overlay. $variables = a1tools_get_site_variables( false, false ); if ( null === $variables ) { ?>

'integer', 'default' => A1TOOLS_DEFAULT_CACHE_EXPIRY, 'sanitize_callback' => 'absint', ) ); // Form submission integration settings. register_setting( 'a1tools_settings', 'a1tools_form_enabled', array( 'type' => 'boolean', 'default' => false, 'sanitize_callback' => 'rest_sanitize_boolean', ) ); register_setting( 'a1tools_settings', 'a1tools_form_secret', array( 'type' => 'string', 'default' => '', 'sanitize_callback' => 'sanitize_text_field', ) ); register_setting( 'a1tools_settings', 'a1tools_form_crm_company_id', array( 'type' => 'integer', 'default' => 0, 'sanitize_callback' => 'absint', ) ); register_setting( 'a1tools_settings', 'a1tools_form_crm_franchise_id', array( 'type' => 'integer', 'default' => 0, 'sanitize_callback' => 'absint', ) ); // Google Maps JavaScript API key for interactive store locator. register_setting( 'a1tools_settings', 'a1tools_google_maps_api_key', array( 'type' => 'string', 'default' => '', 'sanitize_callback' => 'sanitize_text_field', ) ); // Custom marker icon URL for the store locator map. register_setting( 'a1tools_settings', 'a1tools_marker_icon_url', array( 'type' => 'string', 'default' => '', 'sanitize_callback' => 'esc_url_raw', ) ); // 2.6.0 — Review Funnel floating launcher. register_setting( 'a1tools_settings', 'a1tools_review_float_enabled', array( 'type' => 'boolean', 'default' => false, 'sanitize_callback' => 'rest_sanitize_boolean', ) ); register_setting( 'a1tools_settings', 'a1tools_review_float_position', array( 'type' => 'string', 'default' => 'br', 'sanitize_callback' => static function ( $v ) { return 'bl' === $v ? 'bl' : 'br'; }, ) ); register_setting( 'a1tools_settings', 'a1tools_review_float_button_label', array( 'type' => 'string', 'default' => 'Rate us', 'sanitize_callback' => 'sanitize_text_field', ) ); register_setting( 'a1tools_settings', 'a1tools_review_float_title', array( 'type' => 'string', 'default' => 'How was your experience?', 'sanitize_callback' => 'sanitize_text_field', ) ); register_setting( 'a1tools_settings', 'a1tools_review_float_subtitle', array( 'type' => 'string', 'default' => 'Tap a star to rate us.', 'sanitize_callback' => 'sanitize_text_field', ) ); register_setting( 'a1tools_settings', 'a1tools_review_float_threshold', array( 'type' => 'string', 'default' => '4', 'sanitize_callback' => static function ( $v ) { return '5' === (string) $v ? '5' : '4'; }, ) ); } add_action( 'admin_init', 'a1tools_register_settings' ); /** * Enqueue admin styles and scripts. * * @since 1.3.2 * @param string $hook The current admin page. * @return void */ function a1tools_admin_enqueue_scripts( $hook ) { // Only load on our settings page. if ( 'toplevel_page_a1-tools' !== $hook ) { return; } // Register and enqueue admin styles. wp_register_style( 'a1tools-admin', false, array(), A1TOOLS_VERSION ); wp_enqueue_style( 'a1tools-admin' ); $admin_css = ' .a1tools-shortcode-cell { display: flex; align-items: center; gap: 8px; } .a1tools-shortcode-cell code { font-size: 11px; flex: 1; } .a1tools-copy-btn { background: none; border: 1px solid #ddd; border-radius: 4px; padding: 4px 8px; cursor: pointer; display: inline-flex; align-items: center; gap: 4px; font-size: 12px; color: #666; transition: all 0.2s ease; } .a1tools-copy-btn:hover { background: #f0f0f0; border-color: #999; color: #333; } .a1tools-copy-btn.copied { background: #46b450; border-color: #46b450; color: #fff; } .a1tools-copy-btn .dashicons { font-size: 14px; width: 14px; height: 14px; } '; wp_add_inline_style( 'a1tools-admin', $admin_css ); // Register and enqueue admin scripts. wp_register_script( 'a1tools-admin', false, array(), A1TOOLS_VERSION, true ); wp_enqueue_script( 'a1tools-admin' ); $test_conn_data = array( 'ajax_url' => admin_url( 'admin-ajax.php' ), 'nonce' => wp_create_nonce( 'a1tools_test_form_conn' ), ); wp_add_inline_script( 'a1tools-admin', 'window.a1toolsTestConn = ' . wp_json_encode( $test_conn_data ) . ';', 'before' ); $admin_js = ' function a1toolsGenerateSecret() { var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; var secret = ""; for (var i = 0; i < 48; i++) { secret += chars.charAt(Math.floor(Math.random() * chars.length)); } document.getElementById("a1tools_form_secret").value = secret; } document.addEventListener("DOMContentLoaded", function() { var btn = document.getElementById("a1tools-test-form-conn"); var result = document.getElementById("a1tools-test-form-result"); if (!btn || !result || !window.a1toolsTestConn) { return; } btn.addEventListener("click", function() { btn.disabled = true; result.innerHTML = "Testing..."; var body = new URLSearchParams(); body.append("action", "a1tools_test_form_connection"); body.append("_wpnonce", window.a1toolsTestConn.nonce); fetch(window.a1toolsTestConn.ajax_url, { method: "POST", credentials: "same-origin", headers: { "Content-Type": "application/x-www-form-urlencoded" }, body: body.toString() }).then(function(r) { return r.json(); }).then(function(data) { btn.disabled = false; if (!data || !data.success) { var msg = (data && data.data && data.data.message) ? data.data.message : "Unknown error"; result.innerHTML = "✗ " + msg + ""; return; } var checks = data.data.checks || {}; var lines = []; Object.keys(checks).forEach(function(k) { var c = checks[k]; var icon = c.ok ? "✓" : "✗"; lines.push(icon + " " + c.label); }); result.innerHTML = "
" + lines.join("
") + "
"; }).catch(function(err) { btn.disabled = false; result.innerHTML = "✗ Network error: " + err.message + ""; }); }); }); function a1toolsCopyShortcode(btn, shortcode) { navigator.clipboard.writeText(shortcode).then(function() { btn.classList.add("copied"); btn.innerHTML = \' Copied!\'; setTimeout(function() { btn.classList.remove("copied"); btn.innerHTML = \' Copy\'; }, 2000); }).catch(function(err) { var textarea = document.createElement("textarea"); textarea.value = shortcode; document.body.appendChild(textarea); textarea.select(); document.execCommand("copy"); document.body.removeChild(textarea); btn.classList.add("copied"); btn.innerHTML = \' Copied!\'; setTimeout(function() { btn.classList.remove("copied"); btn.innerHTML = \' Copy\'; }, 2000); }); } '; wp_add_inline_script( 'a1tools-admin', $admin_js ); } add_action( 'admin_enqueue_scripts', 'a1tools_admin_enqueue_scripts' ); /** * Render settings page. * * @since 1.0.9 * @return void */ function a1tools_settings_page() { // Handle cache clear action. if ( isset( $_POST['a1tools_clear_cache'] ) && check_admin_referer( 'a1tools_clear_cache_nonce' ) ) { a1tools_clear_cache(); echo '

' . esc_html__( 'Cache cleared successfully!', 'a1-tools' ) . '

'; } $cache_expiry = (int) get_option( 'a1tools_cache_expiry', A1TOOLS_DEFAULT_CACHE_EXPIRY ); $cached_data = get_transient( A1TOOLS_CACHE_KEY ); $is_cached = false !== $cached_data; ?>



Forms). No board/group settings are needed here.', 'a1-tools' ); ?>

Company & Franchises. Set to 0 to disable CRM lead creation.', 'a1-tools' ); ?>

Company & Franchises. Leave 0 for no franchise assignment.', 'a1-tools' ); ?>

✓ ✗ — ()



' . esc_html__( 'A1 Review Funnel', 'a1-tools' ) . '', '[a1tools_review_widget]' ); ?>
review_url' ); ?>


array( 'business_name' => array( 'label' => 'Business Name', 'shortcode' => '[a1tools_var key="business_name"]' ), 'city_name' => array( 'label' => 'City Name', 'shortcode' => '[a1tools_city_name]' ), 'city_url' => array( 'label' => 'City Link', 'shortcode' => '[a1tools_city_link]' ), 'location_name' => array( 'label' => 'State', 'shortcode' => '[a1tools_state]' ), 'state_url' => array( 'label' => 'State Link', 'shortcode' => '[a1tools_state_link]' ), 'tagline' => array( 'label' => 'Tagline', 'shortcode' => '[a1tools_var key="tagline"]' ), 'google_maps_url' => array( 'label' => 'Google Maps URL', 'shortcode' => '[a1tools_google_map]' ), ), 'Contact Information' => array( 'phone_primary' => array( 'label' => 'Primary Phone', 'shortcode' => '[a1tools_var key="phone_primary"]' ), 'phone_secondary' => array( 'label' => 'Secondary Phone', 'shortcode' => '[a1tools_var key="phone_secondary"]' ), 'email_primary' => array( 'label' => 'Primary Email', 'shortcode' => '[a1tools_var key="email_primary"]' ), 'email_secondary' => array( 'label' => 'Secondary Email', 'shortcode' => '[a1tools_var key="email_secondary"]' ), ), 'Address' => array( 'address_line1' => array( 'label' => 'Address Line 1', 'shortcode' => '[a1tools_var key="address_line1"]' ), 'address_line2' => array( 'label' => 'Address Line 2', 'shortcode' => '[a1tools_var key="address_line2"]' ), 'city' => array( 'label' => 'City', 'shortcode' => '[a1tools_var key="city"]' ), 'state' => array( 'label' => 'State', 'shortcode' => '[a1tools_var key="state"]' ), 'zip' => array( 'label' => 'ZIP Code', 'shortcode' => '[a1tools_var key="zip"]' ), 'country' => array( 'label' => 'Country', 'shortcode' => '[a1tools_var key="country"]' ), 'address_formatted' => array( 'label' => 'Full Address (multi-line)', 'shortcode' => '[a1tools_address]' ), 'full_address' => array( 'label' => 'Full Address (single line)', 'shortcode' => '[a1tools_full_address]' ), ), 'Social Media' => array( 'facebook_url' => array( 'label' => 'Facebook', 'shortcode' => '[a1tools_var key="facebook_url"]' ), 'instagram_url' => array( 'label' => 'Instagram', 'shortcode' => '[a1tools_var key="instagram_url"]' ), 'youtube_url' => array( 'label' => 'YouTube', 'shortcode' => '[a1tools_var key="youtube_url"]' ), 'twitter_url' => array( 'label' => 'Twitter/X', 'shortcode' => '[a1tools_var key="twitter_url"]' ), 'linkedin_url' => array( 'label' => 'LinkedIn', 'shortcode' => '[a1tools_var key="linkedin_url"]' ), 'tiktok_url' => array( 'label' => 'TikTok', 'shortcode' => '[a1tools_var key="tiktok_url"]' ), 'yelp_url' => array( 'label' => 'Yelp', 'shortcode' => '[a1tools_var key="yelp_url"]' ), 'google_business_url' => array( 'label' => 'Google Business', 'shortcode' => '[a1tools_var key="google_business_url"]' ), 'pinterest_url' => array( 'label' => 'Pinterest', 'shortcode' => '[a1tools_var key="pinterest_url"]' ), 'bbb_url' => array( 'label' => 'BBB', 'shortcode' => '[a1tools_var key="bbb_url"]' ), 'nextdoor_url' => array( 'label' => 'Nextdoor', 'shortcode' => '[a1tools_var key="nextdoor_url"]' ), 'houzz_url' => array( 'label' => 'Houzz', 'shortcode' => '[a1tools_var key="houzz_url"]' ), 'angi_url' => array( 'label' => 'Angi', 'shortcode' => '[a1tools_var key="angi_url"]' ), 'thumbtack_url' => array( 'label' => 'Thumbtack', 'shortcode' => '[a1tools_var key="thumbtack_url"]' ), 'homeadvisor_url' => array( 'label' => 'HomeAdvisor', 'shortcode' => '[a1tools_var key="homeadvisor_url"]' ), ), ); ?>

$fields ) : ?>

$info ) : ?>

'Monday', 'tue' => 'Tuesday', 'wed' => 'Wednesday', 'thu' => 'Thursday', 'fri' => 'Friday', 'sat' => 'Saturday', 'sun' => 'Sunday', ); foreach ( $days as $key => $label ) : $hours = isset( $variables['operating_hours'][ $key ] ) ? $variables['operating_hours'][ $key ] : ''; ?>

[a1tools_hours] [a1tools_hours format="list"]

'[a1tools_location_phone]', 'label' => 'Phone', 'field' => 'phone' ), array( 'shortcode' => '[a1tools_location_city]', 'label' => 'City', 'field' => 'city' ), array( 'shortcode' => '[a1tools_location_address]', 'label' => 'Full Address', 'field' => 'full_address' ), array( 'shortcode' => '[a1tools_location_state]', 'label' => 'State', 'field' => 'state' ), array( 'shortcode' => '[a1tools_location_web]', 'label' => 'Location Web URL', 'field' => 'location_web' ), array( 'shortcode' => '[a1tools_city_web]', 'label' => 'City Web URL', 'field' => 'city_web' ), array( 'shortcode' => '[a1tools_state_web]', 'label' => 'State Web URL', 'field' => 'state_web' ), array( 'shortcode' => '[a1tools_map_address]', 'label' => 'Map Address', 'field' => 'map_address' ), array( 'shortcode' => '[a1tools_viewpoint]', 'label' => 'Viewpoint Iframe', 'field' => 'viewpoint_iframe' ), ); // Show a sample location's data $sample_loc = reset( $seo_locations ); ?>
100 ) : ?>
1 ) : ?>
() $loc ) : ?>

✓ — ✓ —

[a1tools_franchise] [a1tools_franchise columns="2"] [a1tools_franchise id="X"]

Franchise tab.', 'a1-tools' ); ?>

✓ — ✓ —

[a1tools_store_locator]

Stores tab.', 'a1-tools' ); ?>

$wpd ) { if ( isset( $saved_city_data[ $wpid ] ) ) { $city_pages[ $wpid ] = array_merge( $wpd, $saved_city_data[ $wpid ] ); } else { $city_pages[ $wpid ] = $wpd; } } ?>

$cp ) : ?>

[a1tools_city_phone] [a1tools_city_phone link="yes"] [a1tools_city_address]

Cities tab.', 'a1-tools' ); ?>