402 lines
9.4 KiB
PHP
402 lines
9.4 KiB
PHP
<?php
|
|
// Exit if accessed directly
|
|
if ( ! defined( 'ABSPATH' ) ) {
|
|
exit;
|
|
}
|
|
|
|
if ( ! class_exists( 'ES_Actions' ) ) {
|
|
/**
|
|
* Class ES_Actions
|
|
*
|
|
* Track all actions
|
|
*
|
|
* IG_CONTACT_SUBSCRIBE => 1,
|
|
* IG_MESSAGE_SENT => 2,
|
|
* IG_MESSAGE_OPEN => 3,
|
|
* IG_LINK_CLICK => 4,
|
|
* IG_CONTACT_UNSUBSCRIBE => 5,
|
|
* IG_MESSAGE_SOFT_BOUNCE => 6,
|
|
* IG_MESSAGE_HARD_BOUNCE => 7,
|
|
* IG_MESSAGE_ERROR => 8
|
|
*
|
|
* @since 4.2.0
|
|
*/
|
|
class ES_Actions {
|
|
/**
|
|
* ES_DB_Actions object
|
|
*
|
|
* @since 4.2.1
|
|
* @var $db
|
|
*/
|
|
protected $db;
|
|
|
|
/**
|
|
* ES_Actions constructor.
|
|
*
|
|
* @since 4.2.0
|
|
*/
|
|
public function __construct() {
|
|
|
|
$this->db = new ES_DB_Actions();
|
|
|
|
add_action( 'init', array( &$this, 'init' ), 1 );
|
|
}
|
|
|
|
/**
|
|
* Init Actions
|
|
*
|
|
* @since 4.2.0
|
|
*/
|
|
public function init() {
|
|
add_action( 'ig_es_contact_subscribe', array( &$this, 'subscribe' ), 10, 2 );
|
|
add_action( 'ig_es_message_sent', array( &$this, 'sent' ), 10, 3 );
|
|
add_action( 'ig_es_message_open', array( &$this, 'open' ), 10, 3 );
|
|
add_action( 'ig_es_message_click', array( &$this, 'click' ), 10, 5 );
|
|
add_action( 'ig_es_contact_unsubscribe', array( &$this, 'unsubscribe' ), 10, 4 );
|
|
}
|
|
|
|
/**
|
|
* Get action data
|
|
*
|
|
* @since 4.2.0
|
|
*/
|
|
public function get_fields( $fields = null, $where = null ) {
|
|
|
|
global $wpdb, $wpbd;
|
|
|
|
$fields = esc_sql( is_null( $fields ) ? '*' : ( is_array( $fields ) ? implode( ', ', $fields ) : $fields ) );
|
|
|
|
$sql = "SELECT $fields FROM {$wpdb->prefix}ig_actions WHERE 1=1";
|
|
if ( is_array( $where ) ) {
|
|
foreach ( $where as $key => $value ) {
|
|
$sql .= ', ' . esc_sql( $key ) . " = '" . esc_sql( $value ) . "'";
|
|
}
|
|
}
|
|
|
|
return $wpbd->get_results( $sql, ARRAY_A );
|
|
|
|
}
|
|
|
|
/**
|
|
* Add action
|
|
*
|
|
* @param $args
|
|
* @param bool $explicit
|
|
*
|
|
* @return bool
|
|
*
|
|
* @since 4.2.0
|
|
*/
|
|
private function add( $args, $explicit = true ) {
|
|
|
|
$args = wp_parse_args(
|
|
$args,
|
|
array(
|
|
'created_at' => ig_es_get_current_gmt_timestamp(),
|
|
'updated_at' => ig_es_get_current_gmt_timestamp(),
|
|
'count' => 1,
|
|
'ip' => '',
|
|
'country' => '',
|
|
'browser' => '',
|
|
'device' => '',
|
|
'os' => '',
|
|
'email_client' => '',
|
|
)
|
|
);
|
|
|
|
return $this->db->add( $args, $explicit );
|
|
}
|
|
|
|
/**
|
|
* Track Contact Action
|
|
*
|
|
* @param $args
|
|
* @param bool $explicit
|
|
*
|
|
* @since 4.2.4
|
|
*/
|
|
private function add_contact_action( $args, $explicit = true ) {
|
|
|
|
return $this->add( $args, $explicit );
|
|
}
|
|
|
|
/**
|
|
* Add action
|
|
*
|
|
* @param $args
|
|
* @param bool $explicit
|
|
*
|
|
* @return bool
|
|
*
|
|
* @since 4.2.0
|
|
*/
|
|
private function add_action( $args, $explicit = true ) {
|
|
return $this->add( $args, $explicit );
|
|
}
|
|
|
|
/**
|
|
* Track Subscribe Action
|
|
*
|
|
* @param $contact_id
|
|
* @param array $list_ids
|
|
*
|
|
* @since 4.2.0
|
|
*/
|
|
public function subscribe( $contact_id, $list_ids = array() ) {
|
|
if ( is_array( $list_ids ) && count( $list_ids ) > 0 ) {
|
|
foreach ( $list_ids as $list_id ) {
|
|
$this->add_action(
|
|
array(
|
|
'contact_id' => $contact_id,
|
|
'list_id' => $list_id,
|
|
'type' => IG_CONTACT_SUBSCRIBE,
|
|
)
|
|
);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* Track Send Action
|
|
*
|
|
* @param $contact_id
|
|
* @param $message_id
|
|
* @param $campaign_id
|
|
*
|
|
* @return bool
|
|
*
|
|
* @since 4.2.0
|
|
*/
|
|
public function sent( $contact_id, $campaign_id = 0, $message_id = 0 ) {
|
|
return $this->add_action(
|
|
array(
|
|
'contact_id' => $contact_id,
|
|
'campaign_id' => $campaign_id,
|
|
'message_id' => $message_id,
|
|
'type' => IG_MESSAGE_SENT,
|
|
)
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Track Message Open Action
|
|
*
|
|
* @param $contact_id
|
|
* @param $message_id
|
|
* @param $campaign_id
|
|
*
|
|
* @return bool
|
|
*
|
|
* @since 4.2.0
|
|
*/
|
|
public function open( $contact_id, $message_id, $campaign_id, $explicit = true ) {
|
|
|
|
// Track only if campaign sent.
|
|
if ( $this->is_campaign_sent( $contact_id, $message_id, $campaign_id ) ) {
|
|
|
|
$action_data = array(
|
|
'contact_id' => $contact_id,
|
|
'message_id' => $message_id,
|
|
'campaign_id' => $campaign_id,
|
|
'type' => IG_MESSAGE_OPEN,
|
|
);
|
|
|
|
$device_info = $this->get_user_device_info();
|
|
$action_data = array_merge( $action_data, $device_info );
|
|
|
|
return $this->add_action( $action_data, $explicit );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Track Link Click Action
|
|
*
|
|
* @param $contact_id
|
|
* @param $message_id
|
|
* @param $campaign_id
|
|
* @param $link_id
|
|
*
|
|
* @return bool
|
|
*
|
|
* @since 4.2.0
|
|
*/
|
|
public function click( $link_id, $contact_id, $message_id, $campaign_id, $explicit = true ) {
|
|
|
|
// When someone click on link which means they have opened that email
|
|
// Track Email Open
|
|
$this->open( $contact_id, $message_id, $campaign_id, false );
|
|
|
|
$action_data = array(
|
|
'contact_id' => $contact_id,
|
|
'campaign_id' => $campaign_id,
|
|
'message_id' => $message_id,
|
|
'link_id' => $link_id,
|
|
'type' => IG_LINK_CLICK,
|
|
);
|
|
|
|
$device_info = $this->get_user_device_info();
|
|
$action_data = array_merge( $action_data, $device_info );
|
|
|
|
return $this->add_contact_action( $action_data, $explicit );
|
|
}
|
|
|
|
/**
|
|
* Track Contact Unsubscribe Action
|
|
*
|
|
* @param $contact_id
|
|
* @param $message_id
|
|
* @param $campaign_id
|
|
* @param array $list_ids
|
|
*
|
|
* @since 4.2.0
|
|
*/
|
|
public function unsubscribe( $contact_id, $message_id, $campaign_id, $list_ids = array() ) {
|
|
if ( is_array( $list_ids ) && count( $list_ids ) > 0 ) {
|
|
foreach ( $list_ids as $list_id ) {
|
|
|
|
$this->add_action(
|
|
array(
|
|
'contact_id' => $contact_id,
|
|
'message_id' => $message_id,
|
|
'campaign_id' => $campaign_id,
|
|
'list_id' => $list_id,
|
|
'type' => IG_CONTACT_UNSUBSCRIBE,
|
|
)
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Track Message Bounce Action
|
|
*
|
|
* @param $contact_id
|
|
* @param $message_id
|
|
* @param $campaign_id
|
|
* @param bool $hard
|
|
*
|
|
* @since 4.2.0
|
|
*/
|
|
public function bounce( $contact_id, $campaign_id, $hard = false ) {
|
|
$this->add_action(
|
|
array(
|
|
'contact_id' => $contact_id,
|
|
'campaign_id' => $campaign_id,
|
|
'type' => $hard ? IG_MESSAGE_HARD_BOUNCE : IG_MESSAGE_SOFT_BOUNCE,
|
|
)
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Check whether campaign is sent to specific contact
|
|
*
|
|
* @param $contact_id
|
|
* @param $message_id
|
|
* @param $campaign_id
|
|
*
|
|
* @return string|null
|
|
*
|
|
* @since 4.2.3
|
|
*/
|
|
public function is_campaign_sent( $contact_id, $message_id, $campaign_id ) {
|
|
|
|
global $wpdb;
|
|
|
|
$sql = $wpdb->get_var( $wpdb->prepare( "SELECT count(*) FROM {$wpdb->prefix}ig_actions WHERE contact_id = %d AND message_id = %d AND campaign_id = %d AND type = %d ", $contact_id, $message_id, $campaign_id, IG_MESSAGE_SENT ) );
|
|
return $sql;
|
|
}
|
|
|
|
/**
|
|
* Method to update campaign viewed/opened_at status
|
|
*
|
|
* @param int $conact_id
|
|
* @param int $campaign_id
|
|
* @param int $message_id
|
|
*
|
|
* @return bool|false|int|void
|
|
*
|
|
* @since 4.4.7
|
|
*/
|
|
public function update_viewed_status( $conact_id = 0, $campaign_id = 0, $message_id = 0 ) {
|
|
global $wpdb;
|
|
|
|
if ( empty( $conact_id ) || empty( $campaign_id ) ) {
|
|
return;
|
|
}
|
|
|
|
$current_date = ig_get_current_date_time();
|
|
$sql = $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->prefix}ig_sending_queue SET opened_at = %s, opened = %d WHERE contact_id = %d AND campaign_id = %d AND mailing_queue_id = %d", $current_date, 1, $conact_id, $campaign_id, $message_id ) );
|
|
|
|
return $sql;
|
|
|
|
}
|
|
|
|
/**
|
|
* Method to get current device information
|
|
*
|
|
* @since 4.5.0
|
|
*/
|
|
public function get_user_device_info() {
|
|
|
|
$browser = new ES_Browser();
|
|
$device_info = array();
|
|
|
|
if ( $browser->isMobile() ) {
|
|
$device_info['device'] = 'mobile';
|
|
} elseif ( $browser->isTablet() ) {
|
|
$device_info['device'] = 'tablet';
|
|
} else {
|
|
$device_info['device'] = 'desktop';
|
|
}
|
|
|
|
$device_ip_address = ig_es_get_ip();
|
|
if ( ! empty( $device_ip_address ) && 'UNKNOWN' !== $device_ip_address ) {
|
|
$device_location_data = ES_Geolocation::geolocate_ip( $device_ip_address );
|
|
$device_country_code = ! empty( $device_location_data['country_code'] ) ? $device_location_data['country_code'] : '';
|
|
$device_info['country'] = $device_country_code;
|
|
} else {
|
|
$device_ip_address = '';
|
|
$device_info['country'] = '';
|
|
}
|
|
|
|
$device_info['ip'] = $device_ip_address;
|
|
$device_info['browser'] = $browser->getBrowser();
|
|
$device_info['os'] = $browser->getPlatform();
|
|
$device_info['email_client'] = $browser->get_email_client();
|
|
|
|
return $device_info;
|
|
}
|
|
|
|
public function get_action_verb( $action_type ) {
|
|
$action_verb = '';
|
|
switch ( $action_type ) {
|
|
case IG_CONTACT_SUBSCRIBE:
|
|
$action_verb = __( 'subscribed to', 'email-subscribers' );
|
|
break;
|
|
case IG_MESSAGE_SENT:
|
|
$action_verb = __( 'received', 'email-subscribers' );
|
|
break;
|
|
case IG_MESSAGE_OPEN:
|
|
$action_verb = __( 'opened', 'email-subscribers' );
|
|
break;
|
|
case IG_LINK_CLICK:
|
|
$action_verb = __( 'clicked on', 'email-subscribers' );
|
|
break;
|
|
case IG_CONTACT_UNSUBSCRIBE:
|
|
$action_verb = __( 'unsubscribed from', 'email-subscribers' );
|
|
break;
|
|
case IG_MESSAGE_SOFT_BOUNCE:
|
|
$action_verb = __( 'marked as soft bounced', 'email-subscribers' );
|
|
break;
|
|
case IG_MESSAGE_HARD_BOUNCE:
|
|
$action_verb = __( 'marked as hard bounced', 'email-subscribers' );
|
|
break;
|
|
}
|
|
return $action_verb;
|
|
}
|
|
}
|
|
}
|
|
|
|
|