[ 'name' => 'Address 1', 'type' => 1, 'mode' => 2, 'vmode' => 1, 'view' => 2, 'meta' => [], ], 'address-2' => [ 'name' => 'Address 2', 'type' => 1, 'mode' => 2, 'vmode' => 1, 'view' => 2, 'meta' => [] ], 'city' => [ 'name' => 'City', 'type' => 1, 'mode' => 2, 'vmode' => 1, 'view' => 2, 'meta' => [] ], 'postcode' => [ 'name' => 'Pincode', 'type' => 1, 'mode' => 2, 'vmode' => 1, 'view' => 2, 'meta' => [] ], 'company' => [ 'name' => 'Company', 'type' => 1, 'mode' => 2, 'vmode' => 1, 'view' => 2, 'meta' => [] ], 'gender' => [ 'name' => 'Gender', 'type' => 4, 'mode' => 2, 'vmode' => 1, 'view' => 2, 'meta' => [ 'options' => [ 'Male', 'Female', 'Other' ] ] ], 'dob' => [ 'name' => 'Date of Birth', 'type' => 7, 'mode' => 2, 'vmode' => 1, 'view' => 2, 'meta' => [] ] ]; public static $upstroke_funnels = null; public static $upstroke_offers = null; public static $show_tags_list_by_name = null; public static $unsubscribe_page_link = ''; public static function init() { register_deactivation_hook( BWFAN_PRO_PLUGIN_FILE, array( __CLASS__, 'deactivation' ) ); add_action( 'admin_init', array( __CLASS__, 'schedule_cron' ) ); add_action( 'bwfan_run_midnight_cron', array( __CLASS__, 'run_midnight_cron' ) ); add_action( 'bwfan_delete_engagement_meta_records', array( __CLASS__, 'delete_engagement_tracking_meta' ) ); add_action( 'bwfan_automation_saved', array( __CLASS__, 'schedule_time_async_events' ) ); add_action( 'bwfan_run_independent_automation', array( __CLASS__, 'make_independent_events_tasks' ) ); add_filter( 'bwfan_select2_ajax_callable', array( __CLASS__, 'get_callable_object' ), 1, 2 ); add_filter( 'bwfan_send_async_call_data', array( __CLASS__, 'passing_event_language' ), 10, 1 ); /** Send test data to zapier zap */ add_action( 'wp_ajax_bwf_test_zap', array( __CLASS__, 'test_zap' ) ); /** send test data to pabbly */ add_action( 'wp_ajax_bwf_test_pabbly', array( __CLASS__, 'test_pabbly' ) ); /** Send test data to zapier zap */ add_action( 'wp_ajax_bwf_send_test_http_post', array( __CLASS__, 'send_test_http_post' ) ); /** Delete automation tasks after paid order */ add_action( 'bwf_normalize_contact_meta_before_save', array( __CLASS__, 'delete_automation_tasks_by_automation_ids' ), PHP_INT_MAX, 2 ); /** 5 min action callback */ add_action( 'bwfan_5_minute_worker', array( __CLASS__, 'five_minute_worker_cb' ) ); /** populate cart from order **/ add_action( 'wp', array( __CLASS__, 'bwfan_populate_cart_from_order' ), 999 ); add_filter( 'bwfan_get_form_submit_events', array( __CLASS__, 'get_form_submit_events' ), 10, 1 ); add_filter( 'bwfan_automation_tables', array( __CLASS__, 'bwfan_added_pro_tables' ), 10, 1 ); add_action( 'bwfan_check_conversion_validity', [ __CLASS__, 'bwfan_delete_invalid_conversions' ], 10 ); /** Ajax call to save email template */ add_action( 'wp_ajax_bwf_save_email_template', array( __CLASS__, 'bwf_save_email_template' ) ); /** Display email content in browser */ add_action( 'wp', [ __CLASS__, 'load_view_in_browser_link_content' ] ); } /** Include Form Submit Events available in Pro * * @param $events * * @return string[] */ public static function get_form_submit_events( $events ) { $pro_form_events = array( 'BWFAN_Elementor_Form_Submit', 'BWFAN_Elementor_PopUp_Form_Submit', 'BWFAN_Caldera_Form_Submit', 'BWFAN_Fluent_Form_Submit', 'BWFAN_GF_Form_Submit', 'BWFAN_Ninja_Form_Submit', 'BWFAN_Funnel_Optin_Form_Submit', 'BWFAN_TVE_Lead_Form_Submit', 'BWFAN_WPFORMS_Form_Submit' ); return is_array( $events ) && ! empty( $events ) ? array_merge( $events, $pro_form_events ) : $pro_form_events; } public static function send_test_http_post() { BWFAN_PRO_Common::nocache_headers(); BWFAN_Common::check_nonce(); // phpcs:disable WordPress.Security.NonceVerification $response = []; try { $post = $_POST; BWFAN_Merge_Tag_Loader::set_data( array( 'is_preview' => true, ) ); $custom_fields = array(); if ( isset( $post['v'] ) && 2 === absint( $post['v'] ) ) { $url = $post['url']; if ( isset( $post['custom_fields'] ) && is_array( $post['custom_fields'] ) ) { foreach ( $post['custom_fields'] as $field ) { $field_value = stripslashes( $field['field_value'] ); $field_key = stripslashes( $field['field'] ); $custom_fields[ $field_key ] = BWFAN_Common::decode_merge_tags( $field_value ); } } $headers = array(); if ( isset( $post['headers'] ) && is_array( $post['headers'] ) ) { foreach ( $post['headers'] as $field ) { $field_value = stripslashes( $field['field_value'] ); $field_key = stripslashes( $field['field'] ); $headers[ $field_key ] = BWFAN_Common::decode_merge_tags( $field_value ); } } $method = isset( $post['http_method'] ) ? $post['http_method'] : 2; } else { $url = $post['data']['url']; $fields = array_map( 'stripslashes', $post['data']['custom_fields']['field'] ); $fields_value = array_map( 'stripslashes', $post['data']['custom_fields']['field_value'] ); foreach ( $fields as $key1 => $field_id ) { $custom_fields[ $field_id ] = BWFAN_Common::decode_merge_tags( $fields_value[ $key1 ] ); } $fields = array_map( 'stripslashes', $post['data']['headers']['field'] ); $fields_value = array_map( 'stripslashes', $post['data']['headers']['field_value'] ); $headers = array(); foreach ( $fields as $key1 => $field_id ) { $headers[ $field_id ] = BWFAN_Common::decode_merge_tags( $fields_value[ $key1 ] ); } $method = isset( $post['data']['http_method'] ) ? $post['data']['http_method'] : 2; } $action_object = BWFAN_Core()->integration->get_action( 'wp_http_post' ); $action_object->is_preview = true; $action_object->set_data( array( 'headers' => $headers, 'custom_fields' => $custom_fields, 'url' => $url, 'method' => $method, ) ); $response = $action_object->process(); } catch ( Exception $e ) { wp_send_json( array( 'status' => false, 'msg' => $e->getMessage(), ) ); } if ( empty( $response ) || 200 !== $response['response'] ) { $message = isset( $response['body'] ) && is_array( $response['body'] ) ? $response['body'][0] : __( 'Unable to send data', 'wp-marketing-automations-pro' ); wp_send_json( array( 'status' => false, 'msg' => $message, ) ); } wp_send_json( array( 'status' => true, 'msg' => __( 'Test Data posted', 'wp-marketing-automations-pro' ), ) ); } /** * Capture all the action ids of an automation and delete all its tasks except for completed tasks. * * @param $contact * @param $order_id * * @return void */ public static function delete_automation_tasks_by_automation_ids( $contact, $order_id ) { /** Check if v1 automations active */ if ( false === BWFAN_Common::is_automation_v1_active() ) { return; } if ( $contact instanceof WooFunnels_Contact && absint( $contact->get_id() ) > 0 ) { do_action( 'bwfan_sync_call_delete_tasks', $contact->get_email(), $contact->get_contact_no(), $order_id ); return; } $order = wc_get_order( $order_id ); if ( ! $order instanceof WC_Order ) { return; } do_action( 'bwfan_sync_call_delete_tasks', $order->get_billing_email(), $order->get_billing_phone(), $order_id ); } /** * Schedule a wp event which will run once a day. * @throws Exception */ public static function schedule_cron() { if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) { return; } $run_midnight_cron_scheduled = ''; $five_minute_worker_scheduled = ''; $run_midnight_connectors_sync_scheduled = ''; if ( method_exists( 'BWFAN_Common', 'bwf_has_action_scheduled' ) ) { $run_midnight_cron_scheduled = BWFAN_Common::bwf_has_action_scheduled( 'bwfan_run_midnight_cron' ); $five_minute_worker_scheduled = BWFAN_Common::bwf_has_action_scheduled( 'bwfan_5_minute_worker' ); $run_midnight_connectors_sync_scheduled = BWFAN_Common::bwf_has_action_scheduled( 'bwfan_run_midnight_connectors_sync' ); } else { $run_midnight_cron_scheduled = bwf_has_action_scheduled( 'bwfan_run_midnight_cron' ); $five_minute_worker_scheduled = bwf_has_action_scheduled( 'bwfan_5_minute_worker' ); $run_midnight_connectors_sync_scheduled = bwf_has_action_scheduled( 'bwfan_run_midnight_connectors_sync' ); } $midnight_time = self::get_midnight_store_time(); if ( ! $run_midnight_cron_scheduled ) { bwf_schedule_recurring_action( $midnight_time, DAY_IN_SECONDS, 'bwfan_run_midnight_cron' ); } /** Schedule connectors sync call */ if ( ! $run_midnight_connectors_sync_scheduled ) { bwf_schedule_recurring_action( $midnight_time, DAY_IN_SECONDS, 'bwfan_run_midnight_connectors_sync' ); } /** Scheduling a 5 min worker */ if ( ! $five_minute_worker_scheduled ) { bwf_schedule_recurring_action( time(), MINUTE_IN_SECONDS * 5, 'bwfan_5_minute_worker' ); } } /** * Remove autonami events on plugin deactivation. */ public static function deactivation() { bwf_unschedule_actions( 'bwfan_run_midnight_cron' ); } /** * Run once in a day and check all the active automations for events which are time independent. * * @return void * @throws Exception */ public static function run_midnight_cron() { $global_settings = BWFAN_Common::get_global_settings(); $delete_time_in_days = intval( $global_settings['bwfan_delete_engagement_tracking_meta'] ); if ( ! empty( $delete_time_in_days ) && ! bwf_has_action_scheduled( 'bwfan_delete_engagement_meta_records' ) ) { bwf_schedule_recurring_action( time(), MINUTE_IN_SECONDS * 5, 'bwfan_delete_engagement_meta_records' ); } $automations = self::get_active_async_automations(); if ( empty( $automations ) ) { return; } $automations = array_column( $automations, 'ID' ); do_action( 'bwfan_midnight_cron', $automations ); foreach ( $automations as $aid ) { self::schedule_time_async_events( $aid ); } } /** * Delete engagement tracking meta record from DB. This function run once in a day. * * @return void */ public static function delete_engagement_tracking_meta() { global $wpdb; $global_settings = BWFAN_Common::get_global_settings(); $delete_time_in_days = intval( $global_settings['bwfan_delete_engagement_tracking_meta'] ); $delete_time_in_days = $delete_time_in_days > 0 ? $delete_time_in_days : 30; $current_datetime = new DateTime( 'now' ); $current_datetime->modify( "-{$delete_time_in_days} days" ); $cutoff_date = $current_datetime->format( 'Y-m-d' ); $start_time = time(); $last_id_query = $wpdb->prepare( "SELECT MAX(ID) FROM {$wpdb->prefix}bwfan_engagement_tracking WHERE created_at IS NOT NULL AND created_at < %s", $cutoff_date ); $last_id = $wpdb->get_var( $last_id_query );// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL if ( empty( $last_id ) ) { bwf_unschedule_actions( 'bwfan_delete_engagement_meta_records' ); return; } do { $delete_query = $wpdb->prepare( "DELETE FROM {$wpdb->prefix}bwfan_engagement_trackingmeta WHERE eid <= %d AND meta_key = %s LIMIT 500", $last_id, 'merge_tags' ); $rows_affected = $wpdb->query( $delete_query ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL if ( empty( $rows_affected ) ) { bwf_unschedule_actions( 'bwfan_delete_engagement_meta_records' ); break; } } while ( ( time() - $start_time ) < 20 ); } /** * Get all active async automation ids * * @return array|null */ public static function get_active_async_automations() { $ins = BWFAN_Load_Sources::get_instance(); $all_events = $ins->get_events(); /** Fetch time independent only */ $all_events = array_filter( $all_events, function ( $events ) { return $events->is_time_independent(); } ); if ( empty( $all_events ) ) { return []; } $all_events = array_map( function ( $events ) { return $events->get_slug(); }, $all_events ); $all_events = array_keys( $all_events ); global $wpdb; $placeholder = array_fill( 0, count( $all_events ), '%s' ); $placeholder = implode( ", ", $placeholder ); $query = $wpdb->prepare( "SELECT `ID` FROM `{$wpdb->prefix}bwfan_automations` WHERE `event` IN ($placeholder) AND `status` = 1;", $all_events ); return BWFAN_Model_Automations::get_results( $query ); } /** * Schedule action if the automation is time independent. * * @param $automation_id * * @throws Exception */ public static function schedule_time_async_events( $automation_id ) { if ( class_exists( 'WooFunnels_Cache' ) ) { $WooFunnels_Cache_obj = WooFunnels_Cache::get_instance(); $WooFunnels_Cache_obj->set_cache( 'bwfan_automations_meta_' . $automation_id, false, 'autonami' ); } $automation = BWFAN_Model_Automations::get_automation_with_data( $automation_id ); /** Check if automation deactivated */ if ( 1 !== intval( $automation['status'] ) ) { if ( bwf_has_action_scheduled( 'bwfan_run_independent_automation', array( $automation_id ) ) ) { bwf_unschedule_actions( 'bwfan_run_independent_automation', array( $automation_id ) ); } if ( $automation_id !== intval( $automation_id ) ) { if ( bwf_has_action_scheduled( 'bwfan_run_independent_automation', array( intval( $automation_id ) ) ) ) { bwf_unschedule_actions( 'bwfan_run_independent_automation', array( intval( $automation_id ) ) ); } } return; } if ( ! isset( $automation['event'] ) || empty( $automation['event'] ) ) { return; } $event_instance = BWFAN_Core()->sources->get_event( $automation['event'] ); if ( ! $event_instance instanceof BWFAN_Event ) { return; } $event_instance->load_hooks(); /** v1 */ $hours = isset( $automation['meta']['event_meta']['hours'] ) ? $automation['meta']['event_meta']['hours'] : ''; $minutes = isset( $automation['meta']['event_meta']['minutes'] ) ? $automation['meta']['event_meta']['minutes'] : ''; if ( 2 === absint( $automation['v'] ) ) { $hours = isset( $automation['meta']['event_meta']['scheduled-everyday-at']['hours'] ) ? $automation['meta']['event_meta']['scheduled-everyday-at']['hours'] : ''; $minutes = isset( $automation['meta']['event_meta']['scheduled-everyday-at']['minutes'] ) ? $automation['meta']['event_meta']['scheduled-everyday-at']['minutes'] : ''; } $hours = empty( $hours ) ? 00 : $hours; $minutes = empty( $minutes ) ? 00 : $minutes; if ( bwf_has_action_scheduled( 'bwfan_run_independent_automation', array( $automation_id ) ) ) { bwf_unschedule_actions( 'bwfan_run_independent_automation', array( $automation_id ) ); } if ( $automation_id !== intval( $automation_id ) ) { if ( bwf_has_action_scheduled( 'bwfan_run_independent_automation', array( intval( $automation_id ) ) ) ) { bwf_unschedule_actions( 'bwfan_run_independent_automation', array( intval( $automation_id ) ) ); } } $automation_id = intval( $automation_id ); bwf_schedule_single_action( BWFAN_Core()->automations->get_automation_execution_time( $hours, $minutes ), 'bwfan_run_independent_automation', array( $automation_id ) ); } /** * Make tasks for those events which are time independent. * Like WC subscription before end or before renewal * * @param $automation_id */ public static function make_independent_events_tasks( $automation_id ) { $automation_details = BWFAN_Model_Automations::get_automation_with_data( $automation_id ); /** Check if automation is active */ if ( 1 !== intval( $automation_details['status'] ) ) { return; } $event_instance = BWFAN_Core()->sources->get_event( $automation_details['event'] ); /** Validate if event exist */ if ( ! $event_instance instanceof BWFAN_Event ) { return; } /** Halt if not time independent event */ if ( false === $event_instance->is_time_independent() ) { return; } $event_instance->load_hooks(); $last_run = BWFAN_Model_Automationmeta::get_meta( $automation_id, 'last_run' ); if ( empty( $last_run ) ) { $event_instance->make_task_data( $automation_id, $automation_details ); return; } $date_time = new DateTime(); $current_day = $date_time->format( 'Y-m-d' ); BWFAN_Common::log_test_data( 'async - last run: ' . $last_run . ' | current: ' . $current_day, 'async-checking', true ); if ( $current_day !== $last_run ) { $event_instance->make_task_data( $automation_id, $automation_details ); } } /** * Get FunnelKit Upsell funnels * * @param $term * * @return array|null */ public static function get_upstroke_funnels( $term = '' ) { /** Return if already set */ if ( ! is_null( self::$upstroke_funnels ) ) { return self::$upstroke_funnels; } $args = array( 'post_type' => WFOCU_Common::get_funnel_post_type_slug(), 'post_status' => array( 'publish' ), 'posts_per_page' => - 1, ); if ( ! empty( $term ) ) { $args['s'] = $term; } if ( ! empty( $term ) && is_numeric( $term ) ) { unset( $args['s'] ); $args['post__in'] = array( $term ); } $q = new WP_Query( $args ); $items = array(); if ( $q->have_posts() ) { foreach ( $q->posts as $post ) { $items[] = array( 'id' => $post->ID, 'post_title' => $post->post_title, ); } } self::$upstroke_funnels = $items; return $items; } /** * Return Funnelkit Upsell offers * * @param $term * * @return array|null */ public static function get_upstroke_offers( $term = '' ) { /** Return if already set */ if ( ! is_null( self::$upstroke_offers ) ) { return self::$upstroke_offers; } $args = array( 'post_type' => WFOCU_Common::get_offer_post_type_slug(), 'post_status' => array( 'publish' ), 'posts_per_page' => - 1, ); if ( ! empty( $term ) ) { $args['s'] = $term; } if ( ! empty( $term ) && is_numeric( $term ) ) { unset( $args['s'] ); $args['post__in'] = array( $term ); } $q = new WP_Query( $args ); $items = array(); if ( $q->have_posts() ) { foreach ( $q->posts as $post ) { $items[] = array( 'id' => $post->ID, 'post_title' => $post->post_title, ); } } self::$upstroke_offers = $items; return $items; } public static function get_upstroke_funnel_nice_name( $funnel_ids ) { $result = []; $args = array( 'post_type' => WFOCU_Common::get_funnel_post_type_slug(), 'numberposts' => - 1, 'post__in' => $funnel_ids, ); $funnels = get_posts( $args ); if ( false === is_array( $funnels ) || 0 === count( $funnels ) ) { return $result; } foreach ( $funnels as $single_funnel ) { $result[ $single_funnel->ID ] = $single_funnel->post_title . ' (#' . $single_funnel->ID . ')'; } return $result; } public static function get_upstroke_offer_nice_name( $offer_ids ) { $result = []; $args = array( 'post_type' => WFOCU_Common::get_offer_post_type_slug(), 'numberposts' => - 1, 'post__in' => $offer_ids, ); $offers = get_posts( $args ); if ( false === is_array( $offers ) || 0 === count( $offers ) ) { return $result; } foreach ( $offers as $single_offer ) { $result[ $single_offer->ID ] = $single_offer->post_title; } return $result; } public static function get_all_active_affiliates() { global $wpdb; //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching $affiliates = $wpdb->get_results( $wpdb->prepare( " SELECT affiliate_id FROM {$wpdb->prefix}affiliate_wp_affiliates WHERE status = %s ", 'active' ), ARRAY_A ); if ( count( $affiliates ) > 0 ) { return array_column( $affiliates, 'affiliate_id' ); } return $affiliates; } public static function get_referrals_count_from_period( $affiliate_id, $from, $to ) { global $wpdb; $start_date = $from . ' 00:00:00'; $end_date = $to . ' 23:59:59'; //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching $referrals = $wpdb->get_var( $wpdb->prepare( " SELECT COUNT(referral_id) FROM {$wpdb->prefix}affiliate_wp_referrals WHERE affiliate_id = %d AND status = %s AND date >= %s AND date <= %s ", $affiliate_id, 'unpaid', $start_date, $end_date ) ); return ! empty( $referrals ) ? $referrals : 0; } public static function get_visits_from_period( $affiliate_id, $from, $to ) { global $wpdb; $start_date = $from . ' 00:00:00'; $end_date = $to . ' 23:59:59'; //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching $visits = $wpdb->get_var( $wpdb->prepare( " SELECT COUNT(visit_id) FROM {$wpdb->prefix}affiliate_wp_visits WHERE affiliate_id = %d AND date >= %s AND date <= %s ", $affiliate_id, $start_date, $end_date ) ); return ! empty( $visits ) ? $visits : 0; } public static function get_commissions_from_period( $affiliate_id, $from, $to ) { global $wpdb; $start_date = $from . ' 00:00:00'; $end_date = $to . ' 23:59:59'; //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching $earnings = $wpdb->get_var( $wpdb->prepare( " SELECT SUM(amount) FROM {$wpdb->prefix}affiliate_wp_referrals WHERE affiliate_id = %d AND status = %s AND date >= %s AND date <= %s ", $affiliate_id, 'unpaid', $start_date, $end_date ) ); $total_earnings = 0; if ( ! empty( $earnings ) ) { $decimal = apply_filters( 'bwfan_get_decimal_values', 2 ); $total_earnings = round( $earnings, $decimal ); } return $total_earnings; } public static function get_callable_object( $is_empty, $data ) { if ( 'sfwd-courses' === $data['type'] ) { return [ __CLASS__, 'get_learndash_courses' ]; } elseif ( 'tag' === $data['type'] ) { return [ __CLASS__, 'get_tags' ]; } elseif ( 'list' === $data['type'] ) { return [ __CLASS__, 'get_lists' ]; } elseif ( 'link_trigger' === $data['type'] ) { return [ __CLASS__, 'get_link_triggers' ]; } elseif ( 'quiz' === $data['type'] ) { return [ __CLASS__, 'get_quizzes' ]; } return $is_empty; } public static function get_learndash_courses( $searched_term ) { $courses = array(); $results = array(); $query_params = array( 'post_type' => 'sfwd-courses', 'posts_per_page' => - 1, 'post_status' => 'publish', ); if ( '' !== $searched_term ) { $query_params['s'] = $searched_term; } $query = new WP_Query( $query_params ); if ( $query->found_posts > 0 ) { foreach ( $query->posts as $post ) { $results[] = array( 'id' => $post->ID, 'text' => $post->post_title, ); } } $courses['results'] = $results; return $courses; } public static function get_wc_membership_active_statuses() { if ( ! function_exists( 'wc_memberships' ) ) { return []; } $statuses = wc_memberships()->get_user_memberships_instance()->get_active_access_membership_statuses(); return BWFAN_PRO_Common::get_wc_membership_statuses_with_prefix( $statuses ); } public static function get_wc_membership_statuses_with_prefix( $statuses ) { if ( ! function_exists( 'wc_memberships' ) ) { return []; } $statuses_to_return = []; foreach ( (array) $statuses as $index => $status ) { if ( 'any' !== $status ) { $statuses_to_return[ $index ] = 'wcm-' . $status; } } return $statuses_to_return; } public static function test_zap() { BWFAN_PRO_Common::nocache_headers(); BWFAN_Common::check_nonce(); // phpcs:disable WordPress.Security.NonceVerification $result = array( 'status' => false, 'msg' => __( 'Error', 'wp-marketing-automations-pro' ), ); $post = $_POST; $webhook_url = isset( $post['data'] ) || isset( $post['data']['url'] ) ? $post['data']['url'] : ''; $url = filter_input( INPUT_POST, 'url' ); $webhook_url = empty( $url ) ? $webhook_url : $url; if ( empty( $webhook_url ) ) { $result['msg'] = __( 'Webhook URL cannot be blank', 'wp-marketing-automations-pro' ); wp_send_json( $result ); } update_option( 'bwfan_show_preview', $post ); BWFAN_Merge_Tag_Loader::set_data( array( 'is_preview' => true, ) ); $post['event_data']['event_slug'] = $post['event']; $custom_fields = array(); /** only checking with v1 automations */ if ( ! isset( $post['v'] ) || 2 !== absint( $post['v'] ) ) { if ( isset( $post['data']['custom_fields'] ) && isset( $post['data']['custom_fields']['field'] ) && isset( $post['data']['custom_fields']['field_value'] ) ) { reset( $post['data']['custom_fields']['field'] ); $first_key = key( $post['data']['custom_fields']['field'] ); if ( empty( $post['data']['custom_fields']['field'][ $first_key ] ) || empty( $post['data']['custom_fields']['field'][ $first_key ] ) ) { $result['msg'] = __( 'Atleast one key / value pair required', 'wp-marketing-automations-pro' ); wp_send_json( $result ); } } else { $result['msg'] = __( 'Atleast one key / value pair required', 'wp-marketing-automations-pro' ); wp_send_json( $result ); } $fields = array_map( 'stripslashes', $post['data']['custom_fields']['field'] ); $fields_value = array_map( 'stripslashes', $post['data']['custom_fields']['field_value'] ); foreach ( $fields as $key1 => $field_id ) { $custom_fields[ $field_id ] = BWFAN_Common::decode_merge_tags( $fields_value[ $key1 ] ); } } else { $fields = $post['custom_fields']; foreach ( $fields as $field ) { $custom_fields[ $field['field'] ] = BWFAN_Common::decode_merge_tags( $field['field_value'] ); } } $data_to_set = array(); $data_to_set['custom_fields'] = $custom_fields; $data_to_set['url'] = BWFAN_Common::decode_merge_tags( $webhook_url ); $data_to_set['test'] = true; $action_object = BWFAN_Core()->integration->get_action( 'za_send_data' ); $action_object->is_preview = true; $action_object->set_data( $data_to_set ); $response = $action_object->process(); /** adding handling for error responses in test zap */ if ( empty( $response ) || 200 !== $response['response'] ) { $message = isset( $response['body'] ) && is_array( $response['body'] ) ? $response['body'][0] : __( 'Unable to send data', 'wp-marketing-automations-pro' ); wp_send_json( array( 'status' => false, 'msg' => $message, ) ); } if ( false !== $response ) { $result['msg'] = __( 'Test Data sent to Zap.', 'wp-marketing-automations-pro' ); $result['status'] = true; } //phpcs:enable WordPress.Security.NonceVerification wp_send_json( $result ); } public static function test_pabbly() { BWFAN_PRO_Common::nocache_headers(); BWFAN_Common::check_nonce(); // phpcs:disable WordPress.Security.NonceVerification $result = array( 'status' => false, 'msg' => __( 'Error', 'wp-marketing-automations-pro' ), ); $post = $_POST; if ( empty( $post['data']['url'] ) ) { $result['msg'] = __( 'Webhook URL cannot be blank', 'wp-marketing-automations-pro' ); wp_send_json( $result ); } if ( isset( $post['data']['custom_fields'] ) && isset( $post['data']['custom_fields']['field'] ) && isset( $post['data']['custom_fields']['field_value'] ) ) { reset( $post['data']['custom_fields']['field'] ); $first_key = key( $post['data']['custom_fields']['field'] ); if ( empty( $post['data']['custom_fields']['field'][ $first_key ] ) || empty( $post['data']['custom_fields']['field'][ $first_key ] ) ) { $result['msg'] = __( 'Atleast one key / value pair required', 'wp-marketing-automations-pro' ); wp_send_json( $result ); } } else { $result['msg'] = __( 'Atleast one key / value pair required', 'wp-marketing-automations-pro' ); wp_send_json( $result ); } update_option( 'bwfan_show_preview', $post ); BWFAN_Merge_Tag_Loader::set_data( array( 'is_preview' => true, ) ); $post['event_data']['event_slug'] = $post['event']; $action_object = BWFAN_Core()->integration->get_action( 'pabbly_send_data' ); $action_object->is_preview = true; $data_to_set = array(); $fields = array_map( 'stripslashes', $post['data']['custom_fields']['field'] ); $fields_value = array_map( 'stripslashes', $post['data']['custom_fields']['field_value'] ); $custom_fields = array(); foreach ( $fields as $key1 => $field_id ) { $custom_fields[ $field_id ] = BWFAN_Common::decode_merge_tags( $fields_value[ $key1 ] ); } $data_to_set['custom_fields'] = $custom_fields; $data_to_set['url'] = BWFAN_Common::decode_merge_tags( $post['data']['url'] ); $data_to_set['test'] = true; $action_object->set_data( $data_to_set ); $response = $action_object->process(); if ( false !== $response ) { $result['msg'] = __( 'Test Data sent to Pabbly.', 'wp-marketing-automations-pro' ); $result['status'] = true; } //phpcs:enable WordPress.Security.NonceVerification wp_send_json( $result ); } public static function five_minute_worker_cb() { /** v1 automations */ $active_automations = BWFAN_Core()->automations->get_active_automations( 1 ); if ( is_array( $active_automations ) && 0 < count( $active_automations ) ) { do_action( 'bwfan_5_min_action', $active_automations ); } /** v2 automations */ $active_automations = BWFAN_Core()->automations->get_active_automations( 2 ); if ( is_array( $active_automations ) && 0 < count( $active_automations ) ) { do_action( 'bwfan_5_min_action', $active_automations ); } } /** * Passing language as a param in sync call for every event * Used in order status pending event - get_event_data() as well * * @param $data * * @return mixed * @throws Exception */ public static function passing_event_language( $data ) { /** checking for wpml plugin **/ if ( defined( 'ICL_SITEPRESS_VERSION' ) && defined( 'ICL_LANGUAGE_CODE' ) ) { $lang = ICL_LANGUAGE_CODE; /** get order language in case order id set in the data */ if ( ! empty( $data['order_id'] ) ) { $order = wc_get_order( $data['order_id'] ); $order_language = $order instanceof WC_Order ? $order->get_meta( 'wpml_language' ) : ''; if ( ! empty( $order_language ) ) { $lang = $order_language; } } $data['language'] = $lang; return $data; } /** checking for polylang plugin **/ if ( function_exists( 'pll_current_language' ) && function_exists( 'pll_get_post_language' ) ) { $lang = pll_current_language(); /** get order language in case order id set in the data */ if ( ! empty( $data['order_id'] ) ) { $order_language = pll_get_post_language( $data['order_id'] ); if ( ! empty( $order_language ) ) { $lang = $order_language; } } $data['language'] = $lang; return $data; } /** checking for translate press **/ if ( bwfan_is_translatepress_active() ) { $data['language'] = get_locale(); return $data; } /** checking for weglot plugin */ if ( defined( 'BWFAN_VERSION' ) && version_compare( BWFAN_VERSION, '2.0.2', '>' ) && bwfan_is_weglot_active() ) { $data['language'] = weglot_get_current_language(); if ( ! isset( $data['order_id'] ) || empty( $data['order_id'] ) ) { return $data; } $order = wc_get_order( $data['order_id'] ); $order_language = $order instanceof WC_Order ? $order->get_meta( 'weglot_language' ) : ''; $weglot_language_option = self::get_weglot_language_option(); if ( ! array_key_exists( $order_language, $weglot_language_option ) ) { return $data; } $data['language'] = $order_language; return $data; } /** checking for gtranslate plugin */ if ( function_exists( 'bwfan_is_gtranslate_active' ) && bwfan_is_gtranslate_active() ) { $data['language'] = BWFAN_Compatibility_With_GTRANSLATE::get_gtranslate_language(); return $data; } return $data; } /** * Weglot language options * * @return array * @throws Exception */ public static function get_weglot_language_option() { $data = Context_Weglot::weglot_get_context()->get_service( 'Language_Service_Weglot' )->get_original_and_destination_languages(); $weglot_language = array(); foreach ( $data as $lang_key => $lang ) { if ( ! $lang instanceof Weglot\Client\Api\LanguageEntry ) { continue; } $weglot_language[ $lang->getInternalCode() ] = $lang->getLocalName(); } return $weglot_language; } /** * Populate cart from order id * * @throws Exception */ public static function bwfan_populate_cart_from_order() { if ( ! bwfan_is_woocommerce_active() ) { return; } global $woocommerce; if ( ! isset( $_GET['bwfan-order-again'] ) || empty( $_GET['bwfan-order-again'] ) ) { return; } /** * Handling for older users * @todo will remove numeric handling in 3.1 */ $order_id = $_GET['bwfan-order-again']; /** Check for order */ if ( ! is_numeric( $order_id ) ) { /** Order key */ $order_id = wc_get_order_id_by_order_key( $order_id ); } $order = wc_get_order( $order_id ); if ( ! $order instanceof WC_Order || ! $order->has_status( apply_filters( 'woocommerce_valid_order_statuses_for_order_again', array( 'completed', 'processing' ) ) ) ) { return; } /** empty cart **/ $woocommerce->cart->empty_cart(); $order_items = $order->get_items(); if ( ! is_array( $order_items ) || 0 === count( $order_items ) ) { return; } foreach ( $order_items as $item ) { if ( ! $item instanceof WC_Order_Item_Product ) { continue; } $product_id = (int) apply_filters( 'woocommerce_add_to_cart_product_id', $item->get_product_id() ); $quantity = $item->get_quantity(); $variation_id = (int) $item->get_variation_id(); $variations = array(); $cart_item_data = apply_filters( 'woocommerce_order_again_cart_item_data', array(), $item, $order ); $product = $item->get_product(); if ( ! $product instanceof WC_Product ) { continue; } /** Prevent reordering variable products if no selected variation */ if ( ! $variation_id && $product->is_type( 'variable' ) ) { continue; } /** Prevent reordering items specifically out of stock */ if ( ! $product->is_in_stock() ) { continue; } foreach ( $item->get_meta_data() as $meta ) { if ( taxonomy_is_product_attribute( $meta->key ) ) { $term = get_term_by( 'slug', $meta->value, $meta->key ); $variations[ $meta->key ] = $term ? $term->name : $meta->value; } elseif ( meta_is_product_attribute( $meta->key, $meta->value, $product_id ) ) { $variations[ $meta->key ] = $meta->value; } } if ( ! apply_filters( 'woocommerce_add_to_cart_validation', true, $product_id, $quantity, $variation_id, $variations, $cart_item_data ) ) { continue; } /** Add to cart directly */ WC()->cart->add_to_cart( $product_id, $quantity, $variation_id, $variations, $cart_item_data ); } /** Clear show notices for added coupons or products */ if ( ! is_null( WC()->session ) ) { WC()->session->set( 'wc_notices', array() ); } } public static function get_bwf_customer_by_email( $email ) { $bwf_contact = self::get_bwf_contact_by_email( $email ); if ( ! $bwf_contact instanceof WooFunnels_Contact ) { return false; } $customer = new WooFunnels_Customer( $bwf_contact ); if ( ! isset( $customer->id ) || ! $customer->id > 0 ) { return false; } return $customer; } public static function get_bwf_contact_by_email( $email ) { $contact = self::get_contact_by_email( $email ); if ( ! isset( $contact->wpid ) ) { return false; } $bwf_contact = bwf_get_contact( $contact->wpid, $email ); if ( $bwf_contact instanceof WooFunnels_Customer ) { return $bwf_contact->contact; } if ( $bwf_contact instanceof WooFunnels_Contact ) { return $bwf_contact; } return false; } public static function get_contact_by_email( $email ) { if ( ! is_email( $email ) || ! class_exists( 'WooFunnels_DB_Operations' ) ) { return false; } $contact_db = WooFunnels_DB_Operations::get_instance(); $contact_obj = $contact_db->get_contact_by_email( $email ); if ( ! isset( $contact_obj->id ) || ! $contact_obj->id > 0 ) { return false; } return $contact_obj; } public static function get_contact_meta( $contact_id, $key = '' ) { $contact_id = absint( $contact_id ); if ( ! $contact_id > 0 ) { return false; } $contact_db = WooFunnels_DB_Operations::get_instance(); $contact_meta = $contact_db->get_contact_metadata( $contact_id ); if ( ! is_array( $contact_meta ) || empty( $contact_meta ) ) { return false; } $contact_meta_array = array(); foreach ( $contact_meta as $meta ) { $contact_meta_array[ $meta->meta_key ] = maybe_unserialize( $meta->meta_value ); } if ( empty( $key ) ) { return $contact_meta_array; } if ( ! isset( $contact_meta_array[ $key ] ) ) { return false; } return $contact_meta_array[ $key ]; } public static function insert_default_crm_fields() { global $wpdb; $crm_fields_table = $wpdb->prefix . 'bwfan_fields'; $default_fields = self::$crm_default_fields; $db_errors = []; foreach ( $default_fields as $field => $field_data ) { $already_exist = self::check_field_exist( $field ); if ( $already_exist ) { continue; } $data = [ 'name' => $field_data['name'], 'slug' => $field, 'type' => $field_data['type'], 'gid' => 0, 'meta' => wp_json_encode( $field_data['meta'] ), 'mode' => $field_data['mode'], 'vmode' => $field_data['vmode'], 'view' => $field_data['view'], 'search' => 1, 'created_at' => current_time( 'mysql', 1 ), ]; $wpdb->insert( $crm_fields_table, $data ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery $field_id = $wpdb->insert_id; if ( ! empty( $wpdb->last_error ) ) { $db_errors[] = 'Error in default field creation: ' . $field_data['name'] . ' ' . $wpdb->last_error; } /** Check field column exist in contact_fields table **/ $exists = BWF_Model_Contact_Fields::column_already_exists( $field_id ); if ( empty( $exists ) ) { $column_added = BWF_Model_Contact_Fields::add_column_field( $field_id, 1 ); /** If column not added */ if ( true !== $column_added ) { BWFAN_Model_Fields::delete( $field_id ); $db_errors[] = 'Error in contact field column creation: ' . $column_added; } } } /** Log if any mysql errors */ if ( ! empty( $db_errors ) ) { BWFAN_PRO_Common::log_test_data( array_merge( [ __FUNCTION__ ], $db_errors ), 'field-creation-error' ); } } /** * Checking if field with slug exists or not * * @param $slug * * @return bool */ public static function check_field_exist( $slug ) { global $wpdb; $query = $wpdb->prepare( "SELECT `ID` FROM `{$wpdb->prefix}bwfan_fields` WHERE `slug` = %s LIMIT 0, 1", $slug ); $result = $wpdb->get_var( $query ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching return ! empty( $result ); } /** * */ public static function bwfan_added_pro_tables( $tables ) { global $wpdb; $tables[] = $wpdb->prefix . 'bwfan_engagement_tracking'; $tables[] = $wpdb->prefix . 'bwfan_engagement_trackingmeta'; $tables[] = $wpdb->prefix . 'bwfan_conversions'; $tables[] = $wpdb->prefix . 'bwfan_templates'; $tables[] = $wpdb->prefix . 'bwfan_terms'; $tables[] = $wpdb->prefix . 'bwfan_fields'; $tables[] = $wpdb->prefix . 'bwfan_field_groups'; $tables[] = $wpdb->prefix . 'bwfan_contact_note'; $tables[] = $wpdb->prefix . 'bwfan_import_export'; $tables[] = $wpdb->prefix . 'bwfan_broadcast'; $tables[] = $wpdb->prefix . 'bwf_contact_fields'; $tables[] = $wpdb->prefix . 'bwfan_form_feeds'; $tables[] = $wpdb->prefix . 'bwfan_message'; return $tables; } /** * Getting contact id from phone number * * @param $phone * * @return int */ public static function get_contact_id_by_phone( $phone ) { global $wpdb; $query = "SELECT `id` FROM `{$wpdb->prefix}bwf_contact` WHERE RIGHT(contact_no,10) = '" . $phone . "' ORDER BY `id` DESC LIMIT 0,1"; $cid = $wpdb->get_var( $query ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching return empty( $cid ) ? 0 : intval( $cid ); } /** * Get paid orders count * * @param $renewal_orders * * @return int */ public static function get_paid_orders_count( $renewal_orders ) { if ( method_exists( 'BWFAN_Common', 'get_paid_orders_count' ) ) { return BWFAN_Common::get_paid_orders_count( $renewal_orders ); } if ( empty( $renewal_orders ) ) { return 0; } $paid_statuses = wc_get_is_paid_statuses(); if ( empty( $paid_statuses ) ) { return 0; } $orders = array_filter( $renewal_orders, function ( $order_id ) use ( $paid_statuses ) { $order = wc_get_order( $order_id ); return ( $order instanceof WC_ORDER && $order->has_status( $paid_statuses ) ); } ); return count( $orders ); } public static function bwfan_delete_invalid_conversions() { if ( ! function_exists( 'wc_get_order' ) ) { delete_option( 'bwfan_db_1_3_3_options' ); bwf_unschedule_actions( 'bwfan_check_conversion_validity' ); return; } $last_conversion_id = get_option( 'bwfan_db_1_3_3_options' ); if ( ! is_array( $last_conversion_id ) || empty( $last_conversion_id ) ) { delete_option( 'bwfan_db_1_3_3_options' ); bwf_unschedule_actions( 'bwfan_check_conversion_validity' ); return; } $last_conversion_id = absint( $last_conversion_id['last_conversion_id'] ); $conversions = BWFAN_Model_Conversions::get_conversions_for_check_validity( absint( $last_conversion_id ) ); if ( empty( $conversions ) ) { delete_option( 'bwfan_db_1_3_3_options' ); bwf_unschedule_actions( 'bwfan_check_conversion_validity' ); return; } $start_time = time(); foreach ( $conversions as $index => $conversion ) { $order = wc_get_order( $conversion['wcid'] ); if ( ! $order instanceof WC_Order || ! in_array( $order->get_status(), wc_get_is_paid_statuses() ) || 'trash' === get_post_status( $order->get_id() ) ) { BWFAN_Model_Conversions::delete( $conversion['ID'] ); } if ( ! isset( $conversions[ $index + 1 ] ) ) { delete_option( 'bwfan_db_1_3_3_options' ); bwf_unschedule_actions( 'bwfan_check_conversion_validity' ); break; } $next_conversion = $conversions[ $index + 1 ]; update_option( 'bwfan_db_1_3_3_options', [ 'last_conversion_id' => $next_conversion['ID'] ], false ); if ( ( time() - $start_time ) >= 30 || BWFCRM_Common::memory_exceeded() ) { break; } } } public static function remove_actions( $hook, $cls, $function = '' ) { global $wp_filter; $object = null; if ( class_exists( $cls ) && isset( $wp_filter[ $hook ] ) && ( $wp_filter[ $hook ] instanceof WP_Hook ) ) { $hooks = $wp_filter[ $hook ]->callbacks; foreach ( $hooks as $priority => $reference ) { if ( is_array( $reference ) && count( $reference ) > 0 ) { foreach ( $reference as $index => $calls ) { if ( isset( $calls['function'] ) && is_array( $calls['function'] ) && count( $calls['function'] ) > 0 ) { if ( is_object( $calls['function'][0] ) ) { $cls_name = get_class( $calls['function'][0] ); if ( $cls_name == $cls && $calls['function'][1] == $function ) { $object = $calls['function'][0]; unset( $wp_filter[ $hook ]->callbacks[ $priority ][ $index ] ); } } elseif ( $index == $cls . '::' . $function ) { // For Static Classess $object = $cls; unset( $wp_filter[ $hook ]->callbacks[ $priority ][ $cls . '::' . $function ] ); } } } } } } elseif ( function_exists( $cls ) && isset( $wp_filter[ $hook ] ) && ( $wp_filter[ $hook ] instanceof WP_Hook ) ) { $hooks = $wp_filter[ $hook ]->callbacks; foreach ( $hooks as $priority => $reference ) { if ( is_array( $reference ) && count( $reference ) > 0 ) { foreach ( $reference as $index => $calls ) { $remove = false; if ( $index == $cls ) { $remove = true; } elseif ( isset( $calls['function'] ) && $cls == $calls['function'] ) { $remove = true; } if ( true == $remove ) { unset( $wp_filter[ $hook ]->callbacks[ $priority ][ $cls ] ); } } } } } return $object; } /** * Get the complete phone number of a contact with a country code * * @param $contact_obj WooFunnels_Contact * * @return mixed|string|void */ public static function get_contact_full_number( $contact_obj ) { if ( ! $contact_obj instanceof WooFunnels_Contact || 0 === absint( $contact_obj->get_id() ) ) { return ''; } $phone = $contact_obj->get_contact_no(); if ( empty( $phone ) ) { return ''; } $country = $contact_obj->get_country(); if ( ! empty( $country ) ) { $phone = BWFAN_Phone_Numbers::add_country_code( $phone, $country ); } return $phone; } public static function get_tags( $searched_term ) { if ( ! class_exists( 'BWFCRM_Tag' ) ) { return []; } $tag_data = BWFCRM_Tag::get_tags( [], $searched_term ); return self::prepare_data( $tag_data, 'tag' ); } public static function prepare_data( $data, $type ) { $results = []; $results[] = [ 'id' => 'any', 'text' => 'Any ' . $type ]; foreach ( $data as $tag ) { $results[] = array( 'id' => $tag['ID'], 'text' => $tag['name'], ); } return $results; } public static function get_lists( $searched_term ) { if ( ! class_exists( 'BWFCRM_Lists' ) ) { return []; } $tag_data = BWFCRM_Lists::get_lists( [], $searched_term ); return self::prepare_data( $tag_data, 'list' ); } public static function get_contact_data_counts( $exclude_unsubs = false ) { $bulk_actions_count = BWFAN_Model_Bulk_Action::get_bulk_actions_total_count( false ); $bulk_actions_all_count = isset( $bulk_actions_count['all'] ) ? $bulk_actions_count['all'] : 0; $bulk_actions_active_count = isset( $bulk_actions_count['1'] ) ? $bulk_actions_count['1'] : 0; return [ 'contacts_contacts' => 0, 'contacts_manage_audiences' => 0, 'contacts_manage_fields' => 0, 'contacts_manage_lists' => 0, 'contacts_manage_tags' => 0, 'contacts_bulk_actions' => $bulk_actions_all_count, 'contacts_active_bulk_actions' => $bulk_actions_active_count, ]; } public static function get_broadcast_data_count( $type = '' ) { if ( empty( $type ) ) { return []; } $status_count = BWFAN_Model_Broadcast::get_broadcast_total_count_by_status( $type ); return [ 'broadcasts_email' => 0, 'broadcasts_sms' => 0, 'broadcasts_whatsapp' => 0, 'status_scheduled' => $status_count['2'], 'status_ongoing' => $status_count['3'], 'status_completed' => $status_count['4'], 'status_cancelled' => $status_count['7'], 'status_paused' => intval( $status_count['5'] ) + intval( $status_count['6'] ), 'status_all' => isset( $status_count['status_all'] ) ? $status_count['status_all'] : 0, ]; } /** * Get form count by status * * @return array */ public static function get_forms_data_count() { $count = BWFAN_Model_Form_Feeds::get_forms_total_count(); return [ 'forms_all' => $count['all'], 'forms_draft' => $count['1'], 'forms_active' => $count['2'], 'forms_inactive' => $count['3'], ]; } /** * Return link trigger count array with status * * @return array */ public static function get_link_triggers_data_count() { $count = BWFAN_Model_Link_Triggers::get_link_triggers_total_count(); return [ 'link-triggers_all' => $count['all'], 'link-triggers_draft' => $count['0'], 'link-triggers_inactive' => $count['1'], 'link-triggers_active' => $count['2'], ]; } /** * Return bulk action count array with status * * @return array */ public static function get_bulk_actions_data_count() { $count = BWFAN_Model_Bulk_Action::get_bulk_actions_total_count(); return [ 'all' => $count['all'], 'draft' => $count['0'], 'ongoing' => $count['1'], 'completed' => $count['2'], 'paused' => $count['3'], ]; } /** * Returns country iso code * * @param $country * * @return string */ public static function get_country_iso_code( $country ) { $country = strtolower( $country ); $countries = self::get_countries_data(); $countries_iso = array_keys( $countries ); $countries_iso = array_map( function ( $j ) { return strtolower( $j ); }, $countries_iso ); if ( in_array( $country, $countries_iso, true ) ) { /** Country found */ return strtoupper( $country ); } /** Country array with 2 digit key and lower names as value */ $countries_lower = array_map( function ( $j ) { return strtolower( $j ); }, $countries ); if ( in_array( $country, $countries_lower, true ) ) { /** Country found */ $index = array_search( $country, $countries_lower ); return strtoupper( $index ); } return ''; } /** countries data * @return mixed|null */ public static function get_countries_data() { $countries_json = file_get_contents( BWFAN_PRO_PLUGIN_DIR . '/includes/countries.json' ); $countries = json_decode( $countries_json, true ); return $countries; } public static function get_country_name( $country_code ) { $country_code = strtoupper( $country_code ); $countries = self::get_countries_data(); if ( isset( $countries[ $country_code ] ) ) { return $countries[ $country_code ]; } return $country_code; } /** * @param $global_data * * @return int */ public static function maybe_get_user_id_from_task_meta( $task_meta ) { /** Get User ID */ if ( isset( $task_meta['user_id'] ) && ! empty( $task_meta['user_id'] ) ) { return $task_meta['user_id']; } /** Get User ID by Email */ if ( isset( $task_meta['email'] ) && is_email( $task_meta['email'] ) ) { $email = $task_meta['email']; /** Check if User exists by this email */ $user_data = get_user_by( 'email', $email ); if ( $user_data instanceof WP_User ) { return $user_data->ID; } /** Create user if not exists, and email exists and valid */ $user_id = wp_create_user( $email, wp_generate_password(), $email ); if ( ! is_wp_error( $user_id ) ) { return $user_id; } } /** get user id from the contact if wpid available */ if ( isset( $task_meta['contact_id'] ) && ! empty( $task_meta['contact_id'] ) ) { $contact = new BWFCRM_Contact( $task_meta['contact_id'] ); if ( ! $contact->is_contact_exists() ) { return false; } $user_id = $contact->contact->get_wpid(); if ( ! empty( $user_id ) ) { return $user_id; } /*** if still user id not associate with contact then get using the contact email */ $contact_email = $contact->contact->get_email(); $user_data = get_user_by( 'email', $contact_email ); if ( $user_data instanceof WP_User && ! empty( $user_data->ID ) ) { return $user_data->ID; } /** if still user not exists with the contact email then create the user and bind with contact */ $password = wp_generate_password(); $user_id = wp_create_user( $contact_email, $password, $contact_email ); /** if error in user_id then return blank */ if ( is_wp_error( $user_id ) ) { return false; } /** create display name using first name and appending lastname to it if available*/ $display_name = trim( $contact->contact->get_f_name() ); $display_name = empty( $display_name ) ? trim( $contact->contact->get_l_name() ) : $display_name . ' ' . trim( $contact->contact->get_l_name() );; if ( ! empty( trim( $display_name ) ) ) { wp_update_user( array( 'ID' => $user_id, 'display_name' => trim( $display_name ) ) ); } $user = new WP_User( $user_id ); $user->set_role( 'subscriber' ); $user_first_name = trim( $contact->contact->get_f_name() ); $user_last_name = trim( $contact->contact->get_l_name() ); $nickname = trim( $user_first_name ); ! empty( $user_first_name ) && update_user_meta( $user_id, 'first_name', $user_first_name ); ! empty( $user_last_name ) && update_user_meta( $user_id, 'last_name', $user_last_name ); ! empty( $nickname ) && update_user_meta( $user_id, 'nickname', $nickname ); $contact->contact->set_wpid( $user_id ); $contact->contact->save(); $contact->contact->update_meta( 'bwfan_userpassword', $password ); return $user_id; } return false; } /** return links triggers on searching in automations */ public static function get_link_triggers( $searched_term ) { if ( ! class_exists( 'BWFAN_Model_Link_Triggers' ) ) { return []; } $link_data = BWFAN_Model_Link_Triggers::get_link_triggers( $searched_term, '', 10, 0 ); if ( ! isset( $link_data['links'] ) || empty( $link_data['links'] ) ) { return []; } $link = array(); foreach ( $link_data['links'] as $link_index => $links ) { $link[ $link_index ]['id'] = $links['ID']; $link[ $link_index ]['text'] = $links['title']; } return $link; } /** * Add UTM parameters in test email or sms for broadcast * * @param $body * @param $args * * @return array|mixed|string|string[]|null */ public static function add_test_broadcast_utm_params( $body, $args, $mode = 'email' ) { $utm_data = array(); /** Normalise Data */ if ( isset( $args['utmContent'] ) ) { $utm_data['utm_content'] = $args['utmContent']; } if ( isset( $args['utmMedium'] ) ) { $utm_data['utm_medium'] = $args['utmMedium']; } if ( isset( $args['utmName'] ) ) { $utm_data['utm_name'] = $args['utmName']; } if ( isset( $args['utmSource'] ) ) { $utm_data['utm_source'] = $args['utmSource']; } if ( isset( $args['utmTerm'] ) ) { $utm_data['utm_term'] = $args['utmTerm']; } if ( empty( $utm_data ) ) { return $body; } /** Add flag to append UTM Params */ $utm_data['append_utm'] = 1; $ins = BWFAN_UTM_Tracking::get_instance(); return $ins->maybe_add_utm_parameters( $body, $utm_data, $mode ); } /** * Get customer past purchased product by email and time * * @param $current_time * @param $email * * @return array */ public static function get_customer_past_purchased_product( $current_time, $email ) { global $wpdb; $email = trim( $email ); if ( empty( $email ) ) { return []; } $current_time = empty( $current_time ) ? current_time( 'mysql' ) : $current_time; $query = $wpdb->prepare( "SELECT p.product_id FROM `{$wpdb->prefix}wc_order_product_lookup` AS `p` INNER JOIN `{$wpdb->prefix}wc_customer_lookup` AS `c` ON c.customer_id = p.customer_id WHERE p.`date_created` < %s AND c.email = %s GROUP BY p.product_id", $current_time, $email ); $result = $wpdb->get_results( $query, ARRAY_A ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching if ( empty( $result ) ) { return []; } return array_map( function ( $row ) { return $row['product_id']; }, $result ); } /** * Return regex pattern * * @param int $type * * @return string */ public static function get_regex_pattern( $type = 1 ) { $type = (int) $type; switch ( $type ) { case 1: /** * [0] => href='https://google.com/?abcd=ss&utm_content=source' * [1] => https://google.com/?abcd=ss&utm_content=source */ return '/href=["\']?([^"\'>]+)["\']?/'; case 2: /** * [0] => */ return '/]+href=[^>]+>/i'; case 3: /** * [0] => https://... */ return '#\bhttps?://[^,\s()<>]+(?:\([\w\d]+\)|([^,[:punct:]\s]|/))#'; default: return ''; } } /** * v2 Method: Prepared options for field schema * * @param $options * * @return array */ public static function prepared_field_options( $options ) { if ( ! is_array( $options ) || empty( $options ) ) { return []; } $prepared_options = array_map( function ( $label, $value ) { return array( 'label' => $label, 'value' => $value, ); }, $options, array_keys( $options ) ); return $prepared_options; } public static function encrypt_32_bit_string( $str ) { if ( empty( $str ) ) { return ''; } $r = strrev( $str ); $n = []; for ( $i = 0; $i < strlen( $r ); $i ++ ) { $n[] = wp_rand( '0', '9' ) . $r[ $i ]; } return implode( '', $n ); } /** * For AffiliateWP * * @param $user_id * * @return string|null */ public static function get_aff_id_by_user_id( $user_id ) { if ( 0 === absint( $user_id ) ) { return 0; } global $wpdb; $sql = $wpdb->prepare( "SELECT `affiliate_id` FROM {$wpdb->prefix}affiliate_wp_affiliates WHERE `user_id` = %d", $user_id ); return $wpdb->get_var( $sql ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching } /** * Search string from given array * * @param $data * @param $search * * @return array */ public static function search_srting_from_data( $data, $search ) { if ( empty( $data ) || ! is_array( $data ) ) { return []; } if ( empty( $search ) ) { return $data; } return array_filter( $data, function ( $post ) use ( $search ) { return false !== strpos( strtolower( $post ), strtolower( $search ) ); } ); } /** * Get or create Tag/List if not exists * * @param $terms * @param $type * * @return array */ public static function get_or_create_terms( $terms, $type ) { $terms = array_map( function ( $term ) { if ( isset( $term['name'] ) ) { $term['value'] = $term['name']; } return $term; }, $terms ); $terms = BWFCRM_Term::get_or_create_terms( $terms, $type, true ); /**Prepared Data */ $terms = array_map( function ( $term ) { $term_data = []; $term_data['id'] = $term->get_id(); $term_data['name'] = $term->get_name(); return $term_data; }, $terms ); return $terms; } /** * Get broadcasts id and name * * @param $term * * @return array */ public static function get_broadcasts_by_term( $term ) { $broadcasts = BWFAN_Model_Broadcast::get_broadcasts_titles( $term ); if ( empty( $broadcasts ) ) { return []; } $arr = array(); foreach ( $broadcasts as $campaigns ) { $arr[ $campaigns['id'] ] = $campaigns['title']; } return $arr; } public static function get_contacts_from_broadcast( $bid, $column = '' ) { global $wpdb; $sql = "SELECT DISTINCT c.id FROM {$wpdb->prefix}bwf_contact as c LEFT JOIN {$wpdb->prefix}bwf_wc_customers as wc ON c.id = wc.cid LEFT JOIN {$wpdb->prefix}bwfan_engagement_tracking as et ON c.id=et.cid"; $where = " WHERE ( c.email != '' AND c.email IS NOT NULL )"; if ( empty( $column ) ) { $where .= " AND ( et.c_status=2 AND et.type = 2 AND et.oid = '$bid')"; } else { $where .= " AND ( et.$column>0 AND et.c_status=2 AND et.type = 2 AND et.oid = '$bid')"; } $sql = $sql . $where; return $wpdb->get_results( $sql, ARRAY_A ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching } public static function get_engaged_or_unengaged_data_count( $where_query, $contact_id ) { global $wpdb; $sql = "SELECT DISTINCT COUNT(c.id) FROM {$wpdb->prefix}bwf_contact as c LEFT JOIN {$wpdb->prefix}bwf_wc_customers as wc ON c.id = wc.cid LEFT JOIN {$wpdb->prefix}bwf_contact_fields as cm ON c.id=cm.cid"; $where = " WHERE ( c.email != '' AND c.email IS NOT NULL )"; $where .= $where_query; $where .= " AND c.id='$contact_id'"; $sql = $sql . $where; return $wpdb->get_var( $sql ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching } public static function get_skip_conversion_automations() { global $wpdb; $skip_events = apply_filters( 'bwfan_skip_conversion_automations', [ 'wcs_before_renewal' ] ); /** Create string placeholder */ $placeholder = array_fill( 0, count( $skip_events ), '%s' ); $placeholder = implode( ", ", $placeholder ); $query = $wpdb->prepare( "SELECT `ID` FROM {$wpdb->prefix}bwfan_automations WHERE 1 = 1 AND `event` IN ($placeholder) ", $skip_events ); $query_res = $wpdb->get_results( $query, ARRAY_A ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching if ( empty( $query_res ) ) { return []; } return array_column( $query_res, 'ID' ); } /** * Get quiz data on search for learndash event * * @param $searched_term * * @return mixed */ public static function get_quizzes( $searched_term ) { $results = array(); $query_params = array( 'post_type' => 'sfwd-quiz', 'post_status' => 'publish', ); if ( '' !== $searched_term ) { $query_params['s'] = $searched_term; } $query = new WP_Query( $query_params ); if ( $query->found_posts > 0 ) { foreach ( $query->posts as $post ) { $results[] = array( 'id' => $post->ID, 'text' => $post->post_title, ); } } return $results; } /** * Excluding the automation which have failed to match the event settings as we have bulk actions as well. * * @param $event_slug * @param $automation_id * @param $v * * @return void */ public static function exclude_invalid_automation( $event_slug, $automation_id, $v ) { // return if any of following data missing if ( empty( $v ) || empty( $event_slug ) || empty( $automation_id ) ) { return; } // unset automation from v1 automations if ( 'v1' === $v ) { if ( isset( BWFAN_Core()->public->active_automations[ $event_slug ] ) && isset( BWFAN_Core()->public->active_automations[ $event_slug ][ $event_slug ][ $automation_id ] ) ) { unset( BWFAN_Core()->public->active_automations[ $event_slug ][ $event_slug ][ $automation_id ] ); } } // unset automation from v2 automations if ( 'v2' === $v ) { if ( isset( BWFAN_Core()->public->active_v2_automations[ $event_slug ][ $event_slug ][ $automation_id ] ) ) { unset( BWFAN_Core()->public->active_v2_automations[ $event_slug ][ $event_slug ][ $automation_id ] ); } } } /** * Create or update contact on form submit event * * @param $automation_data */ public static function maybe_create_update_contact( $automation_data ) { if ( empty( $automation_data ) ) { return; } $email = $automation_data['email']; if ( ! is_email( trim( $email ) ) ) { return; } $contact = new WooFunnels_Contact( '', $email, '', '', '' ); $args = []; if ( isset( $automation_data['first_name'] ) && ! empty( $automation_data['first_name'] ) ) { $args['f_name'] = $automation_data['first_name']; } if ( isset( $automation_data['last_name'] ) && ! empty( $automation_data['last_name'] ) ) { $args['l_name'] = $automation_data['last_name']; } if ( isset( $automation_data['contact_phone'] ) && ! empty( $automation_data['contact_phone'] ) ) { $args['contact_no'] = $automation_data['contact_phone']; } if ( isset( $automation_data['mark_contact_subscribed'] ) && 1 === absint( $automation_data['mark_contact_subscribed'] ) ) { $args['status'] = 1; } /** checking if contact not exists than create otherwise update */ if ( ! $contact instanceof WooFunnels_Contact || 0 === absint( $contact->get_id() ) ) { $bwfcrm_contact = new BWFCRM_Contact( $email, true, $args ); } else { // update first_name, last_name, phone and status $bwfcrm_contact = new BWFCRM_Contact( $contact, false, $args ); $bwfcrm_contact->update( $args ); if ( isset( $automation_data['mark_contact_subscribed'] ) && 1 === absint( $automation_data['mark_contact_subscribed'] ) ) { $bwfcrm_contact->resubscribe(); } } } public static function get_emails_by_subject_in_data( $subject, $v ) { global $wpdb; $sql = "SELECT `auto_step`.*,`auto_m`.`title` FROM {$wpdb->prefix}bwfan_automation_step AS `auto_step` JOIN {$wpdb->prefix}bwfan_automations as `auto_m` ON `auto_step`.`aid`=`auto_m`.`ID` WHERE `auto_step`.`action` LIKE '%s' && `auto_step`.`data` LIKE '%s' && `auto_step`.`status`=1 && `auto_m`.`v`='%d'"; $prepared_sql = $wpdb->prepare( $sql, '%wp_sendemail%', '%' . $subject . '%', $v ); $emails = $wpdb->get_results( $prepared_sql, ARRAY_A ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching $final_array = []; foreach ( $emails as $email ) { $return = array(); $data = json_decode( $email['data'], true ); $db_subject = isset( $data['sidebarData']['bwfan_email_data'] ) && isset( $data['sidebarData']['bwfan_email_data']['subject'] ) ? $data['sidebarData']['bwfan_email_data']['subject'] : ''; $return['id'] = $email['ID']; $return['name'] = $db_subject; $return['title'] = $email['title']; $final_array[] = $return; } return $final_array; } public static function get_contacts_engagement( $cid, $step_ids, $mode, $type ) { global $wpdb; $step_id = array_fill( 0, count( $step_ids ), '%d' ); $format_step_ids = implode( ', ', $step_id ); $sql = "SELECT * FROM {$wpdb->prefix}bwfan_engagement_tracking WHERE `cid`='%d' && `mode`='%d' && `type`='%d' && `sid` IN ({$format_step_ids}) && `open` >0"; $params = array( $cid, $mode, $type ); $params = array_merge( $params, $step_ids ); $prepared_sql = $wpdb->prepare( $sql, $params ); return $wpdb->get_results( $prepared_sql, ARRAY_A ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching } public static function get_sorted_fields( $fields ) { $sort_format = get_option( 'bwf_crm_field_sort', array() ); if ( empty( $sort_format ) ) { return $fields; } $data = []; foreach ( $sort_format as $sort_data ) { if ( ! isset( $sort_data['fields'] ) ) { continue; } foreach ( $sort_data['fields'] as $field_id ) { if ( ! isset( $fields[ $field_id ] ) ) { continue; } $data[ $field_id ] = $fields[ $field_id ]; } } /** Get newly added fields */ $field_keys = array_keys( $fields ); $data_keys = array_keys( $data ); $new_fields = array_diff( $field_keys, $data_keys ); if ( 0 === count( $new_fields ) ) { return $data; } foreach ( $new_fields as $field_id ) { $data[ $field_id ] = $fields[ $field_id ]; } return $data; } /** * Get Contact id from contact object * * @param $email * @param $user_id * @param $phone * * @return int */ public static function get_cid_from_contact( $email = '', $user_id = 0, $phone = '' ) { if ( empty( $email ) && empty( $user_id ) && empty( $phone ) ) { return 0; } $contact = new WooFunnels_Contact( $user_id, $email, $phone ); if ( $contact->get_id() > 0 ) { return $contact->get_id(); } return 0; } /** * Aman testing purpose only * * @param $data * @param $file * @param $force * * @return void */ public static function log_test_data( $data, $file = 'v2-automations', $force = false ) { if ( empty( $data ) ) { return; } if ( true === $force ) { add_filter( 'bwfan_before_making_logs', '__return_true' ); } if ( is_array( $data ) ) { BWFAN_Core()->logger->log( print_r( $data, true ), $file ); return; } BWFAN_Core()->logger->log( $data, $file ); } /** check order contains subscriptions */ public static function order_contains_subscriptions( $order_id ) { if ( empty( $order_id ) ) { return false; } if ( ! bwfan_is_woocommerce_subscriptions_active() || ! function_exists( 'wcs_order_contains_subscription' ) ) { return false; } $order_contain_subscription = wcs_order_contains_subscription( $order_id ); if ( ! $order_contain_subscription ) { return false; } $order_subscriptions = wcs_get_subscriptions_for_order( $order_id ); if ( empty( $order_subscriptions ) || ! is_array( $order_subscriptions ) ) { return false; } return $order_subscriptions; } /** * Save email template in v1 automation * @return void */ public static function bwf_save_email_template() { BWFAN_PRO_Common::nocache_headers(); BWFAN_Common::check_nonce(); // phpcs:disable WordPress.Security.NonceVerification $post_data = $_POST; $mode_type = [ 'raw_template' => 1, 'raw' => 3, 'editor' => 4, ]; $template = ''; $error = ''; $title = isset( $post_data['title'] ) ? $post_data['title'] : ''; /** Check for template name */ if ( empty( $title ) ) { $error = __( 'Name is required', 'wp-marketing-automations-pro' ); } $data = isset( $post_data['data'] ) ? $post_data['data'] : []; $subject = isset( $data['subject'] ) ? $data['subject'] : ''; /** Check for template subject */ if ( empty( $subject ) ) { $error = __( 'Subject is required', 'wp-marketing-automations-pro' ); } $mode = isset( $data['template'] ) && isset( $mode_type[ $data['template'] ] ) ? intval( $mode_type[ $data['template'] ] ) : 1; switch ( $mode ) { case 1: $template = isset( $data['body'] ) ? $data['body'] : ''; break; case 3: $template = isset( $data['body_raw'] ) ? $data['body_raw'] : ''; break; case 4: if ( isset( $data['editor'] ) && isset( $data['editor']['body'] ) ) { $template = $data['editor']['body']; } break; } /** Check for template body */ if ( empty( $template ) ) { $error = __( 'Email body is required', 'wp-marketing-automations-pro' ); } if ( ! empty( $error ) ) { wp_send_json( array( 'status' => false, 'msg' => $error, ) ); } $m_data = [ 'preheader' => isset( $data['preheading'] ) ? $data['preheading'] : '', 'utmEnabled' => ( isset( $data['append_utm'] ) && intval( $data['append_utm'] ) === 1 ) ? true : false, 'utm' => [ 'source' => isset( $data['utm_source'] ) ? $data['utm_source'] : '', 'medium' => isset( $data['utm_medium'] ) ? $data['utm_medium'] : '', 'name' => '', 'content' => isset( $data['utm_campaign'] ) ? $data['utm_campaign'] : '', 'term' => isset( $data['utm_term'] ) ? $data['utm_term'] : '', ], ]; if ( isset( $data['editor'] ) && isset( $data['editor']['design'] ) ) { $m_data['design'] = stripslashes( $data['editor']['design'] ); } $create_time = current_time( 'mysql', 1 ); $template_data = [ 'title' => $title, 'template' => stripslashes( $template ), 'subject' => $subject, 'type' => 1, 'mode' => $mode, 'canned' => 1, 'created_at' => $create_time, 'updated_at' => $create_time, 'data' => wp_json_encode( $m_data ), ]; $result = BWFAN_Model_Templates::bwfan_create_new_template( $template_data ); if ( ! $result ) { wp_send_json( array( 'status' => false, 'msg' => __( 'Unable to saved template.', 'wp-marketing-automations-pro' ), ) ); } wp_send_json( array( 'status' => true, 'msg' => __( 'Template saved successfully.', 'wp-marketing-automations-pro' ), ) ); } /** * Get formatted string for mysql query * * @param $value * * @return array|mixed|string|string[] */ public static function get_formatted_value_for_dbquery( $value ) { return ( false !== strpos( $value, "'" ) ) ? str_replace( "'", "\'", $value ) : $value; } /** * Get languages options if any language plugin is activated * * @param $settings * * @return array|mixed * @throws Exception */ public static function get_language_settings( $settings = [] ) { $language_options = []; /** WPML */ if ( function_exists( 'icl_get_languages' ) ) { $languages = icl_get_languages(); if ( ! empty( $languages ) ) { foreach ( $languages as $language ) { $language_options[ $language['language_code'] ] = ! empty( $language['translated_name'] ) ? $language['translated_name'] : $language['native_name']; } } } /** Polylang */ if ( function_exists( 'pll_the_languages' ) ) { try { $languages = pll_the_languages( array( 'raw' => 1, 'hide_if_empty' => 0 ) ); if ( ! empty( $languages ) ) { foreach ( $languages as $language ) { $language_options[ $language['slug'] ] = $language['name']; } } } catch ( Error $e ) { } } /** TranslatePress **/ if ( bwfan_is_translatepress_active() ) { $trp = TRP_Translate_Press::get_trp_instance(); $trp_languages = $trp->get_component( 'languages' ); $trp_languages_array = $trp_languages->get_languages( 'english_name' ); $languages = ! empty( get_option( 'trp_settings' ) ) ? get_option( 'trp_settings' ) : array(); $languages = isset( $languages['translation-languages'] ) ? $languages['translation-languages'] : array(); if ( ! empty( $languages ) ) { foreach ( $languages as $language ) { $language_options[ $language ] = $language; } } $language_options = array_intersect_key( $trp_languages_array, $language_options ); } /** Weglot */ if ( defined( 'BWFAN_VERSION' ) && version_compare( BWFAN_VERSION, '2.0.2', '>' ) && function_exists( 'bwfan_is_weglot_active' ) && bwfan_is_weglot_active() ) { $language_options = BWFAN_PRO_Common::get_weglot_language_option(); } if ( count( $language_options ) > 0 ) { $settings['enable_lang'] = 1; $settings['lang_options'] = $language_options; } return apply_filters( 'bwfan_enable_language_settings', $settings ); } /** * Get all active automation contact rows by contact id and automation id * * @param $automation_id * @param $contact_id * * @return array|object|stdClass[]|null */ public static function get_automation_contact_rows( $automation_id, $contact_id ) { global $wpdb; $table = "{$wpdb->prefix}bwfan_automation_contact"; $query = $wpdb->prepare( 'SELECT * FROM ' . $table . ' WHERE `aid` = %d AND `cid` = %d ORDER BY `ID` ', $automation_id, $contact_id ); return $wpdb->get_results( $query, ARRAY_A ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching } public static function get_midnight_store_time() { $timezone = new DateTimeZone( wp_timezone_string() ); $date = new DateTime(); $date->modify( '+1 days' ); $date->setTimezone( $timezone ); $date->setTime( 0, 0, 0 ); return $date->getTimestamp(); } /** * Checking if any languages enabled * * @return bool * @throws Exception */ public static function is_language_enabled() { $language_data = self::get_language_settings(); if ( ! is_array( $language_data ) ) { return false; } if ( isset( $language_data['enable_lang'] ) && 1 === intval( $language_data['enable_lang'] ) ) { return true; } return false; } /** * Get v2 automations (id and meta) based on the given event slug * * @param $event_slug * * @return array */ public static function get_all_automations_by_slug( $event_slug = '' ) { if ( empty( $event_slug ) ) { return []; } global $wpdb; $query = $wpdb->prepare( 'SELECT `ID` FROM {table_name} WHERE `v` = %d AND `event` = %s', 2, $event_slug ); $all_automations = BWFAN_Model_Automations::get_results( $query ); if ( 0 === count( $all_automations ) ) { return []; } $final_automation_data = []; foreach ( $all_automations as $automation ) { $id = $automation['ID']; $final_automation_data[ $id ] = [ 'id' => $id, 'meta' => BWFAN_Model_Automationmeta::get_automation_meta( $id ), ]; } return $final_automation_data; } /** * Get Birthday min value * * @return false|string */ public static function get_birthday_min_value( $type = 'date' ) { $min_date = apply_filters( 'bwfan_set_birthday_min', false ); if ( empty( $min_date ) ) { return false; } $date = DateTime::createFromFormat( 'Y-m-d', $min_date ); if ( $type === 'year' ) { return $date->format( 'Y' ); } return $date && $date->format( 'Y-m-d' ) === $min_date ? "min='$min_date'" : ''; } /** * Get Birthday min value * * @return false|string */ public static function get_birthday_max_value( $type = 'date' ) { $min_date = apply_filters( 'bwfan_set_birthday_max', false ); if ( empty( $min_date ) ) { return false; } $date = DateTime::createFromFormat( 'Y-m-d', $min_date ); if ( $type === 'year' ) { return $date->format( 'Y' ); } return $date && $date->format( 'Y-m-d' ) === $min_date ? "max='$min_date'" : ''; } /** * Show the email content in browser * * @return void */ public static function load_view_in_browser_link_content() { $action = filter_input( INPUT_GET, 'bwfan-action' ); if ( empty( $action ) || 'view_in_browser' !== $action ) { return; } $hash_code = filter_input( INPUT_GET, 'bwfan-ehash' ); if ( empty( $hash_code ) ) { return; } global $wpdb; $engagement = $wpdb->get_row( $wpdb->prepare( "SELECT `ID`,`tid`,`oid`,`cid` FROM `{$wpdb->prefix}bwfan_engagement_tracking` WHERE `hash_code` = %s", $hash_code ), ARRAY_A ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching if ( empty( $engagement ) ) { return; } $e_id = isset( $engagement['ID'] ) ? $engagement['ID'] : ''; $oid = isset( $engagement['oid'] ) ? $engagement['oid'] : ''; $template_id = isset( $engagement['tid'] ) ? $engagement['tid'] : ''; $query = $wpdb->prepare( "SELECT `template`, `mode`,`type` FROM `{$wpdb->prefix}bwfan_templates` WHERE `ID` = %d LIMIT 0,1", $template_id ); $response = $wpdb->get_row( $query, ARRAY_A ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching if ( empty( $response ) || empty( $response['template'] ) ) { return; } $body = $response['template']; $mode = intval( $response['mode'] ); $type = intval( $response['type'] ); if ( method_exists( 'BWFAN_Common', 'bwfan_before_send_mail' ) && 1 === $type && 5 === $mode ) { BWFAN_Common::bwfan_before_send_mail(); $body = BWFAN_Common::correct_shortcode_string( $body, $type ); } $merge_tags = BWFAN_Model_Engagement_Trackingmeta::get_merge_tags( $e_id ); foreach ( $merge_tags as $key => $value ) { $body = str_replace( $key, $value, $body ); } /** Append tracking code in body urls */ $conversation_obj = new BWFAN_Email_Conversations(); $body = $conversation_obj->add_tracking_code( $body, $engagement, $hash_code, $oid, true ); $body = BWFAN_Common::bwfan_correct_protocol_url( $body ); if ( 1 === intval( $mode ) ) { $body = BWFCRM_Common::emogrify_rich_text( $body ); } else { $body = BWFCRM_Common::emogrify_html( $body ); } if ( 5 === $mode && class_exists( 'BWFCRM_Block_Editor' ) ) { $global_val = BWFCRM_Block_Editor::$global_settings_var; if ( ! empty( $global_val ) ) { $global_val_k = array_keys( $global_val ); $global_val_v = array_values( $global_val ); $body = str_replace( $global_val_k, $global_val_v, $body ); } } echo $body; //phpcs:ignore WordPress.Security.EscapeOutput die; } /** * Get template type * * @param $type_name * * @return int */ public static function get_email_template_type( $type_name ) { $type = 1; switch ( $type_name ) { case 'html': $type = 3; break; case 'editor': if ( bwfan_is_autonami_pro_active() ) { $type = 4; } case 'block': if ( bwfan_is_autonami_pro_active() ) { $type = 5; } break; } return $type; } /** * Checks if HPOS enabled * * @return bool */ public static function is_hpos_enabled() { return ( class_exists( '\Automattic\WooCommerce\Utilities\OrderUtil' ) && method_exists( '\Automattic\WooCommerce\Utilities\OrderUtil', 'custom_orders_table_usage_is_enabled' ) && \Automattic\WooCommerce\Utilities\OrderUtil::custom_orders_table_usage_is_enabled() ); } public static function meta_array_flatten( $array ) { if ( ! is_array( $array ) ) { return []; } $data = []; foreach ( $array as $row ) { if ( empty( $row['meta_value'] ) ) { continue; } $modified = maybe_unserialize( $row['meta_value'] ); $modified = bwf_is_json( $modified ) ? json_decode( $modified, true ) : $modified; $data[ $row['meta_key'] ] = $modified; } return $data; } /** * Set headers to prevent caching * * @return void */ public static function nocache_headers() { do_action( 'litespeed_control_set_nocache', 'fkautomations' ); if ( headers_sent() ) { return; } header( 'Cache-Control: no-cache, no-store, must-revalidate, max-age=0' ); header( 'Pragma: no-cache' ); header( 'Expires: Wed, 11 Jan 1984 05:00:00 GMT' ); header( 'Last-Modified: false' ); } /** * Get v2 automation contact run count * * @param $contact_id * @param $automation_id * * @return int */ public static function get_v2_automation_contact_run_count( $contact_id, $automation_id ) { global $wpdb; /** Get run count from automation contact table */ $query = "SELECT COUNT(`ID`) FROM {$wpdb->prefix}bwfan_automation_contact WHERE `cid` = %d AND `aid` = %d";; $active_run_count = $wpdb->get_var( $wpdb->prepare( $query, $contact_id, $automation_id ) ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching /** Get run count from automation complete contact table */ $query = "SELECT COUNT(`ID`) FROM {$wpdb->prefix}bwfan_automation_complete_contact WHERE `cid` = %d AND `aid` = %d"; return intval( $active_run_count ) + intval( $wpdb->get_var( $wpdb->prepare( $query, $contact_id, $automation_id ) ) ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching } /** * If url exists in excluded urls * * @param $url * * @return bool */ public static function is_exclude_url( $url ) { if ( empty( $url ) ) { return false; } $excluded_urls = [ 'fonts.googleapis.com', 'mailto:', 'tel:', 'whatsapp:', 'wa.me:', '//wa.me', 't.me', 'm.me', 'x.com', 'twitter.com', 'linkedin.com', 'instagram.com', 'pinterest.com', 'youtube.com', 'snapchat.com', 'reddit.com', 'tripadvisor.com', 'meetup.com', 'producthunt.com', 'tinder.com', 'tumblr.com', 'music.apple.com', 'open.spotify.com', 'soundcloud.com', 'yelp.com', 'medium.com', 'skype.com', 'flickr.com', 'github.com', 'discord.gg', 'tiktok.com', 'zoom.us' ]; $excluded_urls = apply_filters( 'bwfan_exclude_click_track_urls', $excluded_urls ); foreach ( $excluded_urls as $excluded_url ) { if ( $url === $excluded_url || false !== strpos( $url, $excluded_url ) ) { return true; } } return false; } /** * @param $link * * @return void */ public static function wp_redirect( $link ) { remove_all_filters( 'wp_redirect' ); add_filter( 'allowed_redirect_hosts', function ( $allowed_hosts, $host ) use ( $link ) { /** Add link host in allowed hosts, because already checked link is valid or not */ if ( $host === wp_parse_url( $link, PHP_URL_HOST ) ) { $allowed_hosts[] = $host; } return $allowed_hosts; }, 10, 2 ); if ( ! headers_sent() ) { header( 'X-Robots-Tag: noindex, nofollow', true ); } wp_safe_redirect( $link ); exit; } /** * Get unsubscribe link * * @param $data * * @return string */ public static function get_unsubscribe_link( $data ) { if ( method_exists( 'BWFAN_Common', 'get_unsubscribe_link' ) ) { return BWFAN_Common::get_unsubscribe_link( $data ); } if ( empty( self::$unsubscribe_page_link ) ) { $global_settings = BWFAN_Common::get_global_settings(); if ( ! isset( $global_settings['bwfan_unsubscribe_page'] ) || empty( $global_settings['bwfan_unsubscribe_page'] ) ) { return ''; } $page = absint( $global_settings['bwfan_unsubscribe_page'] ); self::$unsubscribe_page_link = get_permalink( $page ); } if ( empty( $data ) || ! is_array( $data ) ) { return self::$unsubscribe_page_link; } if ( empty( $data['uid'] ) && isset( $data['contact_id'] ) ) { $contact = new WooFunnels_Contact( '', '', '', $data['contact_id'] ); $uid = ( $contact->get_id() > 0 ) ? $contact->get_uid() : ''; if ( ! empty( $uid ) ) { $data['uid'] = $uid; } unset( $data['contact_id'] ); } $data['bwfan-action'] = 'unsubscribe'; return add_query_arg( $data, self::$unsubscribe_page_link ); } /** * Disable run v2 automation immediately * * @return void */ public static function disable_run_v2_automation_immediately() { $disable = apply_filters( 'bwfan_disable_run_v2_automation_immediately', true ); add_filter( 'bwfan_run_v2_automation_immediately', function ( $run ) use ( $disable ) { return ! ( true === $disable ); } ); } /** * Set automation ended reason in data * * @param $reason * @param $data * * @return mixed */ public static function set_automation_ended_reason( $reason, $data ) { if ( method_exists( 'BWFAN_Common', 'set_automation_ended_reason' ) ) { BWFAN_Common::set_automation_ended_reason( $reason, $data ); } $decoded_data = ! empty( $data['data'] ) ? json_decode( $data['data'], true ) : []; $decoded_data['end_reason'] = $reason; $data['data'] = wp_json_encode( $decoded_data ); return $data; } /** * Get generic rules * * @return array */ public static function get_generic_rules() { if ( ! class_exists( 'BWFAN_Core' ) ) { return []; } $generic_rule_groups = [ 'bwf_contact_segments', 'bwf_contact', 'bwf_contact_fields', 'bwf_contact_field', 'bwf_contact_user', 'bwf_contact_wc', 'bwf_contact_geo', 'bwf_engagement', 'bwf_broadcast', 'bwf_automation' ]; $rules_groups = BWFAN_Core()->rules->get_all_groups(); $rules = apply_filters( 'bwfan_rule_get_rule_types', array() ); $final_rules = array(); foreach ( $generic_rule_groups as $group ) { if ( ! isset( $rules_groups[ $group ] ) || ! isset( $rules[ $group ] ) ) { continue; } $final_rules[ $group ] = $rules_groups[ $group ]; $group_rules = $rules[ $group ]; $rule_keys = array_keys( $rules[ $group ] ); $final_rules[ $group ]['rules'] = array_map( function ( $rule ) use ( $group_rules ) { $rules_loader = BWFAN_Rules_Loader::get_instance(); $rule_array = $rules_loader->get_rule_schema( $rule, [] ); if ( empty( $rule_array ) ) { return false; } $rule_array['name'] = $group_rules[ $rule ]; return $rule_array; }, $rule_keys ); $final_rules[ $group ]['rules'] = array_filter( $final_rules[ $group ]['rules'] ); if ( empty( $final_rules[ $group ]['rules'] ) ) { unset( $final_rules[ $group ] ); } } return $final_rules; } /** * Check lite plugin version is 3.0 or greater * * @return bool */ public static function is_lite_3_0() { return defined( 'BWFAN_VERSION' ) && version_compare( BWFAN_VERSION, '3.0.0', '>=' ); } /** * Optimize phone number by removing spaces, brackets, hyphens and retains the country code and numbers * * @param $phone * * @return array|mixed|string|string[]|null */ public static function modify_phone( $phone = '' ) { if ( empty( $phone ) ) { return $phone; } if ( method_exists( 'BWFAN_Common', 'modify_phone' ) ) { return BWFAN_Common::modify_phone( $phone ); } return preg_replace( '/[\s\-()]+/', '', $phone ); } /** * Get wishlist data including product IDs, variation IDs, user ID, and title for a specific wishlist ID. * * @param int $wishlist_id The ID of the wishlist. * * @return array|bool An array of wishlist data with keys 'wishlist_id', 'user_id', 'title', 'product_ids', and 'variation_ids', or false if not found. */ public static function get_ti_wc_wishlist_data_by_id( $wishlist_id ) { if ( empty( $wishlist_id ) || ! is_numeric( $wishlist_id ) ) { return false; } global $wpdb; $query = $wpdb->prepare( "SELECT lists.ID AS wishlist_id, lists.author AS user_id, lists.title, GROUP_CONCAT(items.product_id) AS product_ids, GROUP_CONCAT(items.variation_id) AS variation_ids FROM {$wpdb->prefix}tinvwl_lists AS lists JOIN {$wpdb->prefix}tinvwl_items AS items ON lists.ID = items.wishlist_id WHERE lists.ID = %d GROUP BY lists.ID", $wishlist_id ); $result = $wpdb->get_row( $query, ARRAY_A ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching if ( empty( $result ) || ! is_array( $result ) ) { return false; } return [ 'wishlist_id' => $result['wishlist_id'], 'user_id' => $result['user_id'], 'title' => $result['title'], 'product_ids' => explode( ',', $result['product_ids'] ) ]; } /** * @return void */ public static function validate_scheduled_recurring_actions() { if ( method_exists( 'BWFAN_Common', 'validate_scheduled_recurring_actions' ) ) { BWFAN_Common::validate_scheduled_recurring_actions(); return; } $hooks = [ [ 'name' => 'bwfan_run_event_queue', 'time' => MINUTE_IN_SECONDS, 'args' => [], 'group_slug' => '' ], [ 'name' => 'bwfan_run_queue_v2', 'time' => MINUTE_IN_SECONDS, 'args' => [], 'group_slug' => '' ], [ 'name' => 'bwfcrm_broadcast_run_queue', 'time' => MINUTE_IN_SECONDS, 'args' => [], 'group_slug' => 'bwfcrm' ] ]; foreach ( $hooks as $hook ) { if ( bwf_has_action_scheduled( $hook['name'] ) ) { continue; } bwf_schedule_recurring_action( time(), $hook['time'], $hook['name'], $hook['args'], $hook['group_slug'] ); } } public static function forms_fields_rules( $type, $condition_value, $value ) { switch ( $type ) { case 'is': if ( is_array( $condition_value ) && is_array( $value ) ) { $result = count( array_intersect( $condition_value, $value ) ) > 0; } else { $result = in_array( $condition_value, $value ); } break; case 'is_not': if ( is_array( $condition_value ) && is_array( $value ) ) { $result = count( array_intersect( $condition_value, $value ) ) === 0; } else { $result = ! in_array( $condition_value, $value ); } break; case 'contains': if ( is_array( $value ) ) { $result = ! empty( array_filter( $value, function ( $element ) use ( $condition_value ) { return strpos( $element, $condition_value ) !== false; } ) ); break; } $result = strpos( $value, $condition_value ) !== false; break; case 'not_contains': if ( is_array( $value ) ) { $result = ! empty( array_filter( $value, function ( $element ) use ( $condition_value ) { return strpos( $element, $condition_value ) === false; } ) ); break; } $result = strpos( $value, $condition_value ) === false; break; case 'starts_with': $value = isset( $value[0] ) && ! empty( $value[0] ) ? $value[0] : ''; $length = strlen( $condition_value ); $result = substr( $value, 0, $length ) === $condition_value; break; case 'ends_with': $value = is_array( $value ) ? end( $value ) : $value; $length = strlen( $condition_value ); if ( 0 === $length || ( $length > strlen( $value ) ) ) { $result = false; break; } $result = substr( $value, - $length ) === $condition_value; break; case 'is_blank': $result = empty( $value[0] ); break; case 'is_not_blank': $result = ! empty( $value[0] ); break; default: $result = false; break; } return $result; } public static function get_referral_data( $customer_id ) { global $wpdb; $referral_data = []; $customer_data = $wpdb->get_row( $wpdb->prepare( "SELECT email, first_name, last_name FROM {$wpdb->prefix}affiliate_wp_customers WHERE customer_id = %d ", $customer_id ) ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching if ( empty( $customer_data ) ) { return $referral_data; } $referral_data['email'] = isset( $customer_data->email ) ? $customer_data->email : ''; $referral_data['first_name'] = isset( $customer_data->first_name ) ? $customer_data->first_name : ''; $referral_data['last_name'] = isset( $customer_data->last_name ) ? $customer_data->last_name : ''; return $referral_data; } /** * Get Offers * * @param $search * * @return array */ public static function get_offers( $search = '' ) { $args = [ "post_type" => "wfocu_offer", "s" => $search, "numberposts" => 20, ]; return self::get_formatted_offer_data( $args, $search ); } /** * Get Bump * * @param $search * * @return array */ public static function get_bumps( $search = '' ) { $args = [ "post_type" => "wfob_bump", "s" => $search, "numberposts" => 20, ]; return self::get_formatted_offer_data( $args, $search ); } /** * Get formatted offer/bump * * @param $args * @param $search * * @return array */ public static function get_formatted_offer_data( $args, $search ) { $posts = get_posts( $args ); $offers = []; foreach ( $posts as $post ) { $offers[ $post->ID ] = $post->post_title . '(#' . $post->ID . ')'; } return array_filter( $offers, function ( $offer ) use ( $search ) { return false !== strpos( strtolower( $offer ), strtolower( $search ) ); } ); } /** * Check advance log enabled * * @param $log * * @return bool */ public static function is_log_enabled( $log ) { if ( method_exists( 'BWFAN_Common', 'is_log_enabled' ) ) { return BWFAN_Common::is_log_enabled( $log ); } $global_settings = BWFAN_Common::get_global_settings(); return isset( $global_settings['bwfan_advance_logs'] ) && ! empty( $global_settings['bwfan_advance_logs'] ) && isset( $global_settings[ $log ] ) && ! empty( $global_settings[ $log ] ); } /** * Get formatted tag & list data if comma exists in value * * @param $data * * @return array|string[] */ public static function check_for_comma_seperated( $data ) { if ( method_exists( 'BWFAN_Common', 'check_for_comma_seperated' ) ) { return BWFAN_Common::check_for_comma_seperated( $data ); } if ( empty( $data ) || ! is_array( $data ) ) { return []; } $formatted_data = []; foreach ( $data as $value ) { if ( ! empty( ( $value['id'] ) ) || false === strpos( $value['value'], ',' ) ) { $formatted_data[] = $value; continue; } $comma_separated_values = explode( ',', $value['value'] ); $comma_separated_values = array_map( function ( $single_value ) { return [ 'id' => 0, 'value' => trim( $single_value ) ]; }, $comma_separated_values ); $formatted_data = array_merge( $formatted_data, $comma_separated_values ); } return $formatted_data; } /** * Get date format * * @return array[] */ public static function get_date_formats() { if ( method_exists( 'BWFAN_Common', 'get_date_formats' ) ) { return BWFAN_Common::get_date_formats(); } return array( array( 'format' => 'j M Y', ), array( 'format' => 'jS M Y', ), array( 'format' => 'M j Y', ), array( 'format' => 'M jS Y', ), array( 'format' => 'd/m/Y', ), array( 'format' => 'd-m-Y', ), array( 'format' => 'Y/m/d', ), array( 'format' => 'Y-m-d', ), array( 'format' => 'd/m/Y H:i:s', ), array( 'format' => 'd-m-Y H:i:s', ), array( 'format' => 'Y/m/d H:i:s', ), array( 'format' => 'Y-m-d H:i:s', ), array( 'format' => 'd.m.Y', ), ); } /** Breakdance */ public static function get_breakdance_form_fields( $form_post_id ) { global $wpdb; // Query all Breakdance form metadata $query = "SELECT meta_value FROM {$wpdb->postmeta} WHERE meta_key = '_breakdance_data'"; $results = $wpdb->get_results( $query ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching if ( ! $results ) { return []; } foreach ( $results as $row ) { $meta_data = json_decode( $row->meta_value, true ); if ( ! isset( $meta_data['tree_json_string'] ) ) { continue; } $tree_data = json_decode( $meta_data['tree_json_string'], true ); if ( ! isset( $tree_data['root'] ) ) { continue; } $fields = []; self::extract_form_fields( $tree_data['root'], $form_post_id, $fields ); if ( ! empty( $fields ) ) { return $fields; } } return []; } /** * Extract Form Fields from the Breakdance Form Builder */ private static function extract_form_fields( $node, $form_post_id, &$fields ) { if ( isset( $node['data']['type'] ) && $node['data']['type'] === 'EssentialElements\\FormBuilder' ) { if ( isset( $node['id'] ) && $node['id'] == $form_post_id ) { if ( isset( $node['data']['properties']['content']['form']['fields'] ) ) { foreach ( $node['data']['properties']['content']['form']['fields'] as $field ) { if ( ! empty( $field['advanced']['id'] ) && ! empty( $field['label'] ) ) { $fields[ $field['advanced']['id'] ] = sanitize_text_field( $field['label'] ); } } } } } if ( isset( $node['children'] ) && is_array( $node['children'] ) ) { foreach ( $node['children'] as $child ) { self::extract_form_fields( $child, $form_post_id, $fields ); } } } public static function get_all_breakdance_forms() { global $wpdb; $post_types = [ 'page', 'breakdance_popup', 'breakdance_template', 'breakdance_global_block' ]; $placeholders = implode( ',', array_fill( 0, count( $post_types ), '%s' ) ); $query = $wpdb->prepare( " SELECT post_id, meta_value FROM {$wpdb->postmeta} WHERE meta_key = '_breakdance_data' AND post_id IN ( SELECT ID FROM {$wpdb->posts} WHERE post_type IN ($placeholders) ) ", ...$post_types ); $results = $wpdb->get_results( $query ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching if ( ! $results ) { return []; } $unique_forms = []; foreach ( $results as $row ) { $meta_data = json_decode( $row->meta_value, true ); if ( ! $meta_data || ! isset( $meta_data['tree_json_string'] ) ) { continue; } $tree_data = json_decode( $meta_data['tree_json_string'], true ); if ( ! $tree_data || ! isset( $tree_data['root'] ) ) { continue; } self::extract_breakdance_forms( $tree_data['root'], $row->post_id, $unique_forms ); } return array_values( $unique_forms ); } public static function extract_breakdance_forms( $node, $post_id, &$unique_forms ) { if ( isset( $node['data']['type'] ) && $node['data']['type'] === 'EssentialElements\\FormBuilder' ) { $form_id = $node['id']; $form_title = $node['data']['properties']['content']['form']['form_name'] ?? 'Untitled Form'; // Unique key for preventing duplicate forms $unique_key = $form_id . '_' . $post_id; if ( ! isset( $unique_forms[ $unique_key ] ) ) { $unique_forms[ $unique_key ] = [ 'id' => $form_id, 'title' => $form_title, 'post_id' => $post_id ]; } } if ( isset( $node['children'] ) && is_array( $node['children'] ) ) { foreach ( $node['children'] as $child ) { self::extract_breakdance_forms( $child, $post_id, $unique_forms ); } } } /** * @param $link * Validate links domains * * @return mixed|string|null */ public static function validate_target_link( $link ) { if ( method_exists( 'BWFAN_Common', 'validate_target_link' ) ) { return BWFAN_Common::validate_target_link( $link ); } $link_host = parse_url( urldecode( $link ), PHP_URL_HOST ); $site_url = home_url(); $site_url_host = parse_url( $site_url, PHP_URL_HOST ); /** If site url and redirect url host are same */ if ( $link_host === $site_url_host ) { return $link; } $allowed_domains = apply_filters( 'bwfan_allowed_redirect_domains', array() ); if ( empty( $allowed_domains ) ) { return $link; } /** Filter valid domains */ $allowed_domains = array_filter( array_map( function ( $domain ) { return ! empty( $domain ) && is_string( $domain ) ? wp_parse_url( $domain, PHP_URL_HOST ) : false; }, $allowed_domains ) ); return in_array( $link_host, $allowed_domains, true ) ? $link : $site_url; } /** * If constant define then get contact email by user id * * @param $user_id * @param $contact_id * * @return string */ public static function get_contact_email( $user_id = 0, $contact_id = 0 ) { if ( method_exists( 'BWFAN_Common', 'get_contact_email' ) ) { return BWFAN_Common::get_contact_email( $user_id, $contact_id ); } if ( ! defined( 'BWFAN_GET_CONTACT_EMAIL' ) || true !== BWFAN_GET_CONTACT_EMAIL || ( empty( $user_id ) && empty( $contact_id ) ) ) { return ''; } $contact = new WooFunnels_Contact( $user_id, '', '', $contact_id ); return $contact->get_id() > 0 ? $contact->get_email() : ''; } }