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

1012 lines
28 KiB
PHP

<?php
// Exit if accessed directly
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
class ES_DB_Campaigns extends ES_DB {
const STATUS_ACTIVE = 1;
const STATUS_INACTIVE = 0;
/**
* Tabl Name
*
* @since 4.2.1
* @var string $table_name
*/
public $table_name;
/**
* Version
*
* @since 4.2.1
* @var string $version
*/
public $version;
/**
* Primary Key
*
* @since 4.2.1
* @var string
*/
public $primary_key;
public function __construct() {
global $wpdb;
parent::__construct();
$this->table_name = $wpdb->prefix . 'ig_campaigns';
$this->primary_key = 'id';
$this->version = '1.0';
}
/**
* Get columns and formats
*
* @since 4.0.0
*/
public function get_columns() {
return array(
'id' => '%d',
'slug' => '%s',
'name' => '%s',
'type' => '%s',
'parent_id' => '%d',
'parent_type' => '%s',
'subject' => '%s',
'body' => '%s',
'from_name' => '%s',
'from_email' => '%s',
'reply_to_name' => '%s',
'reply_to_email' => '%s',
'categories' => '%s',
'list_ids' => '%s',
'base_template_id' => '%d',
'status' => '%d',
'created_at' => '%s',
'updated_at' => '%s',
'deleted_at' => '%s',
'meta' => '%s',
);
}
/**
* Get default column values
*
* @since 4.0.0
*/
public function get_column_defaults() {
$from_name = ES_Common::get_ig_option( 'from_name' );
$from_email = ES_Common::get_ig_option( 'from_email' );
return array(
'slug' => null,
'name' => null,
'type' => null,
'parent_id' => null,
'parent_type' => null,
'subject' => null,
'body' => '',
'from_name' => $from_name,
'from_email' => $from_email,
'reply_to_name' => $from_name,
'reply_to_email' => $from_email,
'categories' => '',
'list_ids' => '',
'base_template_id' => 0,
'status' => 0,
'created_at' => ig_get_current_date_time(),
'updated_at' => null,
'deleted_at' => null,
'meta' => null,
);
}
/**
* Get template id by campaign id
*
* @param $id
*
* @return array|string|null
*
* @since 4.2.1
*/
public function get_template_id_by_campaign( $id ) {
return $this->get_column( 'base_template_id', $id );
}
/**
* Save Campaign
*
* @param $data
* @param null $id
*
* @return false|int
*
* @since 4.0.0
*/
public function save_campaign( $data, $id = null ) {
$insert = is_null( $id );
if ( ! empty( $data['list_ids'] ) && is_array( $data['list_ids'] ) ) {
$data['list_ids'] = array_unique( $data['list_ids'] );
$data['list_ids'] = implode( ',', $data['list_ids'] );
}
if ( $insert ) {
$result = $this->insert( $data );
} else {
// Set updated_at if not set
$data['updated_at'] = ! empty( $data['updated_at'] ) ? $data['updated_at'] : ig_get_current_date_time();
$result = $this->update( $id, $data );
}
return $result;
}
/**
* Get campaign type by campaign id
*
* @param $id
*
* @return string|null
*
* @since 4.0.0
*
* @modify 4.2.1
*/
public function get_campaign_type_by_id( $id ) {
return $this->get_column( 'type', $id );
}
/**
* Migrate post notification from ES 3.5.x
*
* @since 4.0.0
*/
public function migrate_post_notifications() {
global $wpbd;
$campaigns_data = array();
$template_ids = array();
$from_name = ES_Common::get_ig_option( 'from_name' );
$from_email = ES_Common::get_ig_option( 'from_email' );
$list_is_name_map = ES()->lists_db->get_list_id_name_map( '', true );
$es_notification_table = EMAIL_SUBSCRIBERS_NOTIFICATION_TABLE;
$total = $wpbd->get_var( $wpbd->prepare( "SELECT count(*) as total FROM {$wpbd->prefix}es_notification WHERE %d", 1 ) );
if ( $total > 0 ) {
$batch_size = IG_DEFAULT_BATCH_SIZE;
$total_batches = ( $total > IG_DEFAULT_BATCH_SIZE ) ? ceil( $total / $batch_size ) : 1;
for ( $i = 0; $i < $total_batches; $i ++ ) {
$batch_start = $i * $batch_size;
// $query = 'SELECT * FROM ' . EMAIL_SUBSCRIBERS_NOTIFICATION_TABLE . " LIMIT {$batch_start}, {$batch_size}";
// $notifications = $wpbd->get_results( $query, ARRAY_A ); // WPCS: cache ok, DB call ok, unprepared SQL ok.
$notifications = $wpbd->get_results( $wpbd->prepare( "SELECT * FROM {$wpbd->prefix}es_notification LIMIT %d, %d", $batch_start, $batch_size ), ARRAY_A );
if ( count( $notifications ) > 0 ) {
foreach ( $notifications as $key => $notification ) {
$categories = ! empty( $notification['es_note_cat'] ) ? $notification['es_note_cat'] : '';
if ( ! empty( $categories ) ) {
$categories = explode( '--', $categories );
$categories = array_map( array( 'ES_Common', 'temp_filter_category' ), $categories );
$categories = ES_Common::convert_categories_array_to_string( $categories );
}
$template_id = 0;
if ( ! empty( $notification['es_note_templ'] ) ) {
$template_id = $notification['es_note_templ'];
if ( ! in_array( $template_id, $template_ids ) ) {
$template_ids[] = $template_id;
}
}
$campaigns_data[ $key ]['slug'] = $template_id; // We don't have slug at this moment. So, we will fetch template's slug and store it later
$campaigns_data[ $key ]['name'] = $template_id; // We don't have name at this moment. So, we will fetch template's name and store it later
$campaigns_data[ $key ]['type'] = IG_CAMPAIGN_TYPE_POST_NOTIFICATION;
$campaigns_data[ $key ]['from_name'] = $from_name;
$campaigns_data[ $key ]['from_email'] = $from_email;
$campaigns_data[ $key ]['reply_to_name'] = $from_name; // We don't have this option avaialble. So, setting from_name as reply_to_name
$campaigns_data[ $key ]['reply_to_email'] = $from_email; // We don't have this option available. So, setting from_email as reply_to_email
$campaigns_data[ $key ]['categories'] = $categories;
$campaigns_data[ $key ]['list_ids'] = ( ! empty( $notification['es_note_group'] ) && ! empty( $list_is_name_map[ $notification['es_note_group'] ] ) ) ? $list_is_name_map[ $notification['es_note_group'] ] : 0;
$campaigns_data[ $key ]['base_template_id'] = $template_id;
$campaigns_data[ $key ]['status'] = ( ! empty( $notification['es_note_status'] ) && ( 'Disable' === $notification['es_note_status'] ) ) ? 0 : 1;
$campaigns_data[ $key ]['created_at'] = ig_get_current_date_time();
$campaigns_data[ $key ]['updated_at'] = null;
$campaigns_data[ $key ]['deleted_at'] = null;
}
$templates_data = array();
// Get Template Name & Slug
if ( count( $template_ids ) > 0 ) {
$template_ids_str = implode( "', '", $template_ids );
$query = "SELECT ID, post_name, post_title FROM {$wpbd->prefix}posts WHERE id IN ({$template_ids_str})";
$templates = $wpbd->get_results( $query, ARRAY_A );
foreach ( $templates as $template ) {
$templates_data[ $template['ID'] ] = $template;
}
}
// Do Batach Insert
$values = array();
$place_holders = array();
$columns = $this->get_columns();
unset( $columns['id'] );
$fields = array_keys( $columns );
foreach ( $campaigns_data as $campaign_data ) {
$campaign_data['slug'] = ! empty( $templates_data[ $campaign_data['slug'] ] ) ? $templates_data[ $campaign_data['slug'] ]['post_name'] : '';
$campaign_data['name'] = ! empty( $templates_data[ $campaign_data['name'] ] ) ? $templates_data[ $campaign_data['name'] ]['post_title'] : '';
$campaign_data = wp_parse_args( $campaign_data, $this->get_column_defaults() );
$formats = array();
foreach ( $columns as $column => $format ) {
$values[] = $campaign_data[ $column ];
$formats[] = $format;
}
$place_holders[] = '( ' . implode( ', ', $formats ) . ' )';
}
ES_DB::do_insert( IG_CAMPAIGNS_TABLE, $fields, $place_holders, $values );
}
}
}
}
/**
* Migrate Newsletters from ES 3.5.x
*
* @since 4.0.0
*/
public function migrate_newsletters() {
global $wpdb;
// Check if es_sentdetails table exists or not.
if ( $this->table_exists( $wpdb->prefix . 'es_sentdetails' ) ) {
$from_name = ES_Common::get_ig_option( 'from_name' );
$from_email = ES_Common::get_ig_option( 'from_email' );
$total = $wpdb->get_var( $wpdb->prepare( "SELECT count(*) as total FROM {$wpdb->prefix}es_sentdetails WHERE es_sent_source = %s", 'Newsletter' ) );
if ( $total > 0 ) {
$list_is_name_map = ES()->lists_db->get_list_id_name_map( '', true );
$batch_size = IG_DEFAULT_BATCH_SIZE;
$total_batches = ceil( $total / $batch_size );
$values = array();
$place_holders = array();
$columns = $this->get_columns();
unset( $columns['id'] );
$fields = array_keys( $columns );
for ( $i = 0; $i <= $total_batches; $i ++ ) {
$batch_start = $i * $batch_size;
$newsletters = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}es_sentdetails WHERE es_sent_source = %s LIMIT %d, %d", 'Newsletter', $batch_start, $batch_size ), ARRAY_A );
if ( count( $newsletters ) > 0 ) {
$campaign_data = array();
$values = array();
$place_holders = array();
foreach ( $newsletters as $key => $newsletter ) {
$campaign_data['slug'] = sanitize_title( $newsletter['es_sent_subject'] );
$campaign_data['name'] = $newsletter['es_sent_subject'];
$campaign_data['type'] = IG_CAMPAIGN_TYPE_NEWSLETTER;
$campaign_data['from_name'] = $from_name;
$campaign_data['from_email'] = $from_email;
$campaign_data['reply_to_name'] = $from_name; // We don't have this option avaialble. So, setting from_name as reply_to_name
$campaign_data['reply_to_email'] = $from_email; // We don't have this option available. So, setting from_email as reply_to_email
$campaign_data['list_ids'] = ( ! empty( $newsletter['es_note_group'] ) && ! empty( $list_is_name_map[ $newsletter['es_note_group'] ] ) ) ? $list_is_name_map[ $newsletter['es_note_group'] ] : 0;
$campaign_data['status'] = 1;
$campaign_data['created_at'] = $newsletter['es_sent_starttime'];
$campaign_data = wp_parse_args( $campaign_data, $this->get_column_defaults() );
$formats = array();
foreach ( $columns as $column => $format ) {
$values[] = $campaign_data[ $column ];
$formats[] = $format;
}
$place_holders[] = '( ' . implode( ', ', $formats ) . ' )';
}
ES_DB::do_insert( IG_CAMPAIGNS_TABLE, $fields, $place_holders, $values );
}
}
}
}
}
/**
* After migration we are not able to get the campaign_id in mailing queue
* table. So, we are fetching it now and set campaign_id based on subject match.
* If not match, set as 0.
*/
public function update_campaign_id_in_mailing_queue() {
global $wpdb;
$campaigns = $wpdb->get_results( $wpdb->prepare( "SELECT id, name FROM {$wpdb->prefix}ig_campaigns WHERE %d", 1 ), ARRAY_A );
$data_to_update = array();
if ( count( $campaigns ) > 0 ) {
$mailing_queue_results = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}ig_mailing_queue WHERE %d", 1 ), ARRAY_A );
if ( count( $mailing_queue_results ) > 0 ) {
foreach ( $mailing_queue_results as $result ) {
$subject = trim( $result['subject'] );
foreach ( $campaigns as $campaign ) {
$campaign_name = trim( $campaign['name'] );
if ( $campaign_name == $subject ) {
$data_to_update[ $result['id'] ] = $campaign['id'];
break;
}
}
}
}
}
if ( ! empty( $data_to_update ) ) {
foreach ( $data_to_update as $mailing_queue_id => $campaign_id ) {
$wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->prefix}ig_mailing_queue SET campaign_id = %d WHERE id = %d", array( $campaign_id, $mailing_queue_id ) ) );
}
}
}
/**
* Get total campaigns
*
* @return string|null
*
* @since 4.2.1
* @since 4.3.4 Removed deleted_at $where condition
*/
public function get_total_campaigns( $where = '' ) {
return $this->count( $where );
}
/**
* Get total campaigns by type
*
* @param string $type
*
* @return string|null
*
* @since 4.2.1
*/
public function get_total_campaigns_by_type( $type = 'newsletter' ) {
global $wpdb;
$where = $wpdb->prepare( 'type = %s', array( $type ) );
$campaigns = $this->get_total_campaigns( $where );
return $campaigns;
}
/**
* Get total post notifications
*
* @return string|null
*
* @since 4.2.1
*/
public function get_total_post_notifications() {
return $this->get_total_campaigns_by_type( 'post_notification' );
}
/**
* Get total newsletters
*
* @return string|null
*
* @since 4.2.1
*/
public function get_total_newsletters() {
return $this->get_total_campaigns_by_type();
}
/**
* Get total sequence
*
* @return string|null
*
* @since 4.6.6
*/
public function get_total_sequences() {
return $this->get_total_campaigns_by_type( 'sequence' );
}
/**
* Get campaign meta data
*
* @param $id
*
* @return mixed|string|null
*
* @since 4.2.0
*/
public function get_campaign_meta_by_id( $id ) {
$meta = $this->get_column( 'meta', $id );
if ( $meta ) {
$meta = maybe_unserialize( $meta );
}
return $meta;
}
/**
* Get campaign categories string
*
* @param $id
*
* @return mixed|string|null
*
* @since 4.2.0
*/
public function get_campaign_categories_str_by_id( $id ) {
$categories_str = $this->get_column( 'categories', $id );
return $categories_str;
}
/**
* Get campaigns by id
*
* @param int $id
*
* @return array|object|null
*/
public function get_campaign_by_id( $id = 0, $status = 1 ) {
global $wpdb;
if ( empty( $id ) ) {
return array();
}
$where = $wpdb->prepare( 'id = %d', $id );
if ( - 1 !== $status ) {
$where .= $wpdb->prepare( ' AND status = %d', $status );
}
$campaigns = $this->get_by_conditions( $where );
$campaign = array();
if ( ! empty( $campaigns ) ) {
$campaign = array_shift( $campaigns );
}
return $campaign;
}
/**
* Get campaigns by parent id
*
* @param int $id
*
* @return array|object|null
*
* @since 4.2.1
* @since 4.3.4 Removed deleted_at condition
*/
public function get_campaign_by_parent_id( $id = 0 ) {
global $wpdb;
if ( empty( $id ) ) {
return array();
}
$where = $wpdb->prepare( "parent_id = %d AND status = %d AND ( deleted_at IS NULL OR deleted_at = '0000-00-00 00:00:00' )", $id, self::STATUS_ACTIVE );
$campaigns = $this->get_by_conditions( $where );
return $campaigns;
}
/**
* Get Active Campaigns
*
* @return array|object|null
*
* @since 4.2.0
* @since 4.3.4 Removed deleted_at condition
*/
public function get_active_campaigns( $type = '' ) {
global $wpdb;
if ( empty( $type ) ) {
$where = $wpdb->prepare( "status = %d AND (deleted_at IS NULL OR deleted_at = '0000-00-00 00:00:00')", self::STATUS_ACTIVE );
} else {
$where = $wpdb->prepare( "status = %d AND type = %s AND (deleted_at IS NULL OR deleted_at = '0000-00-00 00:00:00')", self::STATUS_ACTIVE, $type );
}
return $this->get_by_conditions( $where );
}
/**
* Update meta value
*
* @param int $campaign_id
* @param array $meta_data
*
* @return bool|false|int
*
* @sine 4.2.0
*/
public function update_campaign_meta( $campaign_id = 0, $meta_data = array() ) {
$update = false;
if ( ! empty( $campaign_id ) && ! empty( $meta_data ) ) {
$campaign = $this->get_campaign_by_id( $campaign_id );
if ( ! empty( $campaign ) ) {
if ( isset( $campaign['meta'] ) ) {
$meta = maybe_unserialize( $campaign['meta'] );
foreach ( $meta_data as $meta_key => $meta_value ) {
$meta[ $meta_key ] = $meta_value;
}
$campaign['meta'] = maybe_serialize( $meta );
$update = $this->save_campaign( $campaign, $campaign_id );
}
}
}
return $update;
}
/**
* Delete Campaigns
*
* @param $ids
*
* @since 4.3.4
*/
public function delete_campaigns( $ids = array() ) {
if ( ! is_array( $ids ) ) {
$ids = array( absint( $ids ) );
}
if ( is_array( $ids ) && count( $ids ) > 0 ) {
foreach ( $ids as $id ) {
$this->delete( absint( $id ) );
/**
* Take necessary cleanup steps using this hook
*
* @since 4.3.4
*/
do_action( 'ig_es_campaign_deleted', $id );
}
return true;
}
return false;
}
/**
* Get all campaign ids by parent_id
*
* @param int $parent_campaign_id
*
* @return array|string|null
*
* @since 4.3.4
*/
public function get_campaigns_by_parent_id( $parent_campaign_id = 0 ) {
if ( empty( $parent_campaign_id ) || 0 == absint( $parent_campaign_id ) ) {
return array();
}
return $this->get_column_by( 'id', 'parent_id', $parent_campaign_id, false );
}
/**
* Get Post Notifications (Campaigns) based on post_id
*
* @param int $post_id
*
* @return array|object|null
*
* @since 4.3.6
*/
public function get_campaigns_by_post_id( $post_id = 0 ) {
global $wpdb;
$campaigns = array();
if ( $post_id > 0 ) {
$post_type = get_post_type( $post_id );
$where = $wpdb->prepare( "status = %d AND type = %s AND (deleted_at IS NULL OR deleted_at = '0000-00-00 00:00:00')", 1, 'post_notification' );
$new_flow_campaign_ids = get_option( 'ig_es_new_category_format_campaign_ids', array() );
// Run old logic for campaign
if ( empty( $new_flow_campaign_ids ) ) {
if ( 'post' === $post_type ) {
$categories = get_the_category( $post_id );
$total_categories = count( $categories );
if ( $total_categories > 0 ) {
for ( $i = 0; $i < $total_categories; $i ++ ) {
if ( 0 === $i ) {
$where .= ' and (';
} else {
$where .= ' or';
}
$category_str = ES_Common::prepare_category_string( $categories[ $i ]->term_id );
$where .= " categories LIKE '%" . $category_str . "%'";
if ( ( $total_categories - 1 ) === $i ) {
$where .= " OR categories LIKE '%all%'";
$where .= ") AND categories NOT LIKE '%none%'";
}
}
} else {
// no categories fround for post
return $campaigns;
}
} else {
$post_type = ES_Common::prepare_custom_post_type_string( $post_type );
$where .= " and categories LIKE '%" . wp_specialchars_decode( addslashes( $post_type ) ) . "%'";
}
}
$campaigns = $this->get_by_conditions( $where, ARRAY_A );
if ( ! empty( $campaigns ) ) {
$current_post_type = get_post_type( $post_id );
$current_categories = get_the_category( $post_id );
$current_categories_lists = array();
foreach ( $current_categories as $current_category ) {
$current_categories_lists[] = $current_category->term_id;
}
foreach ( $campaigns as $index => $campaign ) {
$campaign_id = $campaign['id'];
$categories = $campaign['categories'];
$is_categories_matching = false;
$categories = explode( '##', trim( trim( $categories, '##' ) ) );
if ( ! empty( $categories ) ) {
foreach ( $categories as $category ) {
if ( ! empty( $category ) ) {
if ( ! empty( $new_flow_campaign_ids ) && in_array( (int) $campaign_id, $new_flow_campaign_ids, true ) ) {
$post_categories = explode( '|', $category );
foreach ( $post_categories as $post_category ) {
list( $post_type, $categories_list ) = explode( ':', $post_category );
if ( $post_type === $current_post_type ) {
if ( 'post' === $current_post_type ) {
if ( 'none' !== $categories_list ) {
if ( 'all' === $categories_list ) {
$is_categories_matching = true;
break;
} else {
$categories_list = array_map( 'absint', explode( ',', $categories_list ) );
$is_categories_matching = count( array_intersect( $categories_list, $current_categories_lists ) ) > 0;
if ( $is_categories_matching ) {
break;
}
}
}
} else {
if ( 'all' === $categories_list ) {
$is_categories_matching = true;
break;
} else {
$term_ids = array_map( 'absint', explode( ',', $categories_list ) );
$taxonomies = get_object_taxonomies( $post_type, 'objects' );
if ( ! empty( $taxonomies ) ) {
$taxonomies_slug = array_keys( $taxonomies );
$post_term_ids = array();
foreach ( $taxonomies_slug as $taxonomy_slug ) {
$post_terms = get_the_terms( $post_id, $taxonomy_slug );
if ( ! $post_terms ) {
continue;
}
$taxonomy_term_ids = wp_list_pluck( $post_terms, 'term_id' );
$post_term_ids = array_merge( $post_term_ids, $taxonomy_term_ids );
}
$is_categories_matching = count( array_intersect( $term_ids, $post_term_ids ) ) > 0;
if ( $is_categories_matching ) {
break;
}
}
}
}
}
}
} else {
if ( 'post' === $current_post_type ) {
if ( is_numeric( $category ) && in_array( ( int ) $category, $current_categories_lists, true ) ) {
$is_categories_matching = true;
break;
} elseif ( '{a}All{a}' === $category ) {
$is_categories_matching = true;
break;
}
} elseif ( '{T}' . $current_post_type . '{T}' === $category ) {
$is_categories_matching = true;
break;
}
}
}
}
}
if ( ! $is_categories_matching ) {
unset( $campaigns[ $index ] );
}
}
}
$campaigns = apply_filters( 'ig_es_campaigns_for_post', $campaigns, $post_id );
}
return $campaigns;
}
/**
* Method to update campaign status
*
* @param array $campaign_ids Campaign IDs.
* @param integer $status New status.
*
* @return bool $updated Update status
*
* @since 4.4.4
*/
public function update_status( $campaign_ids = array(), $status = 0 ) {
global $wpbd;
$updated = false;
if ( empty( $campaign_ids ) ) {
return $updated;
}
$id_str = '';
$campaign_ids = esc_sql( $campaign_ids );
if ( is_array( $campaign_ids ) && count( $campaign_ids ) > 0 ) {
$id_str = implode( ',', $campaign_ids );
} elseif ( is_numeric( $campaign_ids ) ) {
$id_str = $campaign_ids;
}
if ( ! empty( $id_str ) ) {
$query = $wpbd->prepare( "UPDATE {$wpbd->prefix}ig_campaigns SET status = %d WHERE id IN({$id_str})", $status );
$updated = $wpbd->query( $wpbd->prepare( "UPDATE {$wpbd->prefix}ig_campaigns SET status = %d WHERE id IN({$id_str})", $status ) );
// Changing status of child campaigns along with its parent campaign id
$wpbd->query( $wpbd->prepare( "UPDATE {$wpbd->prefix}ig_campaigns SET status = %d WHERE parent_id IN({$id_str})", $status ) );
}
if ( $updated ) {
do_action( 'ig_es_after_campaign_status_updated', $campaign_ids, $status );
}
return $updated;
}
/**
* Duplicate Campaign
*
* @param $id
*
* @since 4.6.3
*
* @modify 5.4.9
*/
public function duplicate_campaign( $id = null ) {
if ( ! empty( $id ) ) {
$campaign = $this->get( $id );
$campaign['status'] = IG_ES_CAMPAIGN_STATUS_IN_ACTIVE;
$campaign['name'] = __( 'Copy', 'email-subscribers' ) . ' - ' . $campaign['name'];
if ( 'newsletter' === $campaign['type'] ) {
$campaign['subject'] = __( 'Copy', 'email-subscribers' ) . ' - ' . $campaign['subject'];
}
$campaign_id = $campaign['id'];
unset( $campaign['id'] );
unset( $campaign['created_at'] );
$campaign_meta = maybe_unserialize( $campaign['meta'] );
unset( $campaign_meta['date'], $campaign_meta['es_schedule_date'], $campaign_meta['es_schedule_time'] );
$campaign['meta'] = maybe_serialize( $campaign_meta );
$duplicate_campaign_id = $this->save_campaign( $campaign );
if ( 'sequence' === $campaign['type'] ) {
$sequence_campaigns = $this->get_campaign_by_parent_id( $campaign_id );
foreach ( $sequence_campaigns as $index => $child_campaign ) {
$child_campaign['parent_id'] = $duplicate_campaign_id;
unset( $child_campaign['id'] );
unset( $child_campaign['created_at'] );
$this->save_campaign( $child_campaign );
}
}
return $duplicate_campaign_id;
}
return false;
}
/**
* Get all campaigns based on passed arguements
*
* @param array $args Campaing arguements
*
* @return array Array of campaigns
*
* @since 4.6.11
*/
public function get_campaigns( $args = array() ) {
global $wpbd;
$where = '';
$conditions = array(
'include_types' => 'type IN',
'exclude_types' => 'type NOT IN',
'status' => 'status IN',
'campaigns_in' => 'id IN',
'campaigns_not_in' => 'id NOT IN',
);
foreach ( $conditions as $arg_key => $sql_operator ) {
if ( ! empty( $args[ $arg_key ] ) ) {
$count = count( $args[ $arg_key ] );
$placeholders = array_fill( 0, $count, '%s' );
$where .= ( empty( $where ) ? ' ' : ' AND ' ) . $wpbd->prepare( "{$sql_operator} ( " . implode( ',', $placeholders ) . ' )', $args[ $arg_key ] );
}
}
$output = ! empty( $args['output'] ) ? $args['output'] : ARRAY_A;
$use_cache = false;
$order_by_column = ! empty( $args['order_by_column'] ) ? $args['order_by_column'] : '';
$order = ! empty( $args['order'] ) ? $args['order'] : '';
if (! empty( $args['is_campaigns_listing'] )) {
$order .= ' LIMIT ' . $args['offset'] . ', ' . $args['per_page'];
}
return $this->get_by_conditions( $where, $output, $use_cache, $order_by_column, $order );
}
/**
* Get selected lists ids in the campaign
*
* @param int $campaign_id
*
* @return array $list_ids
*
* @since 4.7.6
*/
public function get_list_ids( $campaign_id ) {
$list_ids = array();
// If $campaign_id is numeric, then fetch the campaign data based on campaign_id else $campaign_id is campaign data.
if ( is_numeric( $campaign_id ) ) {
$campaign = $this->get( $campaign_id );
} else {
$campaign = $campaign_id;
}
if ( ! empty( $campaign ) ) {
// Check list ids column since prior to campaign rules features, list ids were being stored in list_ids column.
if ( ! empty( $campaign['list_ids'] ) ) {
$list_ids = explode( ',', $campaign['list_ids'] );
}
$campaign_meta = maybe_unserialize( $campaign['meta'] );
$conditions = isset( $campaign_meta['list_conditions'] ) ? $campaign_meta['list_conditions'] : array();
if ( ! empty( $conditions ) ) {
foreach ( $conditions as $i => $condition_group ) {
if ( ! empty( $condition_group ) ) {
foreach ( $condition_group as $j => $condition ) {
$condition_field = isset( $condition['field'] ) ? $condition['field'] : '';
if ( '_lists__in' === $condition_field ) {
if ( ! empty( $condition['value'] ) ) {
if ( is_array( $condition['value'] ) ) {
$list_ids = array_merge( $list_ids, $condition['value'] );
} else {
$list_ids = array( $condition['value'] );
}
}
}
}
}
}
}
}
return $list_ids;
}
/**
* Get total post_digests count
*
* @return string|null
*
* @since
*/
public function get_total_post_digests() {
return $this->get_total_campaigns_by_type( 'post_digest' );
}
/**
* Get count of editor type used from campaign meta
*
* @return array editor type count
*
* @since 5.5.7
*/
public function get_count_by_editor_type() {
$campaign_editor_count = array(
'classic' => 0,
'dnd' => 0,
);
$campaign_types = array(
'include_types' => array( 'newsletter','post_notification','post_digest'),
);
$campaigns = self::get_campaigns($campaign_types);
if ( count($campaigns) > 0 ) {
foreach ($campaigns as $campaign) {
$campaign_meta = ( !empty( $campaign['meta'] ) ) ? maybe_unserialize($campaign['meta']) : null;
if ( !empty( $campaign_meta ) ) {
$editor_type = ! empty( $campaign_meta['editor_type'] ) ? $campaign_meta['editor_type'] : IG_ES_CLASSIC_EDITOR;
if ( IG_ES_DRAG_AND_DROP_EDITOR === $editor_type ) {
$campaign_editor_count['dnd']++;
} else {
$campaign_editor_count['classic']++;
}
}
}
}
return $campaign_editor_count;
}
}