%s', esc_url( admin_url( 'admin.php?page=solutiontech-customer-chat' ) ), esc_html__( 'Ajustes', 'solutiontech-customer-chat' ) ); array_unshift( $links, $settings_link ); return $links; } /** * Add menu item in WP-Admin. */ public function add_admin_menu() { add_menu_page( __( 'Solutiontech Customer Chat', 'solutiontech-customer-chat' ), __( 'Customer Chat', 'solutiontech-customer-chat' ), 'manage_options', 'solutiontech-customer-chat', array( $this, 'render_admin_page' ), 'dashicons-format-chat', 85 ); } /** * Register settings with WordPress Settings API. */ public function register_settings() { register_setting( 'st_wa_settings_group', 'st_wa_settings', array( 'type' => 'array', 'sanitize_callback' => array( $this, 'sanitize_settings' ), ) ); } /** * Sanitize and validate all incoming settings. * * @param array $input Raw user inputs. * @return array Sanitized inputs. */ public function sanitize_settings( $input ) { $output = array(); // General Tab. $output['enabled'] = ! empty( $input['enabled'] ) ? '1' : '0'; $output['phone_number'] = ! empty( $input['phone_number'] ) ? Solutiontech_WhatsApp_Helpers::clean_phone( $input['phone_number'] ) : ''; $output['agent_name'] = ! empty( $input['agent_name'] ) ? sanitize_text_field( $input['agent_name'] ) : ''; $output['agent_role'] = ! empty( $input['agent_role'] ) ? sanitize_text_field( $input['agent_role'] ) : ''; $output['default_message'] = ! empty( $input['default_message'] ) ? sanitize_textarea_field( $input['default_message'] ) : ''; $output['multi_agent'] = ! empty( $input['multi_agent'] ) ? '1' : '0'; // Multi-Agent list. $output['agents'] = array(); if ( ! empty( $input['agents'] ) && is_array( $input['agents'] ) ) { foreach ( $input['agents'] as $agent ) { if ( ! empty( $agent['phone'] ) ) { $output['agents'][] = array( 'name' => sanitize_text_field( $agent['name'] ?? '' ), 'role' => sanitize_text_field( $agent['role'] ?? '' ), 'phone' => Solutiontech_WhatsApp_Helpers::clean_phone( $agent['phone'] ?? '' ), 'avatar' => esc_url_raw( $agent['avatar'] ?? '' ), ); } } } // Popup settings. $output['popup_enabled'] = ! empty( $input['popup_enabled'] ) ? '1' : '0'; $output['popup_title'] = ! empty( $input['popup_title'] ) ? sanitize_text_field( $input['popup_title'] ) : ''; $output['popup_intro'] = ! empty( $input['popup_intro'] ) ? sanitize_textarea_field( $input['popup_intro'] ) : ''; $output['btn_cta_text'] = ! empty( $input['btn_cta_text'] ) ? sanitize_text_field( $input['btn_cta_text'] ) : ''; // Design settings. $allowed_positions = array( 'bottom-right', 'bottom-left' ); $output['position'] = in_array( $input['position'] ?? '', $allowed_positions, true ) ? $input['position'] : 'bottom-right'; $output['offset_x'] = isset( $input['offset_x'] ) ? absint( $input['offset_x'] ) : 20; $output['offset_y'] = isset( $input['offset_y'] ) ? absint( $input['offset_y'] ) : 20; $allowed_layouts = array( 'icon_only', 'button_text' ); $output['layout_type'] = in_array( $input['layout_type'] ?? '', $allowed_layouts, true ) ? $input['layout_type'] : 'button_text'; $output['btn_text'] = ! empty( $input['btn_text'] ) ? sanitize_text_field( $input['btn_text'] ) : ''; // Colors. $output['primary_color'] = sanitize_hex_color( $input['primary_color'] ?? '#25D366' ); $output['header_color'] = sanitize_hex_color( $input['header_color'] ?? '#075E54' ); // Animations. $allowed_animations = array( 'pulse', 'bounce', 'none' ); $output['animation'] = in_array( $input['animation'] ?? '', $allowed_animations, true ) ? $input['animation'] : 'pulse'; // Visibility. $allowed_visibilities = array( 'all', 'desktop', 'mobile' ); $output['device_visibility'] = in_array( $input['device_visibility'] ?? '', $allowed_visibilities, true ) ? $input['device_visibility'] : 'all'; $output['hide_on_pages'] = array(); if ( ! empty( $input['hide_on_pages'] ) && is_array( $input['hide_on_pages'] ) ) { foreach ( $input['hide_on_pages'] as $page_type ) { $output['hide_on_pages'][] = sanitize_key( $page_type ); } } // WooCommerce settings. $output['woo_enabled'] = ! empty( $input['woo_enabled'] ) ? '1' : '0'; $output['woo_btn_position'] = sanitize_text_field( $input['woo_btn_position'] ?? 'woocommerce_after_add_to_cart_button' ); $output['woo_btn_text'] = ! empty( $input['woo_btn_text'] ) ? sanitize_text_field( $input['woo_btn_text'] ) : ''; $output['woo_message'] = ! empty( $input['woo_message'] ) ? sanitize_textarea_field( $input['woo_message'] ) : ''; $output['woo_cart_enabled'] = ! empty( $input['woo_cart_enabled'] ) ? '1' : '0'; $output['woo_cart_btn_text'] = ! empty( $input['woo_cart_btn_text'] ) ? sanitize_text_field( $input['woo_cart_btn_text'] ) : ''; // Analytics. $output['track_ga4'] = ! empty( $input['track_ga4'] ) ? '1' : '0'; $output['track_pixel'] = ! empty( $input['track_pixel'] ) ? '1' : '0'; // Feature 1: Notification Badge. $output['badge_enabled'] = ! empty( $input['badge_enabled'] ) ? '1' : '0'; $output['badge_delay'] = isset( $input['badge_delay'] ) ? absint( $input['badge_delay'] ) : 3; // Feature 2: Smart Triggers. $output['auto_open_delay'] = isset( $input['auto_open_delay'] ) ? absint( $input['auto_open_delay'] ) : 0; $output['scroll_trigger'] = ! empty( $input['scroll_trigger'] ) ? '1' : '0'; $output['scroll_percent'] = isset( $input['scroll_percent'] ) ? min( 100, max( 10, absint( $input['scroll_percent'] ) ) ) : 50; $output['exit_intent'] = ! empty( $input['exit_intent'] ) ? '1' : '0'; // Feature 3: Business Hours. $output['business_hours_enabled'] = ! empty( $input['business_hours_enabled'] ) ? '1' : '0'; $output['business_days'] = array(); if ( ! empty( $input['business_days'] ) && is_array( $input['business_days'] ) ) { foreach ( $input['business_days'] as $day ) { $output['business_days'][] = sanitize_key( $day ); } } $output['business_start'] = ! empty( $input['business_start'] ) ? sanitize_text_field( $input['business_start'] ) : '09:00'; $output['business_end'] = ! empty( $input['business_end'] ) ? sanitize_text_field( $input['business_end'] ) : '18:00'; $allowed_offline = array( 'offline_notice', 'hide_widget' ); $output['offline_behavior'] = in_array( $input['offline_behavior'] ?? '', $allowed_offline, true ) ? $input['offline_behavior'] : 'offline_notice'; $output['offline_status_text'] = ! empty( $input['offline_status_text'] ) ? sanitize_text_field( $input['offline_status_text'] ) : ''; $output['offline_notice'] = ! empty( $input['offline_notice'] ) ? sanitize_textarea_field( $input['offline_notice'] ) : ''; // Feature 4: Desktop QR Code. $output['qr_enabled'] = ! empty( $input['qr_enabled'] ) ? '1' : '0'; // Feature 5: Privacy / GDPR. $output['gdpr_enabled'] = ! empty( $input['gdpr_enabled'] ) ? '1' : '0'; $output['gdpr_text'] = ! empty( $input['gdpr_text'] ) ? sanitize_textarea_field( $input['gdpr_text'] ) : ''; // Feature 6: Notification Sound. $output['sound_enabled'] = ! empty( $input['sound_enabled'] ) ? '1' : '0'; return $output; } /** * Enqueue admin CSS and JS. * * @param string $hook_suffix Current admin page hook. */ public function enqueue_admin_assets( $hook_suffix ) { if ( 'toplevel_page_solutiontech-customer-chat' !== $hook_suffix ) { return; } wp_enqueue_style( 'wp-color-picker' ); wp_enqueue_media(); wp_enqueue_style( 'st-wa-admin-css', ST_WA_URL . 'assets/css/st-admin.css', array( 'wp-color-picker' ), ST_WA_VERSION ); wp_enqueue_script( 'st-wa-admin-js', ST_WA_URL . 'assets/js/st-admin.js', array( 'jquery', 'wp-color-picker' ), ST_WA_VERSION, true ); wp_localize_script( 'st-wa-admin-js', 'stWaAdmin', array( 'strings' => array( 'confirmDelete' => __( '¿Estás seguro de que deseas eliminar este asesor?', 'solutiontech-customer-chat' ), 'chooseAvatar' => __( 'Seleccionar Avatar del Asesor', 'solutiontech-customer-chat' ), 'useImage' => __( 'Usar esta imagen', 'solutiontech-customer-chat' ), ), ) ); } /** * Render settings page. */ public function render_admin_page() { if ( ! current_user_can( 'manage_options' ) ) { wp_die( esc_html__( 'No tienes permisos suficientes para acceder a esta página.', 'solutiontech-customer-chat' ) ); } $settings = Solutiontech_WhatsApp_Helpers::get_settings(); ?>

v


'Equipo de Ventas', 'role' => 'Consultas y Cotizaciones', 'phone' => '', 'avatar' => '', ), ); } foreach ( $agents as $idx => $agent ) : ?>

    
X (Lateral): px      Y (Inferior): px
    
     


%


__( 'Lunes', 'solutiontech-customer-chat' ), 'tue' => __( 'Martes', 'solutiontech-customer-chat' ), 'wed' => __( 'Miércoles', 'solutiontech-customer-chat' ), 'thu' => __( 'Jueves', 'solutiontech-customer-chat' ), 'fri' => __( 'Viernes', 'solutiontech-customer-chat' ), 'sat' => __( 'Sábado', 'solutiontech-customer-chat' ), 'sun' => __( 'Domingo', 'solutiontech-customer-chat' ), ); $active_days = ! empty( $settings['business_days'] ) && is_array( $settings['business_days'] ) ? $settings['business_days'] : array(); foreach ( $days_labels as $day_key => $day_name ) : ?>
    



Política de Privacidad.', 'solutiontech-customer-chat' ); ?>

[solutiontech_whatsapp]

phone
text "Chatear por WhatsApp"
message
color #25D366
class

[solutiontech_whatsapp phone="56912345678" text="Cotizar Proyecto" message="Hola, me gustaría cotizar un servicio de desarrollo."]