plugin_name = $plugin_name; $this->version = $version; } public function enqueue_styles($hook) { if ('settings_page_accelvia-connect' !== $hook) { return; } wp_enqueue_style($this->plugin_name, plugin_dir_url(dirname(__FILE__)) . 'admin/css/accelvia-connect-admin.css', array(), $this->version, 'all'); } public function enqueue_scripts($hook) { if ('settings_page_accelvia-connect' !== $hook) { return; } wp_enqueue_media(); wp_enqueue_script($this->plugin_name, plugin_dir_url(dirname(__FILE__)) . 'admin/js/accelvia-connect-admin.js', array('jquery', 'jquery-ui-sortable'), $this->version, false); wp_localize_script( $this->plugin_name, 'accelviaAdminData', array( 'confirmRemove' => __('Are you sure you want to remove this button?', 'accelvia-connect-floating-cta'), 'selectIcon' => __('Select Custom Icon', 'accelvia-connect-floating-cta'), 'useIcon' => __('Use this icon', 'accelvia-connect-floating-cta'), 'scrollPercent' => __('Scroll Percentage (%)', 'accelvia-connect-floating-cta'), 'delaySeconds' => __('Delay in seconds', 'accelvia-connect-floating-cta'), ) ); } public function add_plugin_admin_menu() { add_options_page( __('Accelvia Connect - Floating CTA', 'accelvia-connect-floating-cta'), __('Accelvia Connect - Floating CTA', 'accelvia-connect-floating-cta'), 'manage_options', $this->plugin_name, array($this, 'display_plugin_setup_page') ); } public function register_settings() { register_setting( 'accelvia_connect_option_group', $this->option_name, array( 'type' => 'array', 'sanitize_callback' => array($this, 'sanitize_buttons_data') ) ); } /** * Sanitize the plugin settings array */ public function sanitize_buttons_data($input) { $sanitized = array(); // Sanitize global settings if (isset($input['global'])) { $sanitized['global']['position'] = in_array($input['global']['position'], array('left', 'right')) ? $input['global']['position'] : 'right'; $sanitized['global']['animation'] = in_array($input['global']['animation'], array('none', 'bounce', 'pulse', 'shake', 'spin', 'fade')) ? $input['global']['animation'] : 'bounce'; $sanitized['global']['spacing'] = absint($input['global']['spacing']); $sanitized['global']['horizontal_offset'] = absint(isset($input['global']['horizontal_offset']) ? $input['global']['horizontal_offset'] : 20); $sanitized['global']['button_size'] = max(30, min(120, absint(isset($input['global']['button_size']) ? $input['global']['button_size'] : 60))); $sanitized['global']['vertical_position'] = in_array( isset($input['global']['vertical_position']) ? $input['global']['vertical_position'] : 'bottom', array('bottom', 'middle', 'top') ) ? $input['global']['vertical_position'] : 'bottom'; // Smart Visibility $sanitized['global']['visibility'] = in_array( isset($input['global']['visibility']) ? $input['global']['visibility'] : 'everywhere', array('everywhere', 'homepage', 'exclude_pages') ) ? $input['global']['visibility'] : 'everywhere'; $sanitized['global']['exclude_pages'] = sanitize_text_field(isset($input['global']['exclude_pages']) ? $input['global']['exclude_pages'] : ''); // Display Triggers $sanitized['global']['trigger_type'] = in_array( isset($input['global']['trigger_type']) ? $input['global']['trigger_type'] : 'immediate', array('immediate', 'delay', 'scroll') ) ? $input['global']['trigger_type'] : 'immediate'; $sanitized['global']['trigger_value'] = absint(isset($input['global']['trigger_value']) ? $input['global']['trigger_value'] : 0); // Analytics $sanitized['global']['analytics_ga4'] = isset($input['global']['analytics_ga4']) ? '1' : '0'; $sanitized['global']['analytics_meta'] = isset($input['global']['analytics_meta']) ? '1' : '0'; // Business Hours $sanitized['global']['business_hours_enabled'] = isset($input['global']['business_hours_enabled']) ? '1' : '0'; $sanitized['global']['business_hours_start'] = sanitize_text_field(isset($input['global']['business_hours_start']) ? $input['global']['business_hours_start'] : '09:00'); $sanitized['global']['business_hours_end'] = sanitize_text_field(isset($input['global']['business_hours_end']) ? $input['global']['business_hours_end'] : '17:00'); // Business hours days $valid_days = array('mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'); $selected_days = isset($input['global']['business_hours_days']) && is_array($input['global']['business_hours_days']) ? array_intersect($input['global']['business_hours_days'], $valid_days) : array(); $sanitized['global']['business_hours_days'] = array_values($selected_days); } // Sanitize buttons array if (isset($input['buttons']) && is_array($input['buttons'])) { foreach ($input['buttons'] as $index => $button) { $sanitized_button = array(); $sanitized_button['type'] = in_array($button['type'], array('whatsapp', 'call', 'email', 'link', 'telegram', 'discord')) ? $button['type'] : 'link'; // Type-aware sanitization switch ($sanitized_button['type']) { case 'link': case 'discord': $sanitized_button['link'] = esc_url_raw($button['link']); break; case 'email': $sanitized_button['link'] = sanitize_email($button['link']); break; case 'whatsapp': case 'call': case 'telegram': default: $sanitized_button['link'] = sanitize_text_field($button['link']); break; } $sanitized_button['color'] = sanitize_hex_color($button['color']); $sanitized_button['bg_opacity'] = isset($button['bg_opacity']) ? max(0, min(100, intval($button['bg_opacity']))) : 100; $sanitized_button['label'] = sanitize_text_field(isset($button['label']) ? $button['label'] : ''); $sanitized_button['whatsapp_message'] = sanitize_text_field(isset($button['whatsapp_message']) ? $button['whatsapp_message'] : ''); $sanitized_button['hide_mobile'] = isset($button['hide_mobile']) ? '1' : '0'; $sanitized_button['hide_desktop'] = isset($button['hide_desktop']) ? '1' : '0'; // Badge & Greeting $sanitized_button['badge_text'] = sanitize_text_field(isset($button['badge_text']) ? $button['badge_text'] : ''); $sanitized_button['greeting_text'] = sanitize_text_field(isset($button['greeting_text']) ? $button['greeting_text'] : ''); $sanitized_button['greeting_delay'] = absint(isset($button['greeting_delay']) ? $button['greeting_delay'] : 3); $sanitized_button['custom_class'] = sanitize_html_class(isset($button['custom_class']) ? $button['custom_class'] : ''); $sanitized_button['custom_icon'] = esc_url_raw(isset($button['custom_icon']) ? $button['custom_icon'] : ''); $sanitized_button['lottie_url'] = esc_url_raw(isset($button['lottie_url']) ? $button['lottie_url'] : ''); $sanitized_button['lottie_hide_bg'] = isset($button['lottie_hide_bg']) ? '1' : '0'; // Skip adding completely empty buttons if (!empty($sanitized_button['link']) || $sanitized_button['type'] !== 'link' || !empty($sanitized_button['label'])) { $sanitized['buttons'][] = $sanitized_button; } } } return $sanitized; } public function display_plugin_setup_page() { require_once plugin_dir_path(dirname(__FILE__)) . 'admin/views/settings-page.php'; } }