Files
torebki-fabiola.pl/wp-content/plugins/email-subscribers/lite/includes/db/class-es-db-mailing-queue.php
2026-03-05 13:07:40 +01:00

710 lines
18 KiB
PHP

<?php
// Exit if accessed directly
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
class ES_DB_Mailing_Queue {
public static $table_name = IG_MAILING_QUEUE_TABLE;
public static $primary_key = 'id';
public static $version = '1.0';
/**
* Get columns and formats
*
* @since 2.1
*/
public static function get_columns() {
return array(
'id' => '%d',
'hash' => '%s',
'campaign_id' => '%d',
'subject' => '%s',
'body' => '%s',
'count' => '%d',
'status' => '%s',
'start_at' => '%s',
'finish_at' => '%s',
'created_at' => '%s',
'updated_at' => '%s',
'meta' => '%s',
);
}
public static function get_column_defaults() {
return array(
'hash' => null,
'campaign_id' => 0,
'subject' => '',
'body' => '',
'count' => 0,
'status' => 'In Queue',
'start_at' => null,
'finish_at' => null,
'created_at' => ig_get_current_date_time(),
'updated_at' => null,
'meta' => null,
);
}
public static function get_notification_hash_to_be_sent() {
global $wpdb;
$hash = $wpdb->get_var(
$wpdb->prepare(
"SELECT hash FROM {$wpdb->prefix}ig_mailing_queue WHERE status = %s ORDER BY id LIMIT 0, 1",
'In Queue'
)
);
// TODO :: update start date
return $hash;
}
public static function get_notification_to_be_sent( $campaign_hash = '' ) {
global $wpdb;
$notification = array();
$ig_mailing_queue_table = IG_MAILING_QUEUE_TABLE;
$results = array();
if ( ! empty( $campaign_hash ) ) {
$results = $wpdb->get_results(
$wpdb->prepare(
"SELECT * FROM {$wpdb->prefix}ig_mailing_queue WHERE hash = %s",
array( $campaign_hash )
),
ARRAY_A
);
} else {
$current_time = ig_get_current_date_time();
$results = $wpdb->get_results(
$wpdb->prepare(
"SELECT * FROM {$wpdb->prefix}ig_mailing_queue WHERE status IN ('Sending', 'In Queue') AND start_at <= %s ORDER BY
CASE
WHEN start_at = '0000-00-00 00:00:00' THEN %s
ELSE start_at
END, id LIMIT 0, 1",
$current_time,
$current_time
),
ARRAY_A
);
}
if ( count( $results ) > 0 ) {
$notification = array_shift( $results );
}
return $notification;
}
/**
* Sync mailing queue content with campaign content
*
* @param array $notification
*
* @since 4.7.3
*/
public static function sync_content( $notification = array() ) {
if ( ! empty( $notification ) ) {
$meta = maybe_unserialize( $notification['meta'] );
if ( ! empty( $meta ) ) {
$filter = 'ig_es_refresh_' . $meta['type'] . '_content';
$post_id = ! empty( $meta['post_id'] ) ? $meta['post_id'] : 0;
$content = array();
$content = apply_filters(
$filter,
$content,
array(
'campaign_id' => $notification['campaign_id'],
'post_id' => $post_id,
)
);
// Update mailing queue with updated content data.
if ( ! empty( $content ) ) {
global $wpdb;
$notification['subject'] = ! empty( $content['subject'] ) ? $content['subject'] : $notification['subject'];
$notification['body'] = ! empty( $content['body'] ) ? $content['body'] : $notification['body'];
$wpdb->query(
$wpdb->prepare(
"UPDATE {$wpdb->prefix}ig_mailing_queue SET subject = %s, body = %s WHERE hash = %s",
array(
$notification['subject'],
$notification['body'],
$notification['hash'],
)
)
);
}
}
}
return $notification;
}
// Query to insert sent emails (cron) records in table: es_sentdetails
public static function update_sent_status( $hash = '', $status = 'In Queue' ) {
global $wpdb;
// If status is sent then add finish_at time as well.
if ( 'Sent' === $status ) {
$current_date_time = ig_get_current_date_time();
$return_id = $wpdb->query(
$wpdb->prepare(
"UPDATE {$wpdb->prefix}ig_mailing_queue SET status = %s, finish_at = %s WHERE hash = %s",
$status,
$current_date_time,
$hash
)
);
} elseif ( 'Sending' === $status ) {
$current_date_time = ig_get_current_date_time();
$return_id = $wpdb->query(
$wpdb->prepare(
"UPDATE {$wpdb->prefix}ig_mailing_queue SET status = %s, start_at = %s WHERE hash = %s",
$status,
$current_date_time,
$hash
)
);
} else {
$return_id = $wpdb->query(
$wpdb->prepare(
"UPDATE {$wpdb->prefix}ig_mailing_queue SET status = %s WHERE hash = %s",
$status,
$hash
)
);
}
return $return_id;
}
/* Get sent email count */
public static function get_sent_email_count( $notification_hash ) {
global $wpdb;
$email_count = $wpdb->get_col(
$wpdb->prepare(
"SELECT count FROM {$wpdb->prefix}ig_mailing_queue WHERE hash = %s ",
array( $notification_hash )
)
);
$email_count = array_shift( $email_count );
return $email_count;
}
public static function get_notification_by_hash( $notification_hash ) {
global $wpbd;
$notification = array();
$query = $wpbd->prepare(
"SELECT * FROM {$wpbd->prefix}ig_mailing_queue WHERE hash = %s",
$notification_hash
);
$cache_key = ES_Cache::generate_key( $query );
$exists_in_cache = ES_Cache::is_exists( $cache_key, 'query' );
if ( ! $exists_in_cache ) {
$results = $wpbd->get_results(
$query,
ARRAY_A
);
ES_Cache::set( $cache_key, $results, 'query' );
} else {
$results = ES_Cache::get( $cache_key, 'query' );
}
if ( count( $results ) > 0 ) {
$notification = array_shift( $results );
}
return $notification;
}
public static function get_notification_by_campaign_id( $campaign_id ) {
global $wpbd;
$notification = array();
$query = $wpbd->prepare( "SELECT * FROM {$wpbd->prefix}ig_mailing_queue WHERE campaign_id = %d", $campaign_id );
$cache_key = ES_Cache::generate_key( $query );
$exists_in_cache = ES_Cache::is_exists( $cache_key, 'query' );
if ( ! $exists_in_cache ) {
$results = $wpbd->get_results(
$query,
ARRAY_A
);
ES_Cache::set( $cache_key, $results, 'query' );
} else {
$results = ES_Cache::get( $cache_key, 'query' );
}
if ( is_array( $results ) && count( $results ) > 0 ) {
$notification = array_shift( $results );
}
return $notification;
}
public static function get_notifications( $per_page = 5, $page_number = 1 ) {
global $wpdb;
if ( ! empty( $per_page ) && ! empty( $page_number ) ) {
$start_limit = ( $page_number - 1 ) * $per_page;
$result = $wpdb->get_results(
$wpdb->prepare(
"SELECT * FROM {$wpdb->prefix}ig_mailing_queue ORDER BY created_at DESC LIMIT %d, %d",
$start_limit,
$per_page
),
ARRAY_A
);
} else {
$result = $wpdb->get_results(
$wpdb->prepare(
"SELECT * FROM {$wpdb->prefix}ig_mailing_queue ORDER BY created_at DESC "
),
ARRAY_A
);
}
return $result;
}
public static function get_notifications_count() {
global $wpdb;
$result = $wpdb->get_col(
$wpdb->prepare(
"SELECT count(*) as total_notifications FROM {$wpdb->prefix}ig_mailing_queue WHERE %d",
1
)
);
return $result[0];
}
public static function delete( $ids ) {
global $wpbd;
if ( empty( $ids ) ) {
return false;
}
$ids_count = count( $ids );
$ids_placeholders = array_fill( 0, $ids_count, '%d' );
// Delete notification.
$wpbd->query(
$wpbd->prepare(
"DELETE FROM `{$wpbd->prefix}ig_mailing_queue` WHERE id IN( " . implode( ',', $ids_placeholders ) . ' );',
$ids
)
);
}
public static function delete_notifications( $ids ) {
global $wpbd;
$ids_count = count( $ids );
$ids_placeholders = array_fill( 0, $ids_count, '%d' );
$campaign_query_args = array(
IG_ES_CAMPAIGN_STATUS_IN_ACTIVE, // First arguement for $wpbd->prepare
);
$campaign_query_args = array_merge( $campaign_query_args, $ids ); // Merge ids with other $wpbd->prepare arguements
// Update related broadcast campaign status to draft.
$wpbd->query(
$wpbd->prepare(
"UPDATE `{$wpbd->prefix}ig_campaigns` SET `status`= %d WHERE
id IN( SELECT `campaign_id` FROM `{$wpbd->prefix}ig_mailing_queue` WHERE
id IN( " . implode( ',', $ids_placeholders ) . " )
) AND type = 'newsletter';",
$campaign_query_args
)
);
// Delete notification.
$wpbd->query(
$wpbd->prepare(
"DELETE FROM `{$wpbd->prefix}ig_mailing_queue` WHERE id IN( " . implode( ',', $ids_placeholders ) . ' );',
$ids
)
);
}
public static function add_notification( $data ) {
global $wpdb;
$column_formats = self::get_columns();
$column_defaults = self::get_column_defaults();
$prepared_data = ES_DB::prepare_data( $data, $column_formats, $column_defaults, true );
$data = $prepared_data['data'];
$column_formats = $prepared_data['column_formats'];
$inserted = $wpdb->insert( IG_MAILING_QUEUE_TABLE, $data, $column_formats );
$last_report_id = 0;
if ( $inserted ) {
$last_report_id = $wpdb->insert_id;
}
return $last_report_id;
}
public static function update_notification( $notification_id, $data ) {
global $wpdb;
$column_formats = self::get_columns();
$column_defaults = self::get_column_defaults();
$prepared_data = ES_DB::prepare_data( $data, $column_formats, $column_defaults, true );
$data = $prepared_data['data'];
$column_formats = $prepared_data['column_formats'];
$wpdb->update( IG_MAILING_QUEUE_TABLE, $data, array( 'id' => $notification_id ), $column_formats );
}
public static function get_id_details_map() {
global $wpdb;
$query = 'SELECT id, start_at, hash FROM ' . IG_MAILING_QUEUE_TABLE;
$results = $wpdb->get_results(
$wpdb->prepare(
"SELECT id, start_at, hash FROM {$wpdb->prefix}ig_mailing_queue WHERE %d",
1
),
ARRAY_A
);
$details = array();
if ( count( $results ) > 0 ) {
foreach ( $results as $result ) {
$details[ $result['hash'] ]['id'] = $result['id'];
$details[ $result['hash'] ]['start_at'] = $result['start_at'];
}
}
return $details;
}
public static function get_mailing_queue_by_id( $mailing_queue_id ) {
global $wpdb;
$report = array();
$results = $wpdb->get_results(
$wpdb->prepare(
"SELECT * FROM {$wpdb->prefix}ig_mailing_queue WHERE id = %s",
$mailing_queue_id
),
ARRAY_A
);
if ( count( $results ) > 0 ) {
$report = array_shift( $results );
}
return $report;
}
/**
* Get recent campaigns data
*
* @param int $count
*
* @return array|object|null
*
* @since 4.4.0
*/
public static function get_recent_campaigns( $count = 5 ) {
global $wpdb;
if ( ! is_numeric( $count ) ) {
$count = 5;
}
return $wpdb->get_results(
$wpdb->prepare(
"SELECT id, hash, campaign_id, subject, start_at, status, finish_at FROM {$wpdb->prefix}ig_mailing_queue order by created_at DESC LIMIT 0, %d",
$count
),
ARRAY_A
);
}
public static function do_insert( $place_holders, $values ) {
global $wpdb, $wpbd;
$query = "INSERT INTO {$wpdb->prefix}ig_mailing_queue (`hash`, `campaign_id`, `subject`, `body`, `count`, `status`, `start_at`, `finish_at`, `created_at`, `updated_at`) VALUES ";
$query .= implode( ', ', $place_holders );
$sql = $wpbd->prepare( $query, $values );
$logger = get_ig_logger();
$logger->info( 'Query....<<<<<' . $sql );
if ( $wpbd->query( $sql ) ) {
return true;
} else {
return false;
}
}
public static function migrate_notifications() {
global $wpdb;
$total = $wpdb->get_var(
$wpdb->prepare(
"SELECT count(*) as total FROM {$wpdb->prefix}es_notification WHERE %d",
1
)
);
if ( $total > 0 ) {
$columns = self::get_columns();
unset( $columns['id'] );
$fields = array_keys( $columns );
$batch_size = IG_DEFAULT_BATCH_SIZE;
$total_bataches = ( $total > IG_DEFAULT_BATCH_SIZE ) ? ceil( $total / $batch_size ) : 1;
for ( $i = 0; $i < $total_bataches; $i ++ ) {
$batch_start = $i * $batch_size;
$results = $wpdb->get_results(
$wpdb->prepare(
"SELECT * FROM {$wpdb->prefix}es_sentdetails LIMIT %d, %d",
$batch_start,
$batch_size
),
ARRAY_A
);
$values = array();
$place_holders = array();
foreach ( $results as $key => $result ) {
$queue_data['hash'] = $result['es_sent_guid'];
$queue_data['campaign_id'] = 0;
$queue_data['subject'] = $result['es_sent_subject'];
$queue_data['body'] = $result['es_sent_preview'];
$queue_data['count'] = $result['es_sent_count'];
$queue_data['status'] = $result['es_sent_status'];
$queue_data['start_at'] = $result['es_sent_starttime'];
$queue_data['finish_at'] = $result['es_sent_endtime'];
$queue_data['created_at'] = $result['es_sent_starttime'];
$queue_data = wp_parse_args( $queue_data, self::get_column_defaults() );
$formats = array();
foreach ( $columns as $column => $format ) {
$values[] = $queue_data[ $column ];
$formats[] = $format;
}
$place_holders[] = '( ' . implode( ', ', $formats ) . ' )';
}
ES_DB::do_insert( IG_MAILING_QUEUE_TABLE, $fields, $place_holders, $values );
}
}
}
/**
* Method to update subscribers count in mailing queue table.
*
* @param string $hash Mailing queue hash.
* @param int $count Subscribers count.
*
* @since 4.6.3
*/
public static function update_mailing_queue( $mailing_queue_id = 0, $data = array() ) {
if ( empty( $mailing_queue_id ) ) {
return;
}
global $wpdb;
// Row ID must be positive integer
$mailing_queue_id = absint( $mailing_queue_id );
if ( empty( $mailing_queue_id ) ) {
return false;
}
if ( empty( $where ) ) {
$where = self::$primary_key;
}
// Initialise column format array
$column_formats = self::get_columns();
// Force fields to lower case
$data = array_change_key_case( $data );
// White list columns
$data = array_intersect_key( $data, $column_formats );
// Reorder $column_formats to match the order of columns given in $data
$data_keys = array_keys( $data );
$column_formats = array_merge( array_flip( $data_keys ), $column_formats );
if ( false === $wpdb->update( self::$table_name, $data, array( $where => $mailing_queue_id ), $column_formats ) ) {
return false;
}
return true;
}
/**
* Decrease subscribers count by given amount.
*
* @param int $mailing_queue_id Mailing queue id.
* @param int $decrease_by Subscribers count.
*
* @since 4.7.6
*/
public static function decrease_subscribers_count( $mailing_queue_id, $decrease_by = 0 ) {
global $wpdb;
if ( empty( $mailing_queue_id ) || empty( $decrease_by ) ) {
return;
}
$wpdb->query(
$wpdb->prepare(
"UPDATE {$wpdb->prefix}ig_mailing_queue SET count = count - %d WHERE id = %d",
$decrease_by,
$mailing_queue_id
)
);
}
/**
* Get frequency of sending recent newsletter campaigns.
*
* @param int $max_campaigns_count fetch the recent n number of campaigns
*
* @since 5.5.7
*/
public static function get_campaign_sending_frequency( $max_campaigns_count = 10 ) {
$campaigns = self::get_recent_campaigns( $max_campaigns_count );
$campaigns_count = count($campaigns);
$total_interval = 0;
$avg_sending_interval = 0;
if ($campaigns_count > 1) {
for ($index=0; $index < $campaigns_count; $index++) {
if ( $index < $campaigns_count-1) {
$first_date = !empty($campaigns[$index]['start_at']) ? strtotime($campaigns[$index]['start_at']) : null;
$second_date = !empty($campaigns[$index+1]['start_at']) ? strtotime($campaigns[$index+1]['start_at']) : null;
if ( $first_date && $second_date ) {
$total_interval = $total_interval + ( $first_date-$second_date );
}
}
}
$avg_sending_interval = $total_interval / $campaigns_count;
}
return $avg_sending_interval;
}
public static function get( $args = array() ) {
global $wpbd;
$fields = ! empty( $args['fields'] ) ? $args['fields'] : array();
$date_query = ! empty( $args['date_query'] ) ? $args['date_query'] : array();
$campaign_types = ! empty( $args['campaign_types'] ) ? $args['campaign_types'] : array();
$statuses = ! empty( $args['statuses'] ) ? $args['statuses' ] : array();
$orders = ! empty( $args['orders'] ) ? $args['orders']: array();
$select = 'SELECT';
if ( ! empty( $fields ) ) {
$select .= ' ' . implode( ', ', $fields );
} else {
$select .= ' * ';
}
$from = "FROM `{$wpbd->prefix}ig_mailing_queue`";
$wheres = array();
if ( ! empty( $campaign_types ) ) {
$campaign_type_where = array();
foreach ( $campaign_types as $campaign_type ) {
$regex = '.*"type";s:[0-9]+:"' . $campaign_type . '".*';
$campaign_type_where[] = $wpbd->prepare( '`meta` REGEXP %s', $regex );
}
$campaign_type_where = implode( ' OR ', array_unique( $campaign_type_where ) );
$wheres[] = 'AND ( ' . $campaign_type_where . ' )';
}
if ( ! empty( $statuses ) ) {
$status_count = count( $statuses );
$status_placeholders = array_fill( 0, $status_count, '%s' );
$wheres[] .= $wpbd->prepare( 'AND status IN( ' . implode( ',', $status_placeholders ) . ' )', $statuses );
}
if ( ! empty( $date_query ) ) {
foreach ( $date_query as $query ) {
if ( ! empty( $query['column'] ) && ! empty( $query['operator'] ) && ! empty( $query['value'] ) ) {
$query_column = $query['column'];
$query_operator = $query['operator'];
$query_value = $query['value'];
$wheres[] = $wpbd->prepare( 'AND ' . $query_column . ' ' . $query_operator . ' %s', $query_value );
}
}
}
$where = '';
if ( ! empty( $wheres ) ) {
$where = 'WHERE 1=1 ' . implode( "\n ", array_unique( $wheres ) );
}
$order = '';
if ( ! empty( $orders ) ) {
$order = 'ORDER BY ' . implode( ', ', array_unique( $orders ) );
}
$query = $select . ' ' . $from . ' ' . $where . ' ' . $order;
if ( count( $fields ) === 1 ) {
$result = $wpbd->get_var(
$query
);
} else {
$result = $wpbd->get_results(
$query,
ARRAY_A
);
}
return $result;
}
}