Files
roi-theme/wp-content/plugins/wp-marketing-automations-pro/includes/class-bwfan-pro-common.php
root a22573bf0b Commit inicial - WordPress Análisis de Precios Unitarios
- WordPress core y plugins
- Tema Twenty Twenty-Four configurado
- Plugin allow-unfiltered-html.php simplificado
- .gitignore configurado para excluir wp-config.php y uploads

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-03 21:04:30 -06:00

3423 lines
101 KiB
PHP
Executable File

<?php
#[AllowDynamicProperties]
class BWFAN_PRO_Common {
public static $crm_default_fields = [
'address-1' => [
'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] => <a href='https://...' class='any'>
*/ return '/<a[^>]+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() : '';
}
}