bwfan_abandonedcarts = $wpdb->prefix . 'bwfan_abandonedcarts'; $wpdb->bwfan_automations = $wpdb->prefix . 'bwfan_automations'; $wpdb->bwfan_automationmeta = $wpdb->prefix . 'bwfan_automationmeta'; $wpdb->bwfan_tasks = $wpdb->prefix . 'bwfan_tasks'; $wpdb->bwfan_taskmeta = $wpdb->prefix . 'bwfan_taskmeta'; $wpdb->bwfan_task_claim = $wpdb->prefix . 'bwfan_task_claim'; $wpdb->bwfan_logs = $wpdb->prefix . 'bwfan_logs'; $wpdb->bwfan_logmeta = $wpdb->prefix . 'bwfan_logmeta'; $wpdb->bwfan_message_unsubscribe = $wpdb->prefix . 'bwfan_message_unsubscribe'; $wpdb->bwfan_contact_automations = $wpdb->prefix . 'bwfan_contact_automations'; /** v2 */ $wpdb->bwfan_automation_contact = $wpdb->prefix . 'bwfan_automation_contact'; $wpdb->bwfan_automation_contact_claim = $wpdb->prefix . 'bwfan_automation_contact_claim'; $wpdb->bwfan_automation_contact_trail = $wpdb->prefix . 'bwfan_automation_contact_trail'; $wpdb->bwfan_automation_complete_contact = $wpdb->prefix . 'bwfan_automation_complete_contact'; $wpdb->bwfan_automation_step = $wpdb->prefix . 'bwfan_automation_step'; /** Engagement tables */ $wpdb->bwfan_conversions = $wpdb->prefix . 'bwfan_conversions'; $wpdb->bwfan_engagement_tracking = $wpdb->prefix . 'bwfan_engagement_tracking'; $wpdb->bwfan_engagement_trackingmeta = $wpdb->prefix . 'bwfan_engagement_trackingmeta'; add_action( 'plugins_loaded', [ $this, 'load_db_classes' ], 8 ); add_action( 'admin_init', [ $this, 'version_1_0_0' ], 10 ); add_action( 'admin_init', [ $this, 'db_update' ], 11 ); /** Save time when db version updated */ add_filter( 'pre_update_option_bwfan_db', [ $this, 'db_updated' ] ); } /** * Return the object of current class * * @return null|BWFAN_DB */ public static function get_instance() { if ( null === self::$ins ) { self::$ins = new self(); } return self::$ins; } /** * Include all the DB Table files */ public static function load_db_classes() { self::load_class_files( __DIR__ . '/db' ); } public static function load_class_files( $dir ) { foreach ( glob( $dir . '/class-*.php' ) as $_field_filename ) { $file_data = pathinfo( $_field_filename ); if ( isset( $file_data['basename'] ) && 'index.php' === $file_data['basename'] ) { continue; } require_once( $_field_filename ); } } /** * loading table related classes * * @return void */ public static function load_table_classes() { require_once( ABSPATH . 'wp-admin/includes/upgrade.php' ); $dir = __DIR__ . '/db/tables'; /** Load base class of verify tables */ include_once( $dir . "/bwfan-db-tables-base.php" ); self::load_class_files( $dir ); } /** * Version 1.0 update */ public function version_1_0_0() { if ( false !== get_option( 'bwfan_ver_1_0', false ) ) { return; } self::load_table_classes(); $table_instance = new BWFAN_DB_Table_Options(); $table_instance->create_table(); if ( ! empty( $table_instance->db_errors ) ) { $db_errors[] = $table_instance->db_errors; } $table_instance = new BWFAN_DB_Table_Automations(); $table_instance->create_table(); if ( ! empty( $table_instance->db_errors ) ) { $db_errors[] = $table_instance->db_errors; } $table_instance = new BWFAN_DB_Table_Automationmeta(); $table_instance->create_table(); if ( ! empty( $table_instance->db_errors ) ) { $db_errors[] = $table_instance->db_errors; } $table_instance = new BWFAN_DB_Table_Message_Unsubscribe(); $table_instance->create_table(); if ( ! empty( $table_instance->db_errors ) ) { $db_errors[] = $table_instance->db_errors; } $table_instance = new BWFAN_DB_Table_AbandonedCarts(); $table_instance->create_table(); if ( ! empty( $table_instance->db_errors ) ) { $db_errors[] = $table_instance->db_errors; } $table_instance = new BWFAN_DB_Table_Automation_Events(); $table_instance->create_table(); if ( ! empty( $table_instance->db_errors ) ) { $db_errors[] = $table_instance->db_errors; } $table_instance = new BWFAN_DB_Table_Links(); $table_instance->create_table(); if ( ! empty( $table_instance->db_errors ) ) { $db_errors[] = $table_instance->db_errors; } $table_instance = new BWFAN_DB_Table_Link_Metrics(); $table_instance->create_table(); if ( ! empty( $table_instance->db_errors ) ) { $db_errors[] = $table_instance->db_errors; } $this->tables_created = true; $this->method_run[] = '1.0.0'; do_action( 'bwfan_db_1_0_tables_created' ); update_option( 'bwfan_ver_1_0', date( 'Y-m-d' ), true ); update_option( 'bwfan_new_user', 'yes', true ); /** Unique key to share in rest calls */ $unique_key = wp_generate_password( 32, false ); update_option( 'bwfan_u_key', $unique_key, true ); /** Update v1 automation status */ update_option( 'bwfan_automation_v1', '0', true ); /** Scheduling actions one-time */ $this->schedule_actions(); /** Auto global settings */ if ( BWFAN_Plugin_Dependency::woocommerce_active_check() ) { $global_option = get_option( 'bwfan_global_settings', array() ); $global_option['bwfan_ab_enable'] = true; update_option( 'bwfan_global_settings', $global_option, true ); } /** Cache handling */ if ( class_exists( 'BWF_JSON_Cache' ) && method_exists( 'BWF_JSON_Cache', 'run_json_endpoints_cache_handling' ) ) { BWF_JSON_Cache::run_json_endpoints_cache_handling(); } /** Updated block editor default values */ update_option( 'bwf_global_block_editor_setting', BWFAN_Common::get_block_editor_default_setting() ); /** Set default settings for email notification */ BWFAN_Notification_Email::set_bwfan_settings(); /** Need to set default value of sent to today */ $executed_last = array( 'weekly' => date( 'c' ), 'monthly' => date( 'c' ), ); update_option( 'bwfan_email_notification_updated', $executed_last, false ); /** Adding a new unique key for file download */ update_option( 'bwfan_unique_secret', wp_generate_password( 32, false ), true ); /** Log if any mysql errors */ if ( ! empty( $db_errors ) ) { BWFAN_Common::log_test_data( array_merge( [ __FUNCTION__ ], $db_errors ), 'db-creation-errors' ); } } protected function schedule_actions() { $ins = BWFAN_Admin::get_instance(); $ins->maybe_set_as_ct_worker(); $ins->schedule_abandoned_cart_cron(); } /** * Create v1 automation related tables * * @return void */ public function db_create_v1_automation_tables() { self::load_table_classes(); $table_instance = new BWFAN_DB_Table_Tasks(); $table_instance->create_table(); if ( ! empty( $table_instance->db_errors ) ) { $db_errors[] = $table_instance->db_errors; } $table_instance = new BWFAN_DB_Table_Taskmeta(); $table_instance->create_table(); if ( ! empty( $table_instance->db_errors ) ) { $db_errors[] = $table_instance->db_errors; } $table_instance = new BWFAN_DB_Table_Task_Claim(); $table_instance->create_table(); if ( ! empty( $table_instance->db_errors ) ) { $db_errors[] = $table_instance->db_errors; } $table_instance = new BWFAN_DB_Table_Logs(); $table_instance->create_table(); if ( ! empty( $table_instance->db_errors ) ) { $db_errors[] = $table_instance->db_errors; } $table_instance = new BWFAN_DB_Table_Logmeta(); $table_instance->create_table(); if ( ! empty( $table_instance->db_errors ) ) { $db_errors[] = $table_instance->db_errors; } $table_instance = new BWFAN_DB_Table_Contact_Automations(); $table_instance->create_table(); if ( ! empty( $table_instance->db_errors ) ) { $db_errors[] = $table_instance->db_errors; } /** Update v1 automation status */ update_option( 'bwfan_automation_v1', '1', true ); /** Log if any mysql errors */ if ( ! empty( $db_errors ) ) { BWFAN_Common::log_test_data( array_merge( [ __FUNCTION__ ], $db_errors ), 'db-creation-errors' ); } } /** * Perform DB updates or once occurring updates */ public function db_update() { $db_changes = array( '2.0.10.1' => '2_0_10_1', '2.0.10.2' => '2_0_10_2', '2.0.10.3' => '2_0_10_3', '2.0.10.4' => '2_0_10_4', '2.0.10.5' => '2_0_10_5', '2.0.10.6' => '2_0_10_6', '2.0.10.7' => '2_0_10_7', '2.0.10.8' => '2_0_10_8', '2.4.2' => '2_4_2', '2.4.4' => '2_4_4', '2.6.1' => '2_6_1', '2.6.2' => '2_6_2', '2.6.3' => '2_6_3', '2.7.0' => '2_7_0', '2.8.0' => '2_8_0', '2.8.4' => '2_8_4', '3.0.0' => '3_0_0', '3.0.1' => '3_0_1', '3.0.1.1' => '3_0_1_1', '3.0.4' => '3_0_4', '3.0.5' => '3_0_5', '3.2.1' => '3_2_1', '3.2.2' => '3_2_2', '3.4.1' => '3_4_1', '3.4.2' => '3_4_2', '3.4.3' => '3_4_3', '3.4.4' => '3_4_4', '3.5.0' => '3_5_0', '3.5.1' => '3_5_1', '3.5.2' => '3_5_2', ); $db_version = get_option( 'bwfan_db', '2.0' ); foreach ( $db_changes as $version_key => $version_value ) { if ( version_compare( $db_version, $version_key, '<' ) ) { self::load_table_classes(); $function_name = 'db_update_' . $version_value; $this->$function_name( $version_key ); } } } /** * Save time when DB version updated * * @param $value * * @return mixed */ public function db_updated( $value ) { $versions = bwf_options_get( 'bwfan_db_updated', 'value', [] ); $versions[ $value ] = current_time( 'mysql', 1 ); bwf_options_update( 'bwfan_db_updated', $versions ); return $value; } /** * @param $version_key * * @return void */ public function db_update_2_0_10_1( $version_key ) { global $wpdb; $db_errors = []; if ( ! is_array( $this->method_run ) || ! in_array( '1.0.0', $this->method_run, true ) ) { $column_exists = $wpdb->query( "SHOW COLUMNS FROM {$wpdb->prefix}bwfan_automations LIKE 'start'" ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching if ( empty( $column_exists ) ) { /** Add new columns in bwfan_automations table */ $query = "ALTER TABLE {$wpdb->prefix}bwfan_automations ADD COLUMN `start` bigint(10) UNSIGNED NOT NULL, ADD COLUMN `v` tinyint(1) UNSIGNED NOT NULL default 1, ADD COLUMN `benchmark` varchar(150) NOT NULL, ADD COLUMN `title` varchar(255) NULL;"; $wpdb->query( $query ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching if ( ! empty( $wpdb->last_error ) ) { $db_errors[] = 'bwfan_automations alter table - ' . $wpdb->last_error; } } } $table_instance = new BWFAN_DB_Table_Automation_Step(); $table_instance->create_table(); if ( ! empty( $table_instance->db_errors ) ) { $db_errors[] = $table_instance->db_errors; } $table_instance = new BWFAN_DB_Table_Automation_Contact(); $table_instance->create_table(); if ( ! empty( $table_instance->db_errors ) ) { $db_errors[] = $table_instance->db_errors; } $table_instance = new BWFAN_DB_Table_Automation_Complete_Contact(); $table_instance->create_table(); if ( ! empty( $table_instance->db_errors ) ) { $db_errors[] = $table_instance->db_errors; } $table_instance = new BWFAN_DB_Table_Automation_Contact_Claim(); $table_instance->create_table(); if ( ! empty( $table_instance->db_errors ) ) { $db_errors[] = $table_instance->db_errors; } $table_instance = new BWFAN_DB_Table_Automation_Contact_Trail(); $table_instance->create_table(); if ( ! empty( $table_instance->db_errors ) ) { $db_errors[] = $table_instance->db_errors; } /** Create v2 tables */ $this->v2_tables(); /** Check for old drag & drop email builder */ $this->check_for_old_visual_builder(); $this->method_run[] = $version_key; /** Updating version key */ update_option( 'bwfan_db', $version_key, true ); $db_update = new BWFAN_DB_Update(); $db_changes = array_keys( $db_update->db_changes ); $last_version = end( $db_changes ); update_option( 'bwfan_db_update', [ $last_version => 0 ], true ); /** Log if any mysql errors */ if ( ! empty( $db_errors ) ) { BWFAN_Common::log_test_data( array_merge( [ __FUNCTION__ ], $db_errors ), 'db-creation-errors' ); } } /** * Create v2 tables * * @return void */ public function v2_tables() { $table_instance = new BWFAN_DB_Table_Contact_Fields(); if ( ! $table_instance->is_exists() ) { $table_instance->create_table(); if ( ! empty( $table_instance->db_errors ) ) { $db_errors[] = $table_instance->db_errors; } } $table_instance = new BWFAN_DB_Table_Contact_Note(); if ( ! $table_instance->is_exists() ) { $table_instance->create_table(); if ( ! empty( $table_instance->db_errors ) ) { $db_errors[] = $table_instance->db_errors; } } $table_instance = new BWFAN_DB_Table_Fields(); if ( ! $table_instance->is_exists() ) { $table_instance->create_table(); if ( ! empty( $table_instance->db_errors ) ) { $db_errors[] = $table_instance->db_errors; } } $table_instance = new BWFAN_DB_Table_Field_Groups(); if ( ! $table_instance->is_exists() ) { $table_instance->create_table(); if ( ! empty( $table_instance->db_errors ) ) { $db_errors[] = $table_instance->db_errors; } } $table_instance = new BWFAN_DB_Table_Terms(); if ( ! $table_instance->is_exists() ) { $table_instance->create_table(); if ( ! empty( $table_instance->db_errors ) ) { $db_errors[] = $table_instance->db_errors; } } $table_instance = new BWFAN_DB_Table_Conversions(); if ( ! $table_instance->is_exists() ) { $table_instance->create_table(); if ( ! empty( $table_instance->db_errors ) ) { $db_errors[] = $table_instance->db_errors; } } $table_instance = new BWFAN_DB_Table_Engagement_Tracking(); if ( ! $table_instance->is_exists() ) { $table_instance->create_table(); if ( ! empty( $table_instance->db_errors ) ) { $db_errors[] = $table_instance->db_errors; } } $table_instance = new BWFAN_DB_Table_Engagement_Trackingmeta(); if ( ! $table_instance->is_exists() ) { $table_instance->create_table(); if ( ! empty( $table_instance->db_errors ) ) { $db_errors[] = $table_instance->db_errors; } } $table_instance = new BWFAN_DB_Table_Templates(); $table_instance->create_table(); if ( ! empty( $table_instance->db_errors ) ) { $db_errors[] = $table_instance->db_errors; } $table_instance = new BWFAN_DB_Table_Message(); $table_instance->create_table(); if ( ! empty( $table_instance->db_errors ) ) { $db_errors[] = $table_instance->db_errors; } /** Creating default contact fields */ BWFAN_Common::insert_default_crm_fields(); BWFCRM_Fields::add_field( 'Last Login', BWFCRM_Fields::$TYPE_DATE, array(), '', 2, 2, 1, 0, 2 ); BWFCRM_Fields::add_field( 'Last Open', BWFCRM_Fields::$TYPE_DATE, array(), '', 2, 2, 1, 0, 2 ); BWFCRM_Fields::add_field( 'Last Click', BWFCRM_Fields::$TYPE_DATE, array(), '', 2, 2, 1, 0, 2 ); /** Log if any mysql errors */ if ( ! empty( $db_errors ) ) { BWFAN_Common::log_test_data( array_merge( [ __FUNCTION__ ], $db_errors ), 'db-creation-errors' ); } } /** * @param $version_key * * @return void */ public function db_update_2_0_10_2( $version_key ) { if ( is_array( $this->method_run ) && in_array( '2.0.10.1', $this->method_run, true ) ) { update_option( 'bwfan_db', $version_key, true ); $this->method_run[] = $version_key; return; } global $wpdb; $db_errors = []; /** Check if 'next' column exists before attempting to drop it */ $column_exists = $wpdb->query( "SHOW COLUMNS FROM {$wpdb->prefix}bwfan_automation_contact LIKE 'next'" ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching if ( $column_exists ) { /** Drop next column */ $drop_col = "ALTER TABLE {$wpdb->prefix}bwfan_automation_contact DROP COLUMN `next`"; $wpdb->query( $drop_col ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching if ( ! empty( $wpdb->last_error ) ) { $db_errors[] = 'bwfan_automation_contact drop call - ' . $wpdb->last_error; } } $table_instance = new BWFAN_DB_Table_Automation_Contact(); $table_instance->create_table(); if ( ! empty( $table_instance->db_errors ) ) { $db_errors[] = $table_instance->db_errors; } $table_instance = new BWFAN_DB_Table_Automation_Complete_Contact(); $table_instance->create_table(); if ( ! empty( $table_instance->db_errors ) ) { $db_errors[] = $table_instance->db_errors; } $this->method_run[] = $version_key; /** Updating version key */ update_option( 'bwfan_db', $version_key, true ); /** Log if any mysql errors */ if ( ! empty( $db_errors ) ) { BWFAN_Common::log_test_data( array_merge( [ __FUNCTION__ ], $db_errors ), 'db-creation-errors' ); } } /** * @param $version_key * * @return void */ public function db_update_2_0_10_3( $version_key ) { if ( is_array( $this->method_run ) && in_array( '2.0.10.1', $this->method_run, true ) ) { update_option( 'bwfan_db', $version_key, true ); $this->method_run[] = $version_key; return; } global $wpdb; $db_errors = []; if ( ! is_array( $this->method_run ) || ! in_array( '2.0.10.2', $this->method_run, true ) ) { /** Alter bwfan_automation_complete_contact table */ $column_exists = $wpdb->query( "SHOW COLUMNS FROM {$wpdb->prefix}bwfan_automation_complete_contact LIKE 'event'" ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching if ( empty( $column_exists ) ) { $query = "ALTER TABLE {$wpdb->prefix}bwfan_automation_complete_contact CHANGE `trail` `trail` VARCHAR(40) NULL COMMENT 'Trail ID', ADD COLUMN `event` varchar(120) NOT NULL;"; $wpdb->query( $query ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching if ( ! empty( $wpdb->last_error ) ) { $db_errors[] = 'bwfan_automation_complete_contact alter table - ' . $wpdb->last_error; } } /** Alter bwfan_automation_contact table */ $column_exists = $wpdb->query( "SHOW COLUMNS FROM {$wpdb->prefix}bwfan_automation_contact LIKE 'last_time'" ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching if ( empty( $column_exists ) ) { $query = "ALTER TABLE {$wpdb->prefix}bwfan_automation_contact CHANGE `trail` `trail` VARCHAR(40) NULL COMMENT 'Trail ID', ADD COLUMN `last_time` bigint(12) UNSIGNED NOT NULL;"; $wpdb->query( $query ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching if ( ! empty( $wpdb->last_error ) ) { $db_errors[] = 'bwfan_automation_contact alter table - ' . $wpdb->last_error; } } } $table_instance = new BWFAN_DB_Table_Automation_Contact_Trail(); $table_instance->create_table(); if ( ! empty( $table_instance->db_errors ) ) { $db_errors[] = $table_instance->db_errors; } $this->method_run[] = $version_key; /** Updating version key */ update_option( 'bwfan_db', $version_key, true ); /** Log if any mysql errors */ if ( ! empty( $db_errors ) ) { BWFAN_Common::log_test_data( array_merge( [ __FUNCTION__ ], $db_errors ), 'db-creation-errors' ); } } /** * @param $version_key * * @return void */ public function db_update_2_0_10_4( $version_key ) { if ( is_array( $this->method_run ) && in_array( '2.0.10.1', $this->method_run, true ) ) { update_option( 'bwfan_db', $version_key, true ); $this->method_run[] = $version_key; return; } /** Marking option key autoload false */ $global_option = get_option( 'bwfan_global_settings', array() ); $global_option['2_0_10_4'] = 1; update_option( 'bwfan_global_settings', $global_option, true ); $this->method_run[] = $version_key; /** Updating version key */ update_option( 'bwfan_db', $version_key, true ); } /** * @param $version_key * * @return void */ public function db_update_2_0_10_5( $version_key ) { if ( ( is_array( $this->method_run ) && in_array( '2.0.10.1', $this->method_run, true ) ) || ! class_exists( 'BWFCRM_Contact' ) ) { update_option( 'bwfan_db', $version_key, true ); $this->method_run[] = $version_key; return; } global $wpdb; /** Automation complete contact */ $query = "SELECT MAX(`ID`) FROM `{$wpdb->prefix}bwfan_automation_complete_contact`"; $max_completed_aid = $wpdb->get_var( $query ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching if ( intval( $max_completed_aid ) > 0 ) { update_option( 'bwfan_max_automation_completed', $max_completed_aid ); if ( ! bwf_has_action_scheduled( 'bwfan_store_automation_completed_ids' ) ) { bwf_schedule_recurring_action( time() + 60, 120, 'bwfan_store_automation_completed_ids' ); } } /** Automation contact */ $query = "SELECT MAX(`ID`) FROM `{$wpdb->prefix}bwfan_automation_contact`"; $max_active_aid = $wpdb->get_var( $query ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching if ( intval( $max_active_aid ) > 0 ) { update_option( 'bwfan_max_active_automation', $max_active_aid ); if ( ! bwf_has_action_scheduled( 'bwfan_store_automation_active_ids' ) ) { bwf_schedule_recurring_action( time(), 120, 'bwfan_store_automation_active_ids' ); } } /** Updating version key */ update_option( 'bwfan_db', $version_key, true ); } /** * @param $version_key * * @return void */ public function db_update_2_0_10_6( $version_key ) { if ( is_array( $this->method_run ) && in_array( '1.0.0', $this->method_run, true ) ) { update_option( 'bwfan_db', $version_key, true ); $this->method_run[] = $version_key; return; } global $wpdb; $db_errors = []; /** Automation contact */ $query = $wpdb->prepare( "SELECT MIN(`ID`) FROM `{$wpdb->prefix}bwfan_automations` WHERE `v` = %d", 1 ); $automation_v1 = $wpdb->get_var( $query ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching $automation_v1 = ( 0 === intval( $automation_v1 ) ) ? '0' : '1'; update_option( 'bwfan_automation_v1', $automation_v1, true ); /** Updating version key */ update_option( 'bwfan_db', $version_key, true ); /** Log if any mysql errors */ if ( ! empty( $db_errors ) ) { BWFAN_Common::log_test_data( array_merge( [ __FUNCTION__ ], $db_errors ), 'db-creation-errors' ); } } /** * @param $version_key * * @return void */ public function db_update_2_0_10_7( $version_key ) { BWFAN_Recipe_Loader::get_recipes_array( true ); /** Updating version key */ update_option( 'bwfan_db', $version_key, true ); } /** * @param $version_key * * @return void */ public function db_update_2_0_10_8( $version_key ) { if ( is_array( $this->method_run ) && in_array( '1.0.0', $this->method_run, true ) ) { update_option( 'bwfan_db', $version_key, true ); $this->method_run[] = $version_key; return; } /** * Check if table exists and no column is missing */ $table_instance = new BWFAN_DB_Table_Message_Unsubscribe(); if ( $table_instance->is_exists() ) { $missing_columns = $table_instance->check_missing_columns(); if ( empty( $missing_columns ) ) { update_option( 'bwfan_db', $version_key, true ); $this->method_run[] = $version_key; return; } } /** Create missing columns in a table */ $db_errors = []; $table_instance->create_table(); if ( ! empty( $table_instance->db_errors ) ) { $db_errors[] = $table_instance->db_errors; } /** Updating version key */ update_option( 'bwfan_db', $version_key, true ); /** Log if any mysql errors */ if ( ! empty( $db_errors ) ) { BWFAN_Common::log_test_data( array_merge( [ __FUNCTION__ ], $db_errors ), 'db-creation-errors' ); } } public function db_update_2_4_2( $version_key ) { if ( is_array( $this->method_run ) && in_array( '1.0.0', $this->method_run, true ) ) { update_option( 'bwfan_db', $version_key, true ); $this->method_run[] = $version_key; return; } global $wpdb; /** Automation steps meta data normalize */ $query = "SELECT MIN(`ID`) as `ID` FROM `{$wpdb->prefix}bwfan_automations` WHERE `v` = 2 LIMIT 0, 1"; $min_id = $wpdb->get_var( $query ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching if ( $min_id > 0 ) { /** schedule recurring event */ bwf_schedule_recurring_action( time(), ( 5 * MINUTE_IN_SECONDS ), 'bwfan_update_meta_automations_v2' ); update_option( 'bwfan_automation_v2_meta_normalize', $min_id, false ); } /** Delete some repetitive actions to delete duplicated actions */ $query = "SELECT count(*) AS `count` FROM `{$wpdb->prefix}bwf_actions` WHERE `hook` IN ('bwfan_run_midnight_cron', 'bwfan_5_minute_worker', 'bwfan_run_midnight_connectors_sync')"; $result = $wpdb->get_var( $query ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching if ( ! empty( $result ) ) { /** Delete the rows */ $query = "DELETE FROM `{$wpdb->prefix}bwf_actions` WHERE `hook` IN ('bwfan_run_midnight_cron', 'bwfan_5_minute_worker', 'bwfan_run_midnight_connectors_sync')"; $wpdb->query( $query ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching } $this->method_run[] = $version_key; /** Updating version key */ update_option( 'bwfan_db', $version_key, true ); } public function db_update_2_4_4( $version_key ) { if ( is_array( $this->method_run ) && in_array( '1.0.0', $this->method_run, true ) ) { update_option( 'bwfan_db', $version_key, true ); $this->method_run[] = $version_key; return; } $table_instance = new BWFAN_DB_Table_Options(); if ( $table_instance->is_exists() ) { update_option( 'bwfan_db', $version_key, true ); $this->method_run[] = $version_key; return; } $db_errors = []; /** Create options table */ $table_instance->create_table(); if ( ! empty( $table_instance->db_errors ) ) { $db_errors[] = $table_instance->db_errors; } /** Updating version key */ update_option( 'bwfan_db', $version_key, true ); /** Log if any mysql errors */ if ( ! empty( $db_errors ) ) { BWFAN_Common::log_test_data( array_merge( [ __FUNCTION__ ], $db_errors ), 'db-creation-errors' ); } } public function db_update_2_6_1( $version_key ) { if ( is_array( $this->method_run ) && in_array( '1.0.0', $this->method_run, true ) ) { update_option( 'bwfan_db', $version_key, true ); $this->method_run[] = $version_key; return; } global $wpdb; $query = "TRUNCATE TABLE `{$wpdb->prefix}bwf_actions`"; $wpdb->query( $query ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching /** Scheduling Broadcast action */ if ( true === bwfan_is_autonami_pro_active() && ! bwf_has_action_scheduled( 'bwfcrm_broadcast_run_queue' ) ) { bwf_schedule_recurring_action( time(), 60, 'bwfcrm_broadcast_run_queue', array(), 'bwfcrm' ); BWFAN_PRO_Common::run_midnight_cron(); } /** Updating version key */ update_option( 'bwfan_db', $version_key, true ); } public function db_update_2_6_2( $version_key ) { if ( is_array( $this->method_run ) && in_array( '1.0.0', $this->method_run, true ) ) { update_option( 'bwfan_db', $version_key, true ); $this->method_run[] = $version_key; return; } global $wpdb; $db_errors = []; $column_exists = $wpdb->get_row( "SHOW COLUMNS FROM {$wpdb->prefix}bwfan_automations LIKE 'benchmark'", ARRAY_A ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching if ( ! empty( $column_exists ) && 'longtext' !== $column_exists['Type'] ) { $query = "ALTER TABLE {$wpdb->prefix}bwfan_automations CHANGE `benchmark` `benchmark` longtext;"; $wpdb->query( $query ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching } elseif ( empty( $column_exists ) ) { $query = "ALTER TABLE {$wpdb->prefix}bwfan_automations ADD COLUMN `benchmark` longtext;"; $wpdb->query( $query ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching } if ( ! empty( $wpdb->last_error ) ) { $db_errors[] = 'bwfan_automations alter table - ' . $wpdb->last_error; } /** Log if any mysql errors */ if ( ! empty( $db_errors ) ) { BWFAN_Common::log_test_data( array_merge( [ __FUNCTION__ ], $db_errors ), 'db-creation-errors' ); } /** Updating version key */ update_option( 'bwfan_db', $version_key, true ); } public function db_update_2_6_3( $version_key ) { if ( is_array( $this->method_run ) && in_array( '1.0.0', $this->method_run, true ) ) { update_option( 'bwfan_db', $version_key, true ); $this->method_run[] = $version_key; return; } /** Cache handling */ if ( class_exists( 'BWF_JSON_Cache' ) && method_exists( 'BWF_JSON_Cache', 'run_json_endpoints_cache_handling' ) ) { BWF_JSON_Cache::run_json_endpoints_cache_handling(); } global $wpdb; $query = "SELECT COUNT(ct.ID) FROM `{$wpdb->prefix}bwfan_automation_contact_trail` AS ct JOIN `{$wpdb->prefix}bwfan_automation_complete_contact` AS cc ON ct.tid = cc.trail WHERE ct.status = 2 LIMIT 0,1"; if ( intval( $wpdb->get_var( $query ) > 0 ) ) { //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching /** Scheduling recurring action */ bwf_schedule_recurring_action( time(), 300, 'bwfan_update_contact_trail', array(), 'bwfan' ); } /** Updating version key */ update_option( 'bwfan_db', $version_key, true ); } public function db_update_2_7_0( $version_key ) { if ( is_array( $this->method_run ) && in_array( '1.0.0', $this->method_run, true ) ) { update_option( 'bwfan_db', $version_key, true ); $this->method_run[] = $version_key; return; } /** Cache handling */ if ( class_exists( 'BWF_JSON_Cache' ) && method_exists( 'BWF_JSON_Cache', 'run_json_endpoints_cache_handling' ) ) { BWF_JSON_Cache::run_json_endpoints_cache_handling(); } /** Save main option settings as autoload true */ $global_settings = get_option( 'bwfan_global_settings', array() ); if ( ! empty( $global_settings ) ) { delete_option( 'bwfan_global_settings' ); update_option( 'bwfan_global_settings', $global_settings, true ); } /** Updating version key */ update_option( 'bwfan_db', $version_key, true ); } public function db_update_2_8_0( $version_key ) { if ( is_array( $this->method_run ) && in_array( '1.0.0', $this->method_run, true ) ) { update_option( 'bwfan_db', $version_key, true ); $this->method_run[] = $version_key; return; } /** Reset logs clear action */ if ( BWFAN_Common::bwf_has_action_scheduled( 'bwfan_delete_logs' ) ) { /** Un-schedule action */ bwf_unschedule_actions( "bwfan_delete_logs" ); $store_time = BWFAN_Common::get_store_time( 4 ); bwf_schedule_recurring_action( $store_time, DAY_IN_SECONDS, 'bwfan_delete_logs' ); } /** Updating version key */ update_option( 'bwfan_db', $version_key, true ); } public function db_update_2_8_4( $version_key ) { if ( is_array( $this->method_run ) && in_array( '1.0.0', $this->method_run, true ) ) { update_option( 'bwfan_db', $version_key, true ); $this->method_run[] = $version_key; return; } $table_instance = new BWFAN_DB_Table_Automation_Events(); $table_instance->create_table(); $db_errors = []; if ( ! empty( $table_instance->db_errors ) ) { $db_errors[] = $table_instance->db_errors; } /** Log if any mysql errors */ if ( ! empty( $db_errors ) ) { BWFAN_Common::log_test_data( array_merge( [ __FUNCTION__ ], $db_errors ), 'db-creation-errors' ); } /** Updating version key */ update_option( 'bwfan_db', $version_key, true ); } public function db_update_3_0_0( $version_key ) { if ( is_array( $this->method_run ) && in_array( '1.0.0', $this->method_run, true ) ) { update_option( 'bwfan_db', $version_key, true ); $this->method_run[] = $version_key; return; } update_option( 'bwf_global_block_editor_setting', BWFAN_Common::get_block_editor_default_setting() ); $this->update_user_contact_preference_data(); /** Updating version key */ update_option( 'bwfan_db', $version_key, true ); } /** * Update user contact preference data * @return void */ public function update_user_contact_preference_data() { $args = array( 'meta_key' => '_bwfan_contact_columns_v2', ); $user_query = new WP_User_Query( $args ); $users = $user_query->get_results(); if ( ! empty( $users ) ) { foreach ( $users as $user ) { $col_data = get_user_meta( $user->ID, '_bwfan_contact_columns_v2', true ); if ( ! is_array( $col_data ) ) { continue; } $col_data = array_filter( $col_data, function ( $field ) { if ( ( isset( $field['email'] ) && $field['email'] == 'Email' ) || isset( $field['creation_date'] ) && $field['creation_date'] == 'Creation Date' ) { return false; } return true; } ); update_user_meta( $user->ID, '_bwfan_contact_columns_v2', array_values( $col_data ) ); } } } public function db_update_3_0_1( $version_key ) { if ( is_array( $this->method_run ) && in_array( '2.0.10.1', $this->method_run, true ) ) { update_option( 'bwfan_db', $version_key, true ); $this->method_run[] = $version_key; return; } if ( bwfan_is_autonami_pro_active() && version_compare( BWFAN_PRO_VERSION, '3.0', '<=' ) ) { update_option( 'bwfan_db', $version_key, true ); return; } $this->v2_tables(); /** Check for old drag & drop email builder */ $this->check_for_old_visual_builder(); /** Updating version key */ update_option( 'bwfan_db', $version_key, true ); } public function db_update_3_0_1_1( $version_key ) { if ( is_array( $this->method_run ) && ( in_array( '1.0.0', $this->method_run, true ) || in_array( '2.8.4', $this->method_run, true ) ) ) { update_option( 'bwfan_db', $version_key, true ); $this->method_run[] = $version_key; return; } $table_instance = new BWFAN_DB_Table_Automation_Events(); $table_instance->create_table(); $db_errors = []; if ( ! empty( $table_instance->db_errors ) ) { $db_errors[] = $table_instance->db_errors; } /** Log if any mysql errors */ if ( ! empty( $db_errors ) ) { BWFAN_Common::log_test_data( array_merge( [ __FUNCTION__ ], $db_errors ), 'db-creation-errors' ); } /** Updating version key */ update_option( 'bwfan_db', $version_key, true ); } public function db_update_3_0_4( $version_key ) { if ( is_array( $this->method_run ) && in_array( '1.0.0', $this->method_run, true ) ) { update_option( 'bwfan_db', $version_key, true ); $this->method_run[] = $version_key; return; } /** Cache handling */ if ( class_exists( 'BWF_JSON_Cache' ) && method_exists( 'BWF_JSON_Cache', 'run_json_endpoints_cache_handling' ) ) { BWF_JSON_Cache::run_json_endpoints_cache_handling(); } /** Updating version key */ update_option( 'bwfan_db', $version_key, true ); } public function db_update_3_0_5( $version_key ) { if ( is_array( $this->method_run ) && in_array( '1.0.0', $this->method_run, true ) ) { update_option( 'bwfan_db', $version_key, true ); $this->method_run[] = $version_key; return; } global $wpdb; $db_errors = []; $column_exists = $wpdb->query( "SHOW COLUMNS FROM {$wpdb->prefix}bwfan_message LIKE 'data'" ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching if ( empty( $column_exists ) ) { $query = "ALTER TABLE {$wpdb->prefix}bwfan_message ADD data longtext;"; $wpdb->query( $query ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching if ( ! empty( $wpdb->last_error ) ) { $db_errors[] = 'bwfan_message alter table - ' . $wpdb->last_error; } } $columns = [ 'f_open', 'f_click', 'day', 'hour' ]; $index_queries = []; foreach ( $columns as $column ) { $query = "SHOW COLUMNS FROM `{$wpdb->prefix}bwfan_engagement_tracking` LIKE '$column'"; $sid_exists = $wpdb->get_row( $query, ARRAY_A ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching if ( empty( $sid_exists['Key'] ) ) { $index_queries[] = "ADD KEY `$column`(`$column`)"; } } if ( ! empty( $index_queries ) ) { $index_queries = implode( ', ', $index_queries ); $wpdb->query( "ALTER TABLE `{$wpdb->prefix}bwfan_engagement_tracking` $index_queries" ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange if ( ! empty( $wpdb->last_error ) ) { $db_errors[] = 'bwfan_engagement_tracking alter table - ' . $wpdb->last_error; } } /** Log if any mysql errors */ if ( ! empty( $db_errors ) ) { BWFAN_Common::log_test_data( array_merge( [ __FUNCTION__ ], $db_errors ), 'db-creation-errors' ); } /** Updating version key */ update_option( 'bwfan_db', $version_key, true ); } /** * Set notification email default settings * * @param $version_key * * @return void */ public function db_update_3_2_2( $version_key ) { if ( is_array( $this->method_run ) && in_array( '1.0.0', $this->method_run, true ) ) { update_option( 'bwfan_db', $version_key, true ); $this->method_run[] = $version_key; return; } /** set default settings for email notification */ BWFAN_Notification_Email::set_bwfan_settings(); /** Updating version key */ update_option( 'bwfan_db', $version_key, true ); } public function db_update_3_2_1( $version_key ) { if ( is_array( $this->method_run ) && in_array( '1.0.0', $this->method_run, true ) ) { update_option( 'bwfan_db', $version_key, true ); $this->method_run[] = $version_key; return; } /** Check for merge tags */ $this->recheck_merge_tags(); /** Check cart */ $this->check_cart(); /** Check bounce */ $this->check_bounce(); /** Updating version key */ update_option( 'bwfan_db', $version_key, true ); } protected function recheck_merge_tags() { global $wpdb; try { $settings = BWFAN_Common::get_global_settings(); /** Fetch some merge tag values from the engagements meta table */ $query = $wpdb->prepare( "SELECT `ID` FROM `{table_name}` WHERE `created_at` < %s AND `c_status` = %d ORDER BY `created_at` DESC LIMIT 0,1;", '2024-10-22 00:00:01', 2 ); $id = BWFAN_Model_Engagement_Tracking::get_var( $query ); if ( empty( $id ) ) { return; } $query = $wpdb->prepare( "SELECT `meta_value` FROM `{table_name}` WHERE `eid` < %d AND `meta_key` LIKE 'merge_tags' AND `meta_value` LIKE '%{{business_name}}%' LIMIT 0,100;", $id ); $rows = BWFAN_Model_Engagement_Trackingmeta::get_results( $query ); if ( empty( $rows ) || ! is_array( $rows ) || 0 === count( $rows ) ) { return; } $business_name = ''; $business_address = ''; $unsubscribe_url = ''; $rows = array_column( $rows, 'meta_value' ); foreach ( $rows as $row ) { $row = json_decode( $row, true ); if ( empty( $business_name ) && isset( $row['{{business_name}}'] ) && ! empty( $row['{{business_name}}'] ) ) { $business_name = $row['{{business_name}}']; } if ( empty( $business_address ) && isset( $row['{{business_address}}'] ) && ! empty( $row['{{business_address}}'] ) ) { $business_address = $row['{{business_address}}']; } if ( empty( $unsubscribe_url ) && isset( $row['{{unsubscribe_link}}'] ) && ! empty( $row['{{unsubscribe_link}}'] ) ) { $unsubscribe_url = strpos( $row['{{unsubscribe_link}}'], '?bwfan-action=unsubscribe' ) !== false ? $row['{{unsubscribe_link}}'] : ''; if ( ! empty( $unsubscribe_url ) ) { $unsubscribe_url = $this->get_the_unsubscribe_page_id( $unsubscribe_url ); } } if ( ! empty( $business_name ) && ! empty( $business_address ) && ! empty( $unsubscribe_url ) ) { break; } } if ( ! empty( $business_name ) ) { $settings['bwfan_setting_business_name'] = $business_name; } if ( ! empty( $business_address ) ) { $settings['bwfan_setting_business_address'] = $business_address; } if ( ! empty( $unsubscribe_url ) ) { $settings['bwfan_unsubscribe_page'] = $unsubscribe_url; } update_option( 'bwfan_global_settings', $settings ); } catch ( Exception $e ) { return; } catch ( Error $e ) { return; } } protected function check_cart() { if ( ! bwfan_is_woocommerce_active() ) { return; } $settings = BWFAN_Common::get_global_settings(); if ( ! empty( $settings['bwfan_ab_enable'] ) ) { return; } global $wpdb; try { $query = $wpdb->prepare( "SELECT `ID` FROM `{table_name}` WHERE `created_time` > %s LIMIT 0,1;", '2024-10-01 00:00:01' ); $found = BWFAN_Model_Abandonedcarts::get_var( $query ); if ( empty( $found ) ) { return; } $settings['bwfan_ab_enable'] = true; update_option( 'bwfan_global_settings', $settings ); } catch ( Exception $e ) { return; } catch ( Error $e ) { return; } } protected function check_bounce() { $settings = BWFAN_Common::get_global_settings(); if ( ! empty( $settings['bwfan_enable_bounce_handling'] ) ) { return; } /** offload ses */ if ( class_exists( 'DeliciousBrains\WP_Offload_SES\WP_Offload_SES' ) ) { $settings['bwfan_enable_bounce_handling'] = true; $settings['bwfan_bounce_select'] = 'amazon ses'; update_option( 'bwfan_global_settings', $settings ); return; } /** elastic email */ if ( class_exists( 'eemail' ) ) { $settings['bwfan_enable_bounce_handling'] = true; $settings['bwfan_bounce_select'] = 'elastic email'; update_option( 'bwfan_global_settings', $settings ); return; } /** postmark */ if ( class_exists( 'Postmark_Mail' ) ) { $settings['bwfan_enable_bounce_handling'] = true; $settings['bwfan_bounce_select'] = 'postmark'; update_option( 'bwfan_global_settings', $settings ); return; } /** wp mail smtp */ if ( defined( 'WPMS_PLUGIN_VER' ) ) { $option = get_option( 'wp_mail_smtp', false ); if ( $option && isset( $option['mail'] ) && isset( $option['mail']['mailer'] ) ) { $settings['bwfan_enable_bounce_handling'] = true; switch ( $option['mail']['mailer'] ) { case 'postmark': $settings['bwfan_bounce_select'] = 'postmark'; break; case 'amazonses': $settings['bwfan_bounce_select'] = 'amazon ses'; break; case 'sendinblue': $settings['bwfan_bounce_select'] = 'brevo (formerly sendinblue)'; break; case 'sparkpost': $settings['bwfan_bounce_select'] = 'sparkpost'; break; case 'mailgun': $settings['bwfan_bounce_select'] = 'mailgun'; break; case 'sendgrid': $settings['bwfan_bounce_select'] = 'sendgrid'; break; } update_option( 'bwfan_global_settings', $settings ); return; } } /** easy wp smtp */ if ( class_exists( 'EasyWPSMTP' ) ) { $option = get_option( 'easy_wp_smtp', false ); if ( $option && isset( $option['mail'] ) && isset( $option['mail']['mailer'] ) ) { $settings['bwfan_enable_bounce_handling'] = true; switch ( $option['mail']['mailer'] ) { case 'postmark': $settings['bwfan_bounce_select'] = 'postmark'; break; case 'amazonses': $settings['bwfan_bounce_select'] = 'amazon ses'; break; case 'sendinblue': $settings['bwfan_bounce_select'] = 'brevo (formerly sendinblue)'; break; case 'sparkpost': $settings['bwfan_bounce_select'] = 'sparkpost'; break; case 'mailgun': $settings['bwfan_bounce_select'] = 'mailgun'; break; case 'sendgrid': $settings['bwfan_bounce_select'] = 'sendgrid'; break; } update_option( 'bwfan_global_settings', $settings ); return; } } /** fluent smtp */ if ( defined( 'FLUENTMAIL_PLUGIN_FILE' ) ) { $settings = get_option( 'fluentmail-settings', false ); if ( ! empty( $settings ) && isset( $settings['misc'] ) && isset( $settings['misc']['default_connection'] ) && isset( $settings['connections'] ) ) { $default_connection = $settings['misc']['default_connection']; if ( isset( $settings['connections'][ $default_connection ] ) && isset( $settings['connections'][ $default_connection ]['provider'] ) ) { $settings['bwfan_enable_bounce_handling'] = true; switch ( $settings['connections'][ $default_connection ]['provider'] ) { case 'postmark': $settings['bwfan_bounce_select'] = 'postmark'; break; case 'amazonses': $settings['bwfan_bounce_select'] = 'amazon ses'; break; case 'sendinblue': $settings['bwfan_bounce_select'] = 'brevo (formerly sendinblue)'; break; case 'sparkpost': $settings['bwfan_bounce_select'] = 'sparkpost'; break; case 'mailgun': $settings['bwfan_bounce_select'] = 'mailgun'; break; case 'sendgrid': $settings['bwfan_bounce_select'] = 'sendgrid'; break; case 'elasticmail': $settings['bwfan_bounce_select'] = 'elastic email'; break; case 'pepipost': $settings['bwfan_bounce_select'] = 'pepipost'; break; } update_option( 'bwfan_global_settings', $settings ); return; } } } /** post smtp */ if ( class_exists( 'Postman' ) ) { $settings = get_option( 'postman_options', false ); if ( ! empty( $settings ) && isset( $settings['transport_type'] ) ) { $settings['bwfan_enable_bounce_handling'] = true; switch ( $settings['transport_type'] ) { case 'postmark_api': $settings['bwfan_bounce_select'] = 'postmark'; break; case 'aws_ses_api': $settings['bwfan_bounce_select'] = 'amazon ses'; break; case 'sendinblue_api': $settings['bwfan_bounce_select'] = 'brevo (formerly sendinblue)'; break; case 'sparkpost_api': $settings['bwfan_bounce_select'] = 'sparkpost'; break; case 'mailgun_api': $settings['bwfan_bounce_select'] = 'mailgun'; break; case 'sendgrid_api': $settings['bwfan_bounce_select'] = 'sendgrid'; break; case 'elasticemail_api': $settings['bwfan_bounce_select'] = 'elastic email'; break; case 'mailjet_api': $settings['bwfan_bounce_select'] = 'mailjet'; break; } update_option( 'bwfan_global_settings', $settings ); return; } } } /** * Helper method * * @param $url * * @return int|string */ protected function get_the_unsubscribe_page_id( $url = '' ) { if ( empty( $url ) ) { return ''; } /** Parse the URL to get just the path component */ $path = parse_url( $url, PHP_URL_PATH ); /** Remove leading and trailing slashes */ $slug = trim( $path, '/' ); /** If the slug has multiple segments, get the last one */ $path_segments = explode( '/', $slug ); $final_slug = end( $path_segments ); /** Get the page using the slug */ $page = get_posts( [ 'name' => $final_slug, 'post_type' => 'page', 'posts_per_page' => 1 ] ); return ! empty( $page ) ? strval( $page[0]->ID ) : 0; } public function db_update_3_4_1( $version_key ) { if ( is_array( $this->method_run ) && in_array( '1.0.0', $this->method_run, true ) ) { update_option( 'bwfan_db', $version_key, true ); $this->method_run[] = $version_key; return; } /** Check for old drag & drop email builder */ $this->check_for_old_visual_builder(); /** Updating version key */ update_option( 'bwfan_db', $version_key, true ); } /** * Add cookie_key index to bwfan_abandonedcarts table * * @param $version_key * * @return void */ public function db_update_3_4_2( $version_key ) { if ( is_array( $this->method_run ) && in_array( '1.0.0', $this->method_run, true ) ) { update_option( 'bwfan_db', $version_key, true ); $this->method_run[] = $version_key; return; } global $wpdb; $db_errors = []; // Check if index already exists $query = "SHOW INDEX FROM {$wpdb->prefix}bwfan_abandonedcarts WHERE Key_name = 'cookie_key'"; $index_exists = $wpdb->get_results( $query ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching if ( empty( $index_exists ) ) { // Add the cookie_key index $query = "ALTER TABLE {$wpdb->prefix}bwfan_abandonedcarts ADD KEY `cookie_key` (`cookie_key`)"; $wpdb->query( $query ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching if ( ! empty( $wpdb->last_error ) ) { $db_errors[] = 'bwfan_abandonedcarts add cookie_key index - ' . $wpdb->last_error; } } // Log any errors if ( ! empty( $db_errors ) ) { BWFAN_Common::log_test_data( array_merge( [ __FUNCTION__ ], $db_errors ), 'db-creation-errors' ); } // Updating version key update_option( 'bwfan_db', $version_key, true ); } public function db_update_3_4_3( $version_key ) { if ( is_array( $this->method_run ) && in_array( '1.0.0', $this->method_run, true ) ) { update_option( 'bwfan_db', $version_key, true ); $this->method_run[] = $version_key; return; } if ( ! get_option( 'bwfan_unique_secret', false ) ) { /** Adding a new unique key for file download */ update_option( 'bwfan_unique_secret', wp_generate_password( 32, false ), true ); } /** Updating version key */ update_option( 'bwfan_db', $version_key, true ); } public function check_for_old_visual_builder() { global $wpdb; $query = "SELECT ID FROM {$wpdb->prefix}bwfan_templates WHERE `mode`=4 ORDER BY ID DESC LIMIT 1 "; $is_used = ! empty( $wpdb->get_var( $query ) ) ? 1 : 0; //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching bwf_options_update( 'fk_legacy_builder', $is_used ); } /** * Change email column varchar length * * @param $version_key * * @return void */ public function db_update_3_4_4( $version_key ) { if ( is_array( $this->method_run ) && in_array( '1.0.0', $this->method_run, true ) ) { update_option( 'bwfan_db', $version_key, true ); $this->method_run[] = $version_key; return; } $db_errors = []; global $wpdb; $column_exists = $wpdb->query( "SHOW COLUMNS FROM {$wpdb->prefix}bwfan_abandonedcarts LIKE 'email'" ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching if ( empty( $column_exists ) ) { $query = "ALTER TABLE {$wpdb->prefix}bwfan_abandonedcarts ADD email varchar(100) NOT NULL"; } else { $query = "ALTER TABLE {$wpdb->prefix}bwfan_abandonedcarts CHANGE `email` `email` varchar(100) NOT NULL"; } $wpdb->query( $query ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching if ( ! empty( $wpdb->last_error ) ) { $db_errors[] = 'bwfan_abandonedcarts alter table - ' . $wpdb->last_error; } // Log any errors if ( ! empty( $db_errors ) ) { BWFAN_Common::log_test_data( array_merge( [ __FUNCTION__ ], $db_errors ), 'db-creation-errors' ); } /** Updating version key */ update_option( 'bwfan_db', $version_key, true ); } /** * @throws Exception */ public function db_update_3_5_0( $version_key ) { if ( is_array( $this->method_run ) && in_array( '1.0.0', $this->method_run, true ) ) { update_option( 'bwfan_db', $version_key, true ); $this->method_run[] = $version_key; return; } $table_instance = new BWFAN_DB_Table_Links(); $table_instance->create_table(); $db_errors = []; if ( ! empty( $table_instance->db_errors ) ) { $db_errors[] = $table_instance->db_errors; } $table_instance = new BWFAN_DB_Table_Link_Metrics(); $table_instance->create_table(); if ( ! empty( $table_instance->db_errors ) ) { $db_errors[] = $table_instance->db_errors; } /** Log if any mysql errors */ if ( ! empty( $db_errors ) ) { BWFAN_Common::log_test_data( array_merge( [ __FUNCTION__ ], $db_errors ), 'db-creation-errors' ); } if ( ! bwf_has_action_scheduled( 'bwfan_store_template_links' ) ) { $time = BWFAN_Common::get_store_time( '01', '30' ); bwf_schedule_recurring_action( $time, 60, 'bwfan_store_template_links' ); } /** Updating version key */ update_option( 'bwfan_db', $version_key, true ); } public function db_update_3_5_1( $version_key ) { if ( is_array( $this->method_run ) && in_array( '1.0.0', $this->method_run, true ) ) { update_option( 'bwfan_db', $version_key, true ); $this->method_run[] = $version_key; return; } global $wpdb; $db_errors = []; /** Alter Contact table */ $contact_table = $wpdb->prefix . 'bwf_contact'; if ( $wpdb->get_var( "SHOW TABLES LIKE '$contact_table'" ) === $contact_table ) { //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching /** Alter status column */ $column_info = $wpdb->get_row( "DESCRIBE {$contact_table} `status`", ARRAY_A ); if ( false === strpos( $column_info['Type'], 'tinyint' ) ) { $wpdb->query( "ALTER TABLE $contact_table MODIFY `status` tinyint unsigned NOT NULL DEFAULT 1;" ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange } if ( ! empty( $wpdb->last_error ) ) { $db_errors[] = 'bwf_contact modify status column - ' . $wpdb->last_error; } /** Get indexed columns */ $table_cols = $wpdb->get_results( "SHOW INDEX FROM $contact_table" ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching $index_cols = []; foreach ( $table_cols as $index ) { $index_cols[] = $index->Column_name; } /** Add indexes if not exists */ if ( ! in_array( 'status', $index_cols ) ) { $wpdb->query( "ALTER TABLE $contact_table ADD INDEX `status` (`status`);" ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange if ( ! empty( $wpdb->last_error ) ) { $db_errors[] = 'bwf_contact add index `status` - ' . $wpdb->last_error; } } if ( ! in_array( 'contact_no', $index_cols ) ) { $wpdb->query( "ALTER TABLE $contact_table ADD INDEX `contact_no` (`contact_no`);" ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange if ( ! empty( $wpdb->last_error ) ) { $db_errors[] = 'bwf_contact add index `contact_no` - ' . $wpdb->last_error; } } if ( ! in_array( 'last_modified', $index_cols ) ) { $wpdb->query( "ALTER TABLE $contact_table ADD INDEX `last_modified` (`last_modified`);" ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange if ( ! empty( $wpdb->last_error ) ) { $db_errors[] = 'bwf_contact add index `last_modified` - ' . $wpdb->last_error; } } if ( ! in_array( 'creation_date', $index_cols ) ) { $wpdb->query( "ALTER TABLE $contact_table ADD INDEX `creation_date` (`creation_date`);" ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange if ( ! empty( $wpdb->last_error ) ) { $db_errors[] = 'bwf_contact add index `creation_date` - ' . $wpdb->last_error; } } } /** Alter Customer table */ $customer_table = $wpdb->prefix . 'bwf_wc_customers'; if ( $wpdb->get_var( "SHOW TABLES LIKE '$customer_table'" ) === $customer_table ) { //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching $customer_col = $wpdb->get_row( "SHOW COLUMNS FROM $customer_table LIKE 'total_order_count'", ARRAY_A ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching if ( $customer_col ) { /** Check if column already has type int(7) unsigned NOT NULL */ if ( false === strpos( $customer_col['Type'], 'unsigned' ) || $customer_col['Null'] !== 'NO' || $customer_col['Default'] !== 'NULL' ) { do { //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching $count = $wpdb->query( $wpdb->prepare( "UPDATE $customer_table SET total_order_count = 0 WHERE total_order_count < 0 OR total_order_count > 9999999 LIMIT 500" ) ); } while ( $count > 0 ); if ( ! empty( $wpdb->last_error ) ) { $db_errors[] = 'bwf_wc_customers total_order_count column value data update failed error - ' . $wpdb->last_error; } /** Alter column */ $wpdb->query( "ALTER TABLE $customer_table MODIFY `total_order_count` int(7) unsigned NOT NULL;" ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange if ( ! empty( $wpdb->last_error ) ) { $db_errors[] = 'bwf_wc_customers modify total_order_count column - ' . $wpdb->last_error; } } } } /** Log if any mysql errors */ if ( ! empty( $db_errors ) ) { BWFAN_Common::log_test_data( array_merge( [ __FUNCTION__ ], $db_errors ), 'db-creation-errors' ); } /** Updating version key */ update_option( 'bwfan_db', $version_key, true ); } /** * Set indexes on columns * * @param $version_key * * @return void */ public function db_update_3_5_2( $version_key ) { if ( is_array( $this->method_run ) && in_array( '1.0.0', $this->method_run, true ) ) { update_option( 'bwfan_db', $version_key, true ); $this->method_run[] = $version_key; return; } global $wpdb; $db_errors = []; // Check if tables exist first $engagement_table = $wpdb->prefix . 'bwfan_engagement_tracking'; $conversions_table = $wpdb->prefix . 'bwfan_conversions'; /** Add tid index to engagement tracking table if not exists */ if ( $wpdb->get_var( "SHOW TABLES LIKE '$engagement_table'" ) === $engagement_table ) { //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching $tid_index_exists = $wpdb->get_var( "SHOW INDEX FROM $engagement_table WHERE Key_name = 'tid'" ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching if ( ! $tid_index_exists ) { $wpdb->query( "ALTER TABLE $engagement_table ADD INDEX `tid` (`tid`);" ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange if ( ! empty( $wpdb->last_error ) ) { $db_errors[] = 'bwfan_engagement_tracking add index `tid` - ' . $wpdb->last_error; } } } /** Add trackid index to conversions table if not exists */ if ( $wpdb->get_var( "SHOW TABLES LIKE '$conversions_table'" ) === $conversions_table ) { //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching $trackid_index_exists = $wpdb->get_var( "SHOW INDEX FROM $conversions_table WHERE Key_name = 'trackid'" ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching if ( ! $trackid_index_exists ) { $wpdb->query( "ALTER TABLE $conversions_table ADD INDEX `trackid` (`trackid`);" ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange if ( ! empty( $wpdb->last_error ) ) { $db_errors[] = 'bwfan_conversions add index `trackid` - ' . $wpdb->last_error; } } } /** Log if any mysql errors */ if ( ! empty( $db_errors ) ) { BWFAN_Common::log_test_data( array_merge( [ __FUNCTION__ ], $db_errors ), 'db-creation-errors' ); } /** Updating version key */ update_option( 'bwfan_db', $version_key, true ); } } if ( class_exists( 'BWFAN_DB' ) ) { BWFAN_Core::register( 'db', 'BWFAN_DB' ); }