get_charset_collate(); require_once ABSPATH . 'wp-admin/includes/upgrade.php'; // 1. Order Bumps dbDelta( "CREATE TABLE {$wpdb->prefix}arrayfunnel_order_bumps ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, title VARCHAR(255) NOT NULL DEFAULT '', product_id BIGINT UNSIGNED NOT NULL, condition_type VARCHAR(50) DEFAULT 'all', condition_value TEXT, display_settings LONGTEXT, template VARCHAR(50) DEFAULT 'classic', status TINYINT(1) DEFAULT 1, priority INT DEFAULT 0, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY status (status), KEY product_id (product_id), KEY priority (priority), KEY status_priority (status, priority) ) $charset;" ); // 2. Analytics dbDelta( "CREATE TABLE {$wpdb->prefix}arrayfunnel_analytics ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, event_type VARCHAR(50) NOT NULL, funnel_id BIGINT UNSIGNED DEFAULT NULL, order_id BIGINT UNSIGNED DEFAULT NULL, session_id VARCHAR(100), user_id BIGINT UNSIGNED DEFAULT NULL, revenue DECIMAL(10,2) DEFAULT 0.00, meta TEXT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY event_type (event_type), KEY created_at (created_at), KEY order_id (order_id), KEY event_created (event_type, created_at), KEY session_event_created (session_id, event_type, created_at) ) $charset;" ); // 3. Abandoned Carts dbDelta( "CREATE TABLE {$wpdb->prefix}arrayfunnel_abandoned_carts ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, user_id BIGINT UNSIGNED DEFAULT NULL, email VARCHAR(200), phone VARCHAR(30), cart_contents LONGTEXT, cart_total DECIMAL(10,2), currency VARCHAR(10) DEFAULT 'USD', status VARCHAR(20) DEFAULT 'active', recovery_token VARCHAR(100), emails_sent TINYINT DEFAULT 0, last_activity DATETIME, recovered_at DATETIME, PRIMARY KEY (id), KEY status (status), KEY email (email), KEY recovery_token (recovery_token), KEY last_activity (last_activity), KEY status_last_activity (status, last_activity), KEY status_recovered_at (status, recovered_at), KEY status_emails_last (status, emails_sent, last_activity), KEY email_status (email, status), KEY recovery_status (recovery_token, status) ) $charset;" ); } private static function setDefaultOptions(): void { $defaults = [ 'arrayfunnel_order_bumps_enabled' => 'yes', 'arrayfunnel_side_cart_enabled' => 'yes', 'arrayfunnel_side_cart_free_shipping' => '', 'arrayfunnel_side_cart_theme' => 'light', 'arrayfunnel_side_cart_radius' => 'balanced', 'arrayfunnel_side_cart_accent' => 'emerald', 'arrayfunnel_side_cart_open_mode' => 'always', 'arrayfunnel_checkout_optimized' => 'yes', 'arrayfunnel_checkout_countdown' => 'no', 'arrayfunnel_checkout_countdown_mins' => 15, 'arrayfunnel_checkout_trust_badges' => 'yes', 'arrayfunnel_abandon_threshold' => 30, 'arrayfunnel_abandon_email_1_delay' => 60, 'arrayfunnel_abandon_email_2_delay' => 1440, 'arrayfunnel_abandon_email_3_delay' => 4320, 'arrayfunnel_abandon_coupon_2' => '', 'arrayfunnel_abandon_coupon_3' => '', 'arrayfunnel_analytics_retention_days' => 0, ]; foreach ( $defaults as $key => $value ) { if ( false === get_option( $key ) ) { add_option( $key, $value ); } } } private static function scheduleCrons(): void { if ( ! wp_next_scheduled( 'arrayfunnel_check_abandoned_carts' ) ) { wp_schedule_event( time(), 'arrayfunnel_every_15_minutes', 'arrayfunnel_check_abandoned_carts' ); } if ( ! wp_next_scheduled( 'arrayfunnel_cleanup_analytics' ) ) { wp_schedule_event( time(), 'daily', 'arrayfunnel_cleanup_analytics' ); } if ( ! wp_next_scheduled( 'arrayfunnel_cleanup_abandoned_carts' ) ) { wp_schedule_event( time(), 'daily', 'arrayfunnel_cleanup_abandoned_carts' ); } } }